发现是由于RTC配置的问题。
在RTC初始化程序中,我们一般要查看BKP寄存器中的数据,判断后备电源是否掉电过。如果掉电过,则初始化。没有则不执行。
但要设置时钟的话,必需允许PWR和BKP时钟,并允许读取BKP。而如果仅电源掉电而后备电池不掉电的话,PWR和BKP时钟是没有开放的。这样就等不到RTC指令执行完成的标志,停在那了。
解决方法就是在RTC初始化中判断判断掉电标志位的else分支中加入
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
即
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
//重新配置RTC
RTC_Configuration();
...
}
else
{
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
...
}