整理:MilerShao
某天某工程師說(shuō),在用STM32F151開發(fā)產(chǎn)品工程中遇到一奇怪現(xiàn)象。
他啟用了RTC中的喚醒定時(shí)器,定期喚醒休眠的MCU. 他發(fā)現(xiàn)在休眠中途(即未到達(dá)醒來(lái)時(shí)刻)給外部復(fù)位腳一個(gè)復(fù)位信號(hào),STM32L151重跑程序并再次配置喚醒定時(shí)器后入眠,但之后休眠喚醒的時(shí)間依然會(huì)緊跟著上一次的設(shè)置和計(jì)時(shí)時(shí)間。
例如:假設(shè)MCU上電后的定時(shí)喚醒間隔設(shè)置為30分鐘。在進(jìn)入休眠到了20分鐘時(shí),給MCU復(fù)位腳一個(gè)復(fù)位信號(hào),強(qiáng)令其醒
來(lái)重新跑程序,而且程序里執(zhí)行了30分鐘喚醒配置后才入眠,可結(jié)果只跑了10分鐘后,MCU就被喚醒了。雖然中途MCU被復(fù)位
過(guò)一次,再休眠后,喚醒時(shí)間還是緊接著上次來(lái)的,按理說(shuō)復(fù)位過(guò)一次又重新設(shè)置了,后面應(yīng)該是30分鐘后才醒,怎么10分鐘就醒呢?

從現(xiàn)象描述來(lái)看,喚醒定時(shí)器啟動(dòng)后,雖然經(jīng)歷中途的系統(tǒng)復(fù)位,其計(jì)時(shí)喚醒參數(shù)以及計(jì)數(shù)器并未受到影響。盡管系
統(tǒng)復(fù)位、低功耗模式【SLEEP/STOP/STANDBY】不會(huì)影響喚醒計(jì)數(shù)器的工作,但中途復(fù)位后,該工程師陳述有做重新配置
相關(guān)時(shí)間參數(shù)的動(dòng)作,按理說(shuō),中途配置后的喚醒時(shí)間應(yīng)該是30分鐘而不是10分鐘。難道他在中途復(fù)位后運(yùn)行的相關(guān)配
置參數(shù)沒(méi)有生效?
查看手冊(cè),配置喚醒定時(shí)器按如下幾步操作:

查看其wake up timer相關(guān)配置代碼,代碼里并沒(méi)有發(fā)現(xiàn)上面3步中的第1步。配置喚醒定時(shí)器必須保證RTC_CR寄存器
中的WUTE為0才可以進(jìn)行。他雖然沒(méi)寫這句代碼,幸運(yùn)的是MCU每次上電復(fù)位后,該位默認(rèn)值就是0,所以上電復(fù)位后配
置喚醒定時(shí)器即使不寫一句令WUTE為0的代碼,配置依然暢通有效。
但如果你上電配置過(guò)后,即使系統(tǒng)復(fù)位重新運(yùn)行程序再來(lái)配置喚醒定時(shí)器,就沒(méi)那么好運(yùn)了。因?yàn)榇藭r(shí)的WUTE位在
上電復(fù)位后的第一次配置的過(guò)程中已經(jīng)置1了,而且 RTC寄存器的內(nèi)容又不受系統(tǒng)復(fù)位【哪些是屬于系統(tǒng)復(fù)位,詳看手冊(cè)】
影響。所以,后面要想修改調(diào)整配置參數(shù),就得手動(dòng)先讓WUTE清零,否則,出現(xiàn)上面反映的情況就不難理解了。
| 歡迎光臨 (http://www.denmoz.com/bbs/) | Powered by Discuz! X3.1 |