PWR(Power Control)電源控制
PWR 負責管理 STM32 內部的電源供電部分,可以實現 可編程電壓監測器 和 低功耗模式 的功能
- 可編程電壓監測器(PVD)可以監控VDD電源電壓,當VDD下降到PVD閥值以下或上升到PVD閥值之上時,PVD會觸發中斷,用于執行緊急關閉任務
- 低功耗模式包括 睡眠模式(Sleep)、停機模式(Stop)和待機模式(Standby),可在系統空閑時,降低STM32的功耗,延長設備使用時間
電壓調節器
復位后調節器總是使能的。根據應用方式它以3種不同的模式工作。
- 運轉模式:調節器以正常功耗模式提供1.8V電源(內核,內存和外設)。
- 停止模式:調節器以低功耗模式提供1.8V電源,以保存寄存器和SRAM的內容。
- 待機模式:調節器停止供電。除了備用電路和備份域外,寄存器和SRAM的內容全部丟失。
?電源框圖
細分三個部分,VDDA供電區域 是負責模擬電路 供電,VDD供電區域 是負責 數字電路 供電。? ? 后備供電區域是備用電源。
可編程電壓監測器(PVD) ?
上電復位(POR)和掉電復位(PDR)
STM32內部有一個完整的上電復位(POR)和掉電復位(PDR)電路,當供電電壓達到2V時系統既能正常工作。當 VDD?/ VDDA?低于指定的限位電壓VPOR/VPDR時,系統保持為復位狀態,而無需外部復位電路。
?上電復位和掉電復位的波形圖
設置PVDE位來使能PVD?
當VDD下降到PVD閥值以下和(或)當VDD上升到PVD閥值之上時,根據外部中斷第16線的上升/下降邊沿觸發設置,就會產生PVD中斷。
PVD的門限
?低功耗模式
有三種低功耗模式:
- 睡眠模式:Cortex?-M3內核停止,所有外設包括Cortex-M3核心的外設,如NVIC、系統時鐘(SysTick)等仍在運行
- 停止模式:所有的時鐘都已停止
- 待機模式:1.8V電源關閉
在運行模式下,可以通過以下方式中的一種降低功耗:
- 降低系統時鐘
- 關閉APB和AHB總線上未被使用的外設時鐘。
?執行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32進入低功耗模式
實際建議能用WFI就使用WFI進入睡眠,WFE進入睡眠,解除有些麻煩?
如果執行WFE指令進入睡眠模式,則一旦發生喚醒事件時,微處理器都將從睡眠模式退出。喚
醒事件可以通過下述方式產生:
- 在外設控制寄存器中使能一個中斷,而不是在NVIC(嵌套向量中斷控制器)中使能,并且在Cortex-M3系統控制寄存器中使能SEVONPEND位。當MCU從WFE中喚醒后,外設的中斷掛起位和外設的NVIC中斷通道掛起位(在NVIC中斷清除掛起寄存器中)必須被清除。
- 配置一個外部或內部的EXIT線為事件模式。當MCU從WFE中喚醒后,因為與事件線對應的掛起位未被設置,不必清除外設的中斷掛起位或外設的NVIC中斷通道掛起位
開啟代碼?
?修改主頻
把此文件只讀變為可寫(在該文件的屬性中修改),然后想改哪個主頻就解除哪個!!!?
睡眠模式
- 執行完WFI/WFE指令后,STM32進入睡眠模式,程序暫停運行,喚醒后程序從暫停的地方繼續運行
- SLEEPONEXIT位決定STM32執行完WFI或WFE后,是立刻進入睡眠,還是等STM32從最低優先級的中斷處理程序中退出時進入睡眠
- 在睡眠模式下,所有的I/O引腳都保持它們在運行模式時的狀態
- WFI指令進入睡眠模式,可被任意一個NVIC響應的中斷喚醒
- WFE指令進入睡眠模式,可被喚醒事件喚醒?
__WFI(); //執行WFI指令,CPU睡眠,并等待中斷喚醒__WFE(); //執行WFE指令,CPU睡眠,并等待事件喚醒
停止模式
- 執行完WFI/WFE指令后,STM32進入停止模式,程序暫停運行,喚醒后程序從暫停的地方繼續運行
- 1.8V供電區域的所有時鐘都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器內容被保留下來
- 在停止模式下,所有的I/O引腳都保持它們在運行模式時的狀態 當一個中斷或喚醒事件導致退出停止模式時,HSI被選為系統時鐘
- 當電壓調節器處于低功耗模式下,系統從停止模式退出時,會有一段額外的啟動延時
- WFI指令進入停止模式,可被任意一個EXTI中斷喚醒
- WFE指令進入停止模式,可被任意一個EXTI事件喚醒
/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //開啟PWR的時鐘//停止模式和待機模式一定要記得開啟PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);//STM32進入停止模式,并等待中斷喚醒SystemInit(); //喚醒后,要重新配置時鐘
待機模式
- ?執行完WFI/WFE指令后,STM32進入待機模式,喚醒后程序從頭開始運行
- 整個1.8V供電區域被斷電,PLL、HSI和HSE也被斷電,SRAM和寄存器內容丟失,只有備份的寄存器和待機電路維持供電
- 在待機模式下,所有的I/O引腳變為高阻態(浮空輸入)
- WKUP引腳的上升沿、RTC鬧鐘事件的上升沿、NRST引腳上外部復位、IWDG復位退出待機模式
/*開啟時鐘*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //開啟PWR的時鐘//停止模式和待機模式一定要記得開啟/*使能WKUP引腳*/PWR_WakeUpPinCmd(ENABLE); //使能位于PA0的WKUP引腳,WKUP引腳上升沿喚醒待機模式/*設定鬧鐘*/uint32_t Alarm = RTC_GetCounter() + 10; //鬧鐘為喚醒后當前時間的后10sRTC_SetAlarm(Alarm); //寫入鬧鐘值到RTC的ALR寄存器OLED_ShowNum(2, 6, Alarm, 10); //顯示鬧鐘值/*開啟停止*/PWR_EnterSTANDBYMode(); //STM32進入停止模式,并等待指定的喚醒事件(WKUP上升沿或RTC鬧鐘)/*待機模式喚醒后,程序會重頭開始運行*/