PWR
STM32的PWR模塊是其電源管理系統(tǒng)的核心部分,負責(zé)控制和管理芯片的供電和電源狀態(tài)。
電源
STM32的工作電壓(VDD)為2.0~3.6V。通過內(nèi)置的電壓調(diào)節(jié)器提供所需的1.8V電源。
當主電源VDD掉電后,通過VBAT腳為實時時鐘(RTC)和備份寄存器提供電源。
VDDA供電區(qū)域是為模擬電路提供電源的區(qū)域。VDDA通常由外部電源提供,通過電源管理單元(PWR)進行控制和管理。
VDDA的電壓范圍:2.4V~3.6V(具體取決于不同型號的芯片),并且必須在此范圍內(nèi)保持穩(wěn)定和可靠的供電。
為了提高轉(zhuǎn)換的精確度, ADC使用一個獨立的電源供電,過濾和屏蔽來自印刷電路板上的毛刺干擾。
對于不同的引腳封裝,所需的電源引腳也是不同的。(如圖中的VREF)。
這部分是為數(shù)字電路提供的電源區(qū)域,也是最主要的電源區(qū)域。
Vdd的電壓范圍:1.8V~3.6V
供電區(qū)域包括輸入輸出接口的電路,待機電路(喚醒邏輯、看門狗)以及電壓調(diào)節(jié)器。
對于我們外設(shè)電路,一般都為3.3V,當他連接到內(nèi)電路時,會通過電壓調(diào)節(jié)器調(diào)整到1.8V來鏈接CPU核心存儲器和內(nèi)置數(shù)字外設(shè),此操作是為了能夠減少電源消耗。
后備供電區(qū)域就是上一節(jié)為RTC和備份寄存器提供能源的區(qū)域。
主要作用是在主電源失效或斷電時,提供持久的電源支持和數(shù)據(jù)保護。
RTC時鐘鏈接處
電源管理器
電源管理器一般用于電源的監(jiān)測和進行復(fù)位操作。
上電復(fù)位(POR)和掉電復(fù)位(PDR)
在上電復(fù)位(POR)和掉電復(fù)位(PDR)方面,PWR模塊監(jiān)測VDD/DDA是否低于設(shè)定的閾值,當電壓低于設(shè)定的閾值時,系統(tǒng)保持在復(fù)位狀態(tài),以確保電路的正常運行。這種情況一般發(fā)生在芯片剛剛接通電源或電源恢復(fù)時。上電復(fù)位會將芯片的所有寄存器和內(nèi)部狀態(tài)初始化為默認值,使系統(tǒng)進入一個已知的、可靠的狀態(tài)。
在圖中我們會發(fā)現(xiàn)上電復(fù)位會有一些滯后時間,這是由于電源和芯片內(nèi)部的復(fù)位電路之間的時間延遲引起的。當供電電壓開始上升時,電源需要經(jīng)過一個上升時間才能穩(wěn)定到達復(fù)位閾值之以上,同時芯片內(nèi)部的復(fù)位電路也需要一定時間來檢測并響應(yīng)供電電壓的變化。這種供電電壓上升和內(nèi)部電路檢測的時間延遲導(dǎo)致了上電復(fù)位的滯后。
掉電復(fù)位在芯片的供電電壓低于掉電復(fù)位閾值(PDR)以下時,系統(tǒng)會觸發(fā)掉電復(fù)位,將芯片的所有寄存器和內(nèi)部狀態(tài)初始化為默認值。
可編程電壓監(jiān)測器(PVD)
下面是Vpvd可以選擇監(jiān)測電壓范圍
總的來說,監(jiān)測電壓范圍為2.1V~2.9V;一旦有設(shè)置PVD檢測,超過這個范圍的,就會輸出PVD信號。
低功耗模式
在系統(tǒng)或者電源復(fù)位后,微控制器會處于運行狀態(tài);在CPU不需要運行時,我們可以通過低功耗模式,以實現(xiàn)節(jié)能和延長電池壽命。低功耗模式會通過關(guān)閉或減少一些不必要的外設(shè)和時鐘來降低系統(tǒng)功耗,同時又保持一些關(guān)鍵功能的運行。且對于關(guān)閉的一些外設(shè),在需要運行的時候,要有手段來喚醒這些外設(shè)。
開啟流程:
睡眠模式
停止模式
待機模式
睡眠模式工程
SWART串口鏈接入口
通過對串口的發(fā)送和接收數(shù)據(jù)工程進行驗證。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "Serial.h"
#include "OLED.h"
int main()
{
uint8_t Rxdata;
OLED_Init();
Serial_Init();
OLED_ShowString(1,1,"RxData:");
while(1)
{
if(Serial_GetRxFlag()==1)
{
Rxdata=Serial_GetRxData();
Serial_SendByte(Rxdata);
OLED_ShowHexNum(1,8,Rxdata,2);
}
OLED_ShowString(2,1,"Running");
Delay_ms(100);
OLED_ShowString(2,1," ");
Delay_ms(100);
__WFI();
}
}
當沒有睡眠模式時,由于程序不斷的跑動,Running會在屏幕上不停閃爍;通過睡眠模式,來使SWART串口非發(fā)送和接收狀態(tài),不會進行程序的跑動,只有在串口發(fā)送和接收時,才會從睡眠模式恢復(fù)過來,節(jié)省消耗;
WFI是等待中斷;只要觸發(fā)該指令,就會進入睡眠模式;通過接收數(shù)據(jù)的中斷來喚醒。
在開啟流程圖還需要SLEEPDEEP和SLEEPONEXIT,由于PWR沒有內(nèi)置該模式函數(shù),我們就從簡入手;不開這兩個相關(guān)寄存器也不影響操作;
停止模式
外部中斷文章鏈接入口
通過對對射式紅外傳感器工程的觸發(fā),來驗證停止模式。
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
#include "OLED.h"
#include "CountSensor.h"
int main()
{
OLED_Init();
CountSensor_Init();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
OLED_ShowString(1,1,"Count:");
while(1)
{
OLED_ShowNum(1,7,CountSensor_Get(),5);
OLED_ShowString(2,1,"Running");
Delay_ms(100);
OLED_ShowString(2,1," ");
Delay_ms(100);
PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
SystemInit();
}
}
與上一個工程相同的道理,利用閃爍來表示程序的不斷進行,停止模式會使程序中斷,只有觸發(fā)外部中斷時,才有喚醒電源;
這是庫函數(shù)內(nèi)置的停止模式,第一個參數(shù)是選擇開啟電壓調(diào)節(jié)器低功耗和開啟;第二個參數(shù)是選擇喚醒事件指令或者是中斷指令;
由于一個中斷或喚醒事件導(dǎo)致退出停止模式時,HSI被選為系統(tǒng)時鐘,喚醒后時鐘頻率變?yōu)?MHz,需要通過SystemInit()函數(shù)來初始化時鐘頻率。
待機模式
RTC時鐘鏈接處
通過RTC鬧鐘喚醒和AWAUP的上升喚醒來驗證待機模式;文章來源:http://www.zghlxwxcb.cn/news/detail-724086.html
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"
int main()
{
Time time;
time.year=2023;
time.mon=1;
time.mday=1;
time.hour=23;
time.min=59;
time.sec=55;
OLED_Init();
MyRTC_Init(&time);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
// PWR_WakeUpPinCmd(ENABLE);
MyRTC_SetTime(&time);
OLED_ShowString(1, 1, "ALR :");
OLED_ShowString(2, 1, "ALRF:");
OLED_ShowString(3, 1, "CNT :");
uint32_t Alarm=RTC_GetCounter()+10;
RTC_SetAlarm(Alarm);
OLED_ShowNum(1,6,Alarm,10);
while (1)
{
MyRTC_ReadTime(&time);
OLED_ShowNum(3, 6, RTC_GetCounter(), 10);
OLED_ShowNum(2, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);
OLED_ShowString(4,1,"Running");
Delay_ms(100);
OLED_ShowString(4,1," ");
Delay_ms(100);
// OLED_ShowString(4, 9, "STANDBY");
// Delay_ms(1000);
// OLED_ShowString(4, 9, " ");
// Delay_ms(100);
// OLED_Clear();
PWR_EnterSTANDBYMode();
}
}
讓鬧鐘值大于CNT十秒,當達到鬧鐘值時,就會讓標志位置1,可以先觀察標志位是否置換,然后再執(zhí)行待機模式。
下面的只要讓一PA0(有WAUP功能)引腳接上正極,就能觸發(fā)喚醒。文章來源地址http://www.zghlxwxcb.cn/news/detail-724086.html
到了這里,關(guān)于STM32--PWR電源控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!