天天看點

STM32的低功耗模式

一 待機模式standby和STOP模式的差別:

進入低功耗模式:都一樣,都是先關閉相應時鐘,關閉相應外設,配置相應所有IO口(浮動輸入),然後配置相應的喚醒中斷源,中斷影響的O口,然後調用相應函數進入低功耗模式

進入低功耗模式函數:打開電源管理時鐘,使能喚醒引腳,PWR_EnterSTANDBYMode();//進入待機

                                  //PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI|PWR_STOPEntry_WFE);//進入停機

喚醒中斷:清除所有中斷标志(IO口中斷标志,外設中斷标志,系統喚醒标志),此時有所差別:STOP模式需要重新配置系統時鐘和子產品初始化。

退出中斷後:STOP後從中斷處開始執行,各種狀态儲存;但standby這是系統複位。

二序列槽喚醒中斷:

2.1RX外中斷法:進入standby模式前先将RX配置成中斷輸入,然後進入低功耗模式,喚醒中斷中将RX配置成序列槽接收狀态,配置序列槽然後手動設定接收中斷标志,退出喚醒中斷後立馬進入中斷接收。缺點:會丢失部分位元組,是以适合對丢失部分位元組不是很敏感的場合。解決辦法:多添加序列槽協定幀的引導位元組

在接收中斷中對開頭引導做相容處理。

2.2 其它的序列槽喚醒方法

現象:第一次從stop模式喚醒時序列槽能正常通信,判斷一段時間後無資料則再一次進入stop mode,然後再一次喚醒,此時序列槽無法輸出。

最後發現原因是序列槽重新初始化時HAL_UART_Init()函數中會判斷if(huart->State == HAL_UART_STATE_RESET),此時才會執行HAL_UART_MspInit(huart),配置序列槽IO口。

解決辦法:每次将UART_HandleTypeDef結構體中的State成員初始化為HAL_UART_STATE_RESET。或者再次初始化之前調用HAL_UART_DeInit()。

三Wakeup引腳的系統中斷:專用的系統喚醒引腳設定成上升沿中斷。

四RTC鬧鈴中斷: