ST自带的 RTC-Calendar 例程中,当系统由 Vdd 正常供电并且 RTC 计数到 0x00015180 (对应 23:59:59)时,重新设置 RTC 计数起始值为 0 ,同时时间变为 00:00:00 。(在中断中实现)原中断程序如下:
********************************************************************/ void RTC_IRQHandler(void) { if (RTC_GetITStatus(RTC_IT_SEC) != RESET) { /* Clear the RTC Second interrupt */ RTC_ClearITPendingBit(RTC_IT_SEC);
/* Toggle GPIOB pin 15 each 1s */ GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_15)));
/* Enable time update */ TimeDisplay = 1;
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* Reset RTC Counter when Time is 23:59:59 */ if (RTC_GetCounter() == 0x00015180) { RTC_SetCounter(0x0); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } } } 但是在由电池供电时,是没有中断的,这将可能导致计数器值大于 0x00015180 ,比方说到了0x00030360,此时系统再工作时显示的就将是 48:00:00,而不是 00:00:00。于是我把中断程序改了一下,系统工作第一次进中断时读取 RTC 计数器值并判断,如果大于 0x00015180,就做相应调整,重新设置 RTC 计数器值。程序如下。但是这样修改之后,程序反倒不能正常 运行了。在 IAR 下调试时,第一次下载进去,执行完 NVIC_Configuration(配置RTC中断)之后就会莫名的跳到 RTC_WaitForLastTask(),而且过不去。但是把程序下载到芯片是可以运行的。设置时间为 23:59:50(便于观测),然后断电(电池供电),等待10多秒后,重新上电,这次只显示
External Reset occurred.... No need to configure RTC.... 但时间却显示不出来了,调试发现又卡在了中断里 if 语句中的 RTC_WaitForLastTask 上。程序也就只多了一个判断和算术运算,却出不来结果了。不知何故,请教大家。
********************************************************************/ void RTC_IRQHandler(void) { if (RTC_GetITStatus(RTC_IT_SEC) != RESET) { /* Clear the RTC Second interrupt */ RTC_ClearITPendingBit(RTC_IT_SEC);
/* Toggle GPIOB pin 15 each 1s */ GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_15)));
/* Enable time update */ TimeDisplay = 1;
/* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); tmp = RTC_GetCounter(); /* Reset RTC Counter when Time is 23:59:59 */ if (tmp >= 0x00015180) { RTC_SetCounter(tmp - tmp / 0x00015180 * 0x00015180); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); } } } |