stm32退出停止模式出現(xiàn)死機(jī)現(xiàn)象分析
根據(jù)《STM32中文參考手冊》描述,STM32的低功耗模式有三種:睡眠模式,停止模式,待機(jī)模式。(有些資料說其實只有兩種模式,不存在睡眠模式一說)。其中待機(jī)模式可實現(xiàn)系統(tǒng)的最低功耗,所以本來想采用該模式。但是《STM32中文參考手冊》提到從待機(jī)模式喚醒后的代碼執(zhí)行等同于復(fù)位后的執(zhí)行(采樣啟動模式引腳、讀取復(fù)位向量等),板子接了屏,再快再快也需要時間去加載界面,所以速度還是慢了。之后采用嘗試采用停止模式,圖1為停止模式的進(jìn)入和退出方法。
圖1
根據(jù)手冊和開發(fā)板給的源碼,直接實現(xiàn)停止模式,但是發(fā)現(xiàn)退出時就發(fā)生死機(jī)現(xiàn)象,并沒有進(jìn)入恢復(fù)正常,只執(zhí)行了中斷函數(shù)中一個或者兩個語句(是隨機(jī)的)。
看例程,度娘等走了一圈,表現(xiàn)出來的原因應(yīng)該是這樣的,由于THUMB指令不支持匯編內(nèi)聯(lián),所以采用如下方法實現(xiàn)執(zhí)行匯編指令WFI,創(chuàng)建了一個WFI_SET()函數(shù),其函數(shù)原型:
__asm void WFI_SET(void)
{
WFI;
}
表現(xiàn)出來的原因是:被Sys_Sleep()函數(shù)調(diào)用的時候,并沒有在編譯時把WFI_SET()的內(nèi)容inline到Sys_Sleep()函數(shù)里面去,而是一個普通的函數(shù)在運(yùn)行時被調(diào)用,出現(xiàn)了死機(jī)現(xiàn)象。后來將WFI_SET()函數(shù)修改為:
__asm void __inline WFI_SET(void)
{
WFI;
}
問題解決。
但根本原因是不是跳出WFI_SET()函數(shù)出的錯,還是其他原因,后續(xù)進(jìn)一步確認(rèn)。