整理:MilerShao
某天某工程师说,在用STM32F151开发产品工程中遇到一奇怪现象。
他启用了RTC中的唤醒定时器,定期唤醒休眠的MCU. 他发现在休眠中途(即未到达醒来时刻)给外部复位脚一个复位信号,STM32L151重跑程序并再次配置唤醒定时器后入眠,但之后休眠唤醒的时间依然会紧跟着上一次的设置和计时时间。
例如:假设MCU上电后的定时唤醒间隔设置为30分钟。在进入休眠到了20分钟时,给MCU复位脚一个复位信号,强令其醒
来重新跑程序,而且程序里执行了30分钟唤醒配置后才入眠,可结果只跑了10分钟后,MCU就被唤醒了。虽然中途MCU被复位
过一次,再休眠后,唤醒时间还是紧接着上次来的,按理说复位过一次又重新设置了,后面应该是30分钟后才醒,怎么10分钟就醒呢?

从现象描述来看,唤醒定时器启动后,虽然经历中途的系统复位,其计时唤醒参数以及计数器并未受到影响。尽管系
统复位、低功耗模式【SLEEP/STOP/STANDBY】不会影响唤醒计数器的工作,但中途复位后,该工程师陈述有做重新配置
相关时间参数的动作,按理说,中途配置后的唤醒时间应该是30分钟而不是10分钟。难道他在中途复位后运行的相关配
置参数没有生效?
查看手册,配置唤醒定时器按如下几步操作:

查看其wake up timer相关配置代码,代码里并没有发现上面3步中的第1步。配置唤醒定时器必须保证RTC_CR寄存器
中的WUTE为0才可以进行。他虽然没写这句代码,幸运的是MCU每次上电复位后,该位默认值就是0,所以上电复位后配
置唤醒定时器即使不写一句令WUTE为0的代码,配置依然畅通有效。
但如果你上电配置过后,即使系统复位重新运行程序再来配置唤醒定时器,就没那么好运了。因为此时的WUTE位在
上电复位后的第一次配置的过程中已经置1了,而且 RTC寄存器的内容又不受系统复位【哪些是属于系统复位,详看手册】
影响。所以,后面要想修改调整配置参数,就得手动先让WUTE清零,否则,出现上面反映的情况就不难理解了。