出现的现象是上电初始化时配置RTC没有错误,程序顺利通过,但是在程序运行过程中校正时间,更新RTC_CNTx的值,程序就会停在RTC_WaitForLastTask()进行死循环。
问题的原因就在于,每次操作RTC_CNTx时应该要使能PWR 和 BKP 时钟,允许访问BKP域。
例程中只在第一次上电,并且初始化RTC后才执行了写RTC_CNTx的操作,如下:
1 2 3 4 5 6 7 |
而在校正时间,更新RTC_CNTx时不能直接调用Time_Adjust()函数,需要开启PWR 和 BKP 时钟,且允许访问BKP域
1 2 3 4 5 6 7 8 9 10 11 | /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); /* 修改当前RTC计数寄存器内容 */ RTC_SetCounter(Cnt); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); |
其实如果能仔细看看手册应该不会出现这样的错误。不过幸亏有网络,有前人的经验,我没有话太多时间。