-----致自己:预期感概路难行,不如马上出发简介: LPC54101J512BD64, LPC SDK2.3.0 ,keil V5.06 LPC5410x的RTC 有两个TIMER ,分别支持秒级 和ms级中断唤醒;
这里 我需要系统250ms唤醒一次;
代码如下:
void RtcInit(void)
{
SYSCON->RTCOSCCTRL &= SYSCON_RTCOSCCTRL_EN_MASK;
/* Init RTC */
RTC_Init(RTC);
/* Enable rtc 1khz wakeup for deep power mode */
/* Enable RTC 1KHz clock */
RTC->CTRL |= 0x60;
/* RTC time counter has to be stopped before setting the date & time in the TSR register */
RTC_StopTimer(RTC);
/* Enable RTC alarm interrupt */
RTC_EnableInterrupts(RTC, RTC_CTRL_WAKEDPD_EN_MASK);
/* Enable at the NVIC */
EnableIRQ(RTC_IRQn);
/* Start the RTC time counter */
RTC_StartTimer(RTC);
}
void RTC_SetWakeUpTimer(unsigned int ms)
{
RTC->WAKE = ms;
}
void RTC_IRQHandler(void)
{
if (RTC_GetStatusFlags(RTC) & kRTC_WakeupFlag)
{
/* Clear alarm flag */
RTC_ClearStatusFlags(RTC,kRTC_WakeupFlag);
}
/* 最终服务函数如下 */
void McuDeepSleep(unsigned int i)
{
RTC_SetWakeUpTimer(i);
CLOCK_AttachClk(kIRC12M_to_MAIN_CLK);
EnableDeepSleepIRQ(RTC_IRQn);
SYSCON->STARTERSET[0] |= SYSCON_STARTER_RTC_MASK;
POWER_EnterPowerDown(APP_EXCLUDE_FROM_DEEPSLEEP);
DisableDeepSleepIRQ(RTC_IRQn);
BOARD_BootClockPLL96M();
}
注意1:wake-up timer 计数到0后,需要手动重新加载,也就是每次进入系统休眠需要重新写入wakeup timer的计数值
注意2 :系统进入休眠需要保留RTC数据,所以在使用POWER_EnterPowerDown();需要在入口参数那里保留RTC;也就是:
#define APP_EXCLUDE_FROM_DEEPSLEEP
(SYSCON_PDRUNCFG_PDEN_SRAM0A_MASK | SYSCON_PDRUNCFG_PDEN_SRAM0B_MASK | SYSCON_PDRUNCFG_PDEN_SRAM1_MASK |
SYSCON_PDRUNCFG_PDEN_SRAM2_MASK | SYSCON_PDRUNCFG_PDEN_32K_OSC_MASK)
POWER_EnterPowerDown(APP_EXCLUDE_FROM_DEEPSLEEP);
注意点3: 在RTC_IRQHandler()中,需要清除wakeup 唤醒标志位 kRTC_WakeupFlag;