【STM32】HAL库-电源控制(低功耗模式)
電源框圖
STM32 的電源系統主要分為備份域電路、內核電路以及 ADC 電路三部分
-
備份域電路
STM32 的 LSE 振蕩器、RTC、備份寄存器及備份 SRAM 這些器件被包含進備份域電路中,這部分的電路可以通過 STM32 的 VBAT 引腳獲取供電電源,在實際應用中一般會使用 3V 的鈕扣電池對該引腳供電。
當 VDD 主電源存在時,由于 VDD 電壓較高,備份域電路通過 VDD 供電,當 VDD 掉電時,備份域電路由鈕扣電池通過 VBAT 供電,保證電路能持續運行,從而可利用它保留關鍵數據。 -
調壓器供電電路(1.2V域)
在 STM32 的電源系統中調壓器供電的電路是最主要的部分,調壓器為除了備份域及待機電路以外的所有數字電路供電,其中包括內核、數字外設、時鐘以及 RAM
調壓器可以運行在“運行模式”、“停止模式”以及“待機模式”。
在運行模式下,1.2V域全功率運行;
在停止模式下 1.2V 域運行在低功耗狀態,1.2V 區域的所有時鐘都被關閉,相應的外設都停止了工作,但它會保留內核寄存器以及 SRAM 的內容;
在待機模式下,整個 1.2V 域都斷電,該區域的內核寄存器及 SRAM 內容都會丟失 (備份區域的寄存器及 SRAM 不受影響)。 -
ADC 電源及參考電壓
為了提高轉換精度,STM32 的 ADC 配有獨立的電源接口,方便進行單獨的濾波。ADC的工作電源使用 VDDA 引腳輸入,使用 VSSA 作為獨立的地連接,VREF 引腳則為ADC 提供測量使用的參考電壓。
電池備份區域
當VDD斷電時,可以保存備份寄存器的內容和維持RTC的功能。
VBAT為RTC、LSE(低速外部時鐘)振蕩器、備份寄存器和PC13至PC15供電。
當備份區域由VDD(內部模擬開關連到VDD)供電時,下述功能可用:
- PC14和PC15可以用于GPIO或LSE引腳
- PC13可以作為通用I/O口、TAMPER引腳、RTC校準時鐘、RTC鬧鐘或秒輸出
當后備區域由VBAT供電時(VDD消失后模擬開關連到VBAT),可以使用下述功能:
- PC14和PC15只能用于LSE引腳
- PC13可以作為TAMPER引腳、RTC鬧鐘或秒輸出
STM32低功耗模式
STM32有三種低功耗模式,分別為:
- 睡眠模式
- 停止模式
- 待機模式
上面介紹的電壓調節器也有三種模式,也是運轉(正常),停止,待機模式。
電源控制/狀態寄存器(PWR_CSR) 從待機模式喚醒時不被清除
停止模式下,對VDD供電區域的影響僅有HSI和HSE的振蕩器關閉,當從停止模式喚醒后,需要重新配置時鐘(默認是HSI)。對片外外設寄存器沒影響。
系統滴答定時器的中斷也會在睡眠/停止模式下喚醒單片機。故需要在進入睡眠/停止模式前失能系統滴答定時器。
STM32在正常模式下,可通過以下措施來降低功耗。
-
通過對預分頻寄存器進行編程,可以降低任意一個系統時鐘(SYSCLK、HCLK、PCLK1、PCLK2)的速度。
-
可以利用預分頻器來降低外設的時鐘。
-
任何時候都可以通過停止為外設和內存提供時鐘(HCLK和PCLKx)來減少功耗。
睡眠模式
在睡眠模式中,僅關閉了內核時鐘,內核停止運行,但其片上外設,核心的外設全都還照常運行,在軟件上表現為不再執行新的代碼。這個狀態會保留睡眠前的內核寄存器、內存的數據。喚醒后 ,若由中斷喚醒,先進入中斷,退出中斷服務程序后,接著執行 WFI指令后的程序;若由事件喚醒,直接接著執行 WFE 后的程序。喚醒延遲:無延遲。(WFI:Wait For Interrupt,WFE:Wait For Event)
在睡眠模式下,所有的I/O引腳都保持它們在運行模式時的狀態
SRAM和寄存器內容被保留下來
進入睡眠模式
通過執行WFI或WFE指令進入睡眠狀態。
在執行WFI或WFE指令進入睡眠狀態前,有兩種選項可用于選擇睡眠模式進入機制:
- SLEEP-NOW:如果SLEEPONEXIT位被清除,當WFI或WFE被執行時,微控制器立即進入睡眠模式
- SLEEP-ON-EXIT:如果SLEEPONEXIT位被置位,系統從最低優先級的中斷處理程序中退出時,微控制器就立即進入睡眠模式(這樣一來,處理器的所有工作就只是響應中斷了,其它時間都在睡眠)
進入睡眠模式前,記得把系統滴答定時器關閉。
退出睡眠模式
- 如果執行WFI指令進入睡眠模式,任意一個被嵌套向量中斷控制器響應的外設中斷都能將系統從睡眠模式喚醒,喚醒后先進入中斷,退出中斷服務程序后,接著執行 WFI指令后的程序
- 如果執行WFE指令進入睡眠模式,則一旦發生喚醒事件時,微處理器將從睡眠模式退出,喚醒后直接接著執行 WFE 后的程序
喚醒事件由以下方式產生:
- 在外設控制寄存器中使能一個中斷,而不是在NVIC(嵌套向量中斷控制器)中使能,并且在系統控制寄存器中使能SEVONPEND位。當MCU從WFE中喚醒后,外設的中斷掛起位和外設的NVIC中斷通道掛起位(在NVIC中斷清除掛起寄存器中)必須被清除
- 配置一個外部或內部的EXIT線為事件模式。當MCU從WFE中喚醒后,因為與事件線對應的掛起位未被設置,不必清除外設的中斷掛起位或外設的NVIC中斷通道掛起位
睡眠模式-外部中斷喚醒demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
開啟外部中斷1,用外部中斷1來喚醒STM32,WFI指令進入睡眠狀態,選擇SLEEP-NOW微控制器立即進入睡眠模式。
PC13控制LED燈,LED的亮滅用來指示程序是否在運行
外部中斷函數為空,什么也不做
STM32CubeMX配置
外部中斷線1為產生中斷,下降沿觸發。
主要代碼如下:
在睡眠模式下,如果開啟了系統滴答定時器,記得關閉系統滴答定時器,因為系統滴答定時器的中斷也會喚醒CPU。
工程文件下載鏈接
睡眠模式-外部中斷喚醒-僅響應中斷demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
開啟外部中斷1,用外部中斷1來喚醒STM32,WFI指令進入睡眠狀態,選擇SLEEP-ON-EXIT系統從最低優先級的中斷處理程序中退出時,微控制器就立即進入睡眠模式
PC13控制LED燈,在外部中斷函數中翻轉LED。
STM32CubeMX配置
與睡眠模式-外部中斷喚醒demo一致
主要代碼如下:
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(1000);//延時1000毫秒if(times > 4){PCout(13) = !PCin(13);//LED翻轉,指示即將進入睡眠模式//HAL_SuspendTick();//停止系統滴答計時器CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//失能系統滴答定時器HAL_PWR_EnableSleepOnExit();//開啟僅響應中斷,最低優先級中斷服務函數結束之后單片機又進入睡眠模式HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFI);//WFI指令進入睡眠模式times = 0;SET_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//使能系統滴答定時器//HAL_ResumeTick();//恢復系統滴答計時器}times++;//循環次數加一}外部中斷服務函數代碼:
/*** @brief EXTI line detection callbacks.* @param GPIO_Pin: Specifies the pins connected EXTI line* @retval None*/ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {/* 采用位帶操作實現LED翻轉 */PCout(13) = !PCin(13); }工程文件下載鏈接
睡眠模式-外部事件喚醒demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
配置一個外部EXIT1線為事件模式來喚醒STM32,WFE指令進入睡眠狀態,選擇SLEEP-NOW微控制器立即進入睡眠模式。
PC13控制LED燈,LED的亮滅用來指示程序是否在運行
注意:未開啟外部中斷(NVIC寄存器中為使能外部中斷)
STM32CubeMX配置
主要代碼
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(1000);//延時1000毫秒/* 采用位帶操作實現LED翻轉 */PCout(13) = !PCin(13);if(times > 4){//HAL_SuspendTick();//停止系統滴答計時器CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//失能系統滴答定時器HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFE);//WFE指令進入睡眠模式times = 0;SET_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//使能系統滴答定時器//HAL_ResumeTick();//恢復系統滴答計時器}times++;//循環次數加一}工程文件下載鏈接
停止模式
在停止模式中,進一步關閉了其它所有的時鐘,于是所有的外設都停止了工作,但由于其 1.2V 區域的部分電源沒有關閉,還保留了內核的寄存器、內存的信息,所以從停止模式喚醒,并重新開啟時鐘后,還可以從上次停止處繼續執行代碼。喚醒后,若由中斷喚醒,先進入中斷,退出中斷服務程序后,接著執行 WFI指令后的程序;若由事件喚醒,直接接著執行 WFE 后的程序。
SRAM和寄存器內容被保留下來
PLL、HSI和HSE RC振蕩器的功能被禁止
所有的I/O引腳都保持它們在運行模式時的狀態
系統時鐘:停止模式喚醒后,STM32會使用 HSI(f1的HSI為8M,f4為12M)作為系統時鐘。所以,有必要在喚醒以后,在程序上重新配置系統時鐘,將時鐘切換回HSE。
喚醒延遲 :基礎延遲為 HSI振蕩器的啟動時間,若調壓器工作在低功耗模式,還需要加上調壓器從低功耗切換至正常模式下的時間,若 FLASH 工作在掉電模式,還需要加上 FLASH 從掉電模式喚醒的時間。
進入/退出停止模式
在停止模式下,通過設置電源控制寄存器(PWR_CR)的LPDS位使內部調節器進入低功耗模式,能夠降低更多的功耗
如果正在進行閃存編程,直到對內存訪問完成,系統才進入停止模式
如果正在進行對APB的訪問,直到對APB訪問完成,系統才進入停止模式。
在停止模式下,如果在進入該模式前ADC和DAC沒有被關閉,那么這些外設仍然消耗電流。通過設置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位為0可關閉這2個外設。
進入停止模式前,記得把系統滴答定時器關閉。
執行WFE進入的喚醒事件如下:
從停止模式中喚醒后,需要重新配置時鐘。對片外外設寄存器沒有影響。
停止模式-外部中斷喚醒-電壓調節器為低功耗模式demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
開啟外部中斷線1 并連接PA1,下降沿觸發,上拉輸入;在NVIC中使能外部中斷1,設置優先級。
WFI指令進入停止模式狀態。
STM32CubeMX配置
主要代碼
工程文件下載鏈接
停止模式-外部事件喚醒-電壓調節器為低功耗模式demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
開啟外部事件線1 并連接PA1,下降沿觸發,上拉輸入;未在NVIC中使能外部中斷1,設置優先級。
WFE指令進入停止模式狀態。
STM32CubeMX配置
主要代碼
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(1000);//延時1000毫秒/* 采用位帶操作實現LED翻轉 */PCout(13) = !PCin(13);if(times > 4){HAL_SuspendTick();//停止系統滴答計時器//CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//失能系統滴答定時器HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);//電壓調節器為低功耗模式,WFE指令進入停止模式SystemClock_Config();//重新配置系統時鐘times = 0;//SET_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//使能系統滴答定時器HAL_ResumeTick();//恢復系統滴答計時器}times++;//循環次數加一}工程文件下載鏈接
待機模式
待機模式可實現系統的最低功耗。該模式是在Cortex-M3深睡眠模式時關閉電壓調節器。整個1.8V供電區域被斷電。PLL、HSI和HSE振蕩器也被斷電。SRAM和寄存器內容丟失。只有備份的寄存器和待機電路維持供電。也就是說,從待機模式喚醒后,由于沒有之前代碼的運行記錄,只能對芯片復位,重新檢測 boot條件,從頭開始執行程序。
從待機喚醒后,除了電源控制/狀態寄存器(PWR_CSR),所有寄存器被復位
在待機模式下,所有的I/O引腳處于高阻態,除了以下的引腳
- 復位引腳(始終有效)
- 當被設置為防侵入或校準輸出時的TAMPER引腳
- 被使能的喚醒引腳(PA0)
進入/退出待機模式
待機模式-WKUP喚醒demo
采用STM32F103C8T6單片機,KeilMDK5.32版本
PA0用于喚醒單片機,下拉輸入,上升沿觸發。
STM32CubeMX配置
設置PA0為WKUP引腳
注:經過實驗,在STM32CubeMX中配置PA0為WKUP沒有起作用,還是得手動配置PA0。
通過置位電源控制/狀態寄存器(PWR_CSR) 的第8位來設置PA0為WKUP
HAL庫代碼如下
查詢最新英文官方文檔(2021-02-23)鏈接
主要代碼
/*** @brief The application entry point.* @retval int*/ int main(void) {/* USER CODE BEGIN 1 */uint8_t times = 0;//循環次數/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//強制使能WKUP(PA0)引腳SET_BIT(PWR->CR, PWR_CR_CWUF_Msk);//寫1清除該位 喚醒位SET_BIT(PWR->CR, PWR_CR_CSBF_Msk);//寫1清除該位 待機位/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(1000);//延時1000毫秒/* 采用位帶操作實現LED翻轉 */PCout(13) = !PCin(13);if(times > 4){SET_BIT(PWR->CR, PWR_CR_CWUF_Msk);//寫1清除該位 喚醒位 如果不清楚此位 系統將保持喚醒狀態HAL_PWR_EnterSTANDBYMode();//進入待機模式/* 待機模式喚醒后 等同于單片機復位 */}times++;//循環次數加一}/* USER CODE END 3 */ }其中待機位和喚醒位需要清除。喚醒位不清除系統將保持在喚醒狀態,即使PA0處于未觸發狀態。
通過電源控制寄存器(PWR_CR)的第2第3位寫1清除。
HAL庫清除待機位,喚醒位
工程文件下載鏈接
總結
以上是生活随笔為你收集整理的【STM32】HAL库-电源控制(低功耗模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CGAL_网格】Surface_mes
- 下一篇: 《数据密集型应用系统设计》读书笔记——数