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