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