NXP

NXP: LPC54101 RTC WAKE-UP TIMER 毫秒级中断唤醒

2019-07-12 11:30发布

-----致自己:预期感概路难行,不如马上出发简介: 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;