整理: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清零,否則,出現上面反映的情況就不難理解了。