一、STM32 電源監(jiān)控介紹
- 1.1、上電/掉電復(fù)位POR/PDR(F1)
- 1.2、可編程電壓檢測器(PVD)(F1)
二、PVD相關(guān)寄存器介紹(F1)
三、PVD相關(guān)HAL庫驅(qū)動介紹
四、PVD的使用步驟
五、編程實(shí)戰(zhàn)
一、STM32 電源監(jiān)控介紹
電源監(jiān)控在STM32芯片中起著關(guān)鍵作用,確保系統(tǒng)在電源電壓異常或不穩(wěn)定時能夠進(jìn)行適當(dāng)?shù)奶幚?,以防止?shù)據(jù)損壞或系統(tǒng)崩潰。以下是幾種常見的電源監(jiān)控功能:
-
POR/PDR監(jiān)控器(上電/掉電復(fù)位):用于檢測芯片的上電和掉電情況,并在檢測到這些事件時執(zhí)行相應(yīng)的復(fù)位操作,以確保芯片處于可靠的初始狀態(tài)。
-
PVD監(jiān)控器(可編程電壓檢測器):監(jiān)控芯片的供電電壓(通常為VDD),并在電壓低于或高于特定閾值時觸發(fā)相應(yīng)的中斷或復(fù)位。這有助于防止芯片在電壓異常情況下工作,從而保護(hù)系統(tǒng)免受損壞。
-
BOR監(jiān)控器(欠壓復(fù)位):在供電電壓低于特定閾值時觸發(fā)復(fù)位操作,以確保系統(tǒng)在電源電壓不足時不會工作,從而避免不可預(yù)測的行為或數(shù)據(jù)損壞。
-
AVD監(jiān)控器(模擬電壓檢測器):監(jiān)控芯片的模擬供電電壓(通常為VDDA),以確保模擬電路的穩(wěn)定性和正確性。
-
VBAT閾值(電池電壓閾值):用于監(jiān)控備用電池(VBAT)的電壓,并在電壓低于或高于特定閾值時觸發(fā)相應(yīng)的中斷或處理操作。這對于依賴備用電池的應(yīng)用非常重要,例如實(shí)時時鐘(RTC)功能。
-
溫度閾值(溫度檢測器):監(jiān)控芯片的結(jié)溫,并在溫度超過或低于特定閾值時觸發(fā)相應(yīng)的中斷或處理操作。這有助于防止芯片在極端溫度條件下工作,從而保護(hù)系統(tǒng)的穩(wěn)定性和可靠性。
這些電源監(jiān)控功能可以根據(jù)具體的應(yīng)用需求進(jìn)行配置和使用,以提高系統(tǒng)的穩(wěn)定性和可靠性。
1.1、上電/掉電復(fù)位POR/PDR(F1)
上電/掉電復(fù)位(POR/PDR)是一種基本的電源監(jiān)控機(jī)制,用于確保系統(tǒng)在供電電壓異常情況下能夠進(jìn)行適當(dāng)?shù)奶幚恚员苊鈹?shù)據(jù)損壞或系統(tǒng)故障。
-
VPOR(上電復(fù)位閾值):是在芯片供電時用于觸發(fā)上電復(fù)位的電壓閾值。當(dāng)VDD低于VPOR閾值時,系統(tǒng)會進(jìn)入復(fù)位狀態(tài),防止在供電電壓不足的情況下發(fā)生誤操作。在F1系列中,典型的VPOR閾值為1.92V。
-
VPDR(掉電復(fù)位閾值):是在掉電情況下用于觸發(fā)掉電復(fù)位的電壓閾值。當(dāng)VDD低于VPDR閾值時,系統(tǒng)會保持在復(fù)位狀態(tài),以確保在電源電壓不足的情況下不會發(fā)生任何意外操作。在F1系列中,典型的VPDR閾值為1.88V。
在系統(tǒng)正常供電情況下,如果VDD超過VPOR閾值,則系統(tǒng)將退出復(fù)位狀態(tài),開始正常工作。然而,如果在掉電情況下VDD降至VPDR以下,則系統(tǒng)將保持在復(fù)位狀態(tài),直到電源電壓恢復(fù)到正常水平。
這種復(fù)位機(jī)制確保了系統(tǒng)對供電電壓異常情況的敏感性,從而保護(hù)了系統(tǒng)的穩(wěn)定性和可靠性。
1.2、可編程電壓檢測器(PVD)(F1)
可編程電壓檢測器(PVD)是一種用于監(jiān)視供電電壓(VDD)的重要功能。其主要作用包括:
-
監(jiān)視供電電壓:PVD持續(xù)監(jiān)視芯片的供電電壓,確保在電源電壓異常的情況下能夠及時發(fā)現(xiàn)并采取適當(dāng)?shù)拇胧?/p>
-
產(chǎn)生中斷通知:當(dāng)供電電壓下降到設(shè)定的閾值以下時,PVD會產(chǎn)生中斷,向軟件發(fā)出信號,通知系統(tǒng)出現(xiàn)了供電電壓異常,需要進(jìn)行緊急處理。這可以幫助系統(tǒng)及時應(yīng)對電源問題,以避免數(shù)據(jù)損壞或系統(tǒng)故障。
-
上升電壓的監(jiān)控:當(dāng)供電電壓恢復(fù)到設(shè)定的閾值以上時,PVD也會產(chǎn)生中斷,通知軟件供電已經(jīng)恢復(fù)正常。這樣的功能可以幫助系統(tǒng)在電源恢復(fù)后采取必要的初始化或恢復(fù)操作。
-
閾值設(shè)定:PVD通常允許用戶根據(jù)具體應(yīng)用需求設(shè)置供電下降和上升的閾值。這些閾值通常有一個固定的差值,以防止在閾值上下小幅度抖動時頻繁觸發(fā)中斷,從而提高系統(tǒng)的穩(wěn)定性和可靠性。
通過以上功能,PVD能夠有效地監(jiān)控供電電壓,幫助系統(tǒng)及時發(fā)現(xiàn)并處理電源問題,保障系統(tǒng)的正常運(yùn)行和數(shù)據(jù)完整性。
二、PVD相關(guān)寄存器介紹(F1)
在STM32F1系列中,用于PVD相關(guān)功能的寄存器主要包括:
-
PWR_CR(電源控制寄存器):
- 作用:用于設(shè)置PVD檢測的電壓閾值以及使能PVD。
- 具體功能:可以通過配置PWR_CR寄存器來設(shè)置PVD監(jiān)測的電壓閾值,并使能或禁用PVD功能。
-
PWR_CSR(電源控制/狀態(tài)寄存器):
- 作用:用于查看系統(tǒng)當(dāng)前狀態(tài),包括PVD的輸出狀態(tài)。
- 具體功能:PWR_CSR寄存器包含了多個位域,其中包括了PVD的輸出狀態(tài)位,可以通過讀取這些位來獲取PVD的輸出狀態(tài),以確定供電電壓是否在設(shè)定的閾值范圍內(nèi)。
-
中斷相關(guān)的寄存器:
- EXTI_IMR(外部中斷屏蔽寄存器):用于配置外部中斷的屏蔽,控制是否允許外部中斷。
- EXTI_RTSR(上升沿觸發(fā)選擇寄存器):用于配置外部中斷的觸發(fā)方式,指定外部中斷觸發(fā)條件為上升沿。
- EXTI_FTSR(下降沿觸發(fā)選擇寄存器):用于配置外部中斷的觸發(fā)方式,指定外部中斷觸發(fā)條件為下降沿。
- EXTI_PR(掛起寄存器):用于讀取外部中斷的掛起狀態(tài),檢查是否有外部中斷發(fā)生。
通過這些寄存器的設(shè)置和狀態(tài)檢查,可以實(shí)現(xiàn)對PVD功能的靈活配置和狀態(tài)監(jiān)測,確保系統(tǒng)能夠有效地對供電電壓進(jìn)行監(jiān)控和管理。
三、PVD相關(guān)HAL庫驅(qū)動介紹
在STM32的HAL庫中,針對PVD(可編程電壓檢測器)功能提供了以下相關(guān)的驅(qū)動函數(shù)和結(jié)構(gòu)體:
-
驅(qū)動函數(shù):
-
__HAL_RCC_PWR_CLK_ENABLE(...)
:- 關(guān)聯(lián)寄存器:RCC_APB1ENR(APB1總線時鐘使能寄存器)
- 功能描述:用于使能電源時鐘,確保PVD功能正常工作所需的時鐘被使能。
-
HAL_PWR_ConfigPVD(...)
:- 關(guān)聯(lián)寄存器:PWR_CR(電源控制寄存器)
- 功能描述:用于配置PVD相關(guān)參數(shù),包括PVD的閾值和工作模式等。
-
HAL_PWR_EnablePVD(...)
:- 關(guān)聯(lián)寄存器:PWR_CR(電源控制寄存器)
- 功能描述:用于使能PVD功能,啟動PVD功能后,系統(tǒng)將會監(jiān)視供電電壓并根據(jù)配置的閾值產(chǎn)生中斷。
-
-
PVD HAL庫相關(guān)結(jié)構(gòu)體:
-
PWR_PVDTypeDef
:- 結(jié)構(gòu)體描述:該結(jié)構(gòu)體用于配置PVD的相關(guān)參數(shù),包括PVD的檢測閾值和工作模式等。
- 成員變量:
-
PVDLevel
:PVD的檢測閾值,可選項(xiàng)包括PWR_PVDLEVEL_0至PWR_PVDLEVEL_7。 -
Mode
:PVD的工作模式,可選項(xiàng)包括PWR_PVD_MODE_NORMAL和PWR_PVD_MODE_IT_RISING_FALLING等。
-
-
通過調(diào)用以上的HAL庫驅(qū)動函數(shù),并結(jié)合相關(guān)的結(jié)構(gòu)體配置,可以方便地實(shí)現(xiàn)對PVD功能的配置和使能,從而實(shí)現(xiàn)對供電電壓的監(jiān)測和管理。
四、PVD的使用步驟
PVD(可編程電壓檢測器)的使用步驟,下面是更詳細(xì)的說明:
-
使能電源時鐘:
在使用PVD功能之前,需要確保電源時鐘已經(jīng)被使能,以確保PVD功能正常工作。可以通過__HAL_RCC_PWR_CLK_ENABLE()
函數(shù)來實(shí)現(xiàn)電源時鐘的使能。 -
配置PVD:
使用HAL_PWR_ConfigPVD()
函數(shù)配置PVD的相關(guān)參數(shù),包括電壓級別和中斷線邊沿觸發(fā)等。通過該函數(shù),可以設(shè)置PVD的檢測閾值和工作模式等。 -
使能PVD檢測:
調(diào)用HAL_PWR_EnablePVD()
函數(shù)使能PVD功能,啟動PVD功能后,系統(tǒng)將會監(jiān)視供電電壓并根據(jù)配置的閾值產(chǎn)生中斷。 -
設(shè)置PVD中斷優(yōu)先級:
使用HAL_NVIC_SetPriority()
函數(shù)設(shè)置PVD中斷的優(yōu)先級,確保在發(fā)生PVD中斷時能夠及時響應(yīng)。 -
使能PVD中斷:
通過HAL_NVIC_EnableIRQ()
函數(shù)使能PVD中斷,以便系統(tǒng)在PVD檢測到電壓異常時能夠觸發(fā)相應(yīng)的中斷處理函數(shù)。 -
編寫中斷服務(wù)函數(shù):
編寫PVD中斷服務(wù)函數(shù),處理PVD檢測到電壓異常時的操作。通常包括PVD_IRQHandler
和HAL_PWR_PVD_IRQHandler
函數(shù),以及HAL_PWR_PVDCallback
回調(diào)函數(shù)。在中斷服務(wù)函數(shù)中,可以根據(jù)需要進(jìn)行一些緊急處理或者通知系統(tǒng)電壓恢復(fù)正常。
通過以上步驟,可以完成對PVD功能的配置和使用,確保系統(tǒng)在供電電壓異常時能夠及時響應(yīng)并采取相應(yīng)的措施,保障系統(tǒng)的穩(wěn)定運(yùn)行。
五、編程實(shí)戰(zhàn)
F1按鍵輸入 配置PVD,實(shí)現(xiàn)電源監(jiān)控
pwr.c
#include "./BSP/PWR/pwr.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
/* 初始化WKUP按鍵 */
void pwr_wkup_key_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
PWR_WKUP_GPIO_CLK_ENABLE(); /* 使能WKUP引腳時鐘 */
gpio_init_struct.Pin = PWR_WKUP_GPIO_PIN; /* 配置WKUP引腳 */
gpio_init_struct.Mode = GPIO_MODE_IT_RISING; /* 中斷,上升沿觸發(fā) */
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(PWR_WKUP_GPIO_PORT, &gpio_init_struct); /* 初始化WKUP引腳 */
HAL_NVIC_SetPriority(PWR_WKUP_INT_IRQn, 2, 2); /* 設(shè)置WKUP中斷優(yōu)先級 */
HAL_NVIC_EnableIRQ(PWR_WKUP_INT_IRQn);
}
/* WKUP中斷處理函數(shù) */
void PWR_WKUP_INT_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(PWR_WKUP_GPIO_PIN); /* 處理WKUP引腳中斷 */
}
/* 外部中斷回調(diào)函數(shù) */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == PWR_WKUP_GPIO_PIN)
{
/* 在此處執(zhí)行WKUP中斷回調(diào)的相關(guān)操作 */
}
}
/* 初始化電壓監(jiān)測功能 */
void pwr_pvd_init(void)
{
PWR_PVDTypeDef pwr_pvd_init_struct;
/* 1. 使能PWR時鐘 */
__HAL_RCC_PWR_CLK_ENABLE();
/* 2. 配置PVD */
pwr_pvd_init_struct.PVDLevel = PWR_PVDLEVEL_7; /* 設(shè)置PVD觸發(fā)電壓等級 */
pwr_pvd_init_struct.Mode = PWR_PVD_MODE_IT_RISING_FALLING; /* 設(shè)置PVD觸發(fā)模式 */
HAL_PWR_ConfigPVD(&pwr_pvd_init_struct); /* 配置PVD功能 */
/* 3. 使能PVD */
HAL_PWR_EnablePVD();
/* 4. 設(shè)置PVD中斷優(yōu)先級 */
HAL_NVIC_SetPriority(PVD_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(PVD_IRQn);
}
/* PVD中斷處理函數(shù) */
void PVD_IRQHandler(void)
{
HAL_PWR_PVD_IRQHandler(); /* 處理PVD中斷 */
}
/* PVD中斷回調(diào)函數(shù) */
void HAL_PWR_PVDCallback(void)
{
if (__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO)) /* 電壓比PLS設(shè)置的還低 */
{
printf("PVD Low Voltage \r\n");
LED1(0); /* 關(guān)閉LED1指示燈 */
}
else
{
printf("PVD Voltage OK\r\n");
LED1(1); /* 打開LED1指示燈 */
}
}
pwr.h
#ifndef __PWR_H
#define __PWR_H
#include "./SYSTEM/sys/sys.h"
#define PWR_WKUP_GPIO_PORT GPIOA
#define PWR_WKUP_GPIO_PIN GPIO_PIN_0
#define PWR_WKUP_GPIO_CLK_ENABLE() do { __HAL_RCC_GPIOA_CLK_ENABLE(); } while (0)
#define PWR_WKUP_INT_IRQn EXTI0_IRQn
#define PWR_WKUP_INT_IRQHandler EXTI0_IRQHandler
void pwr_wkup_key_init(void); /* 初始化WKUP按鍵 */
void pwr_pvd_init(void); /* 初始化電壓監(jiān)測功能 */
#endif
main.c文章來源:http://www.zghlxwxcb.cn/news/detail-843169.html
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "./BSP/PWR/pwr.h"
int main(void)
{
uint8_t key;
uint8_t t = 0;
HAL_Init(); /* 初始化HAL庫 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時鐘, 72Mhz */
delay_init(72); /* 延時初始化 */
usart_init(115200); /* 串口初始化 */
led_init(); /* 初始化LED */
key_init(); /* 初始化按鍵 */
pwr_wkup_key_init(); /* WKUP引腳初始化 */
pwr_pvd_init(); /* PVD配置 */
printf("Enter to LowPower Test \r\n");
while(1)
{
key = key_scan(0); /* 得到鍵值 */
if (key)
{
switch (key)
{
/* 進(jìn)入待機(jī)模式 */
case KEY2_PRES:
/* 使能電源時鐘 */
__HAL_RCC_PWR_CLK_ENABLE();
/* 使能WKUP上升沿的喚醒功能 */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
/* 清除喚醒標(biāo)記 */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
printf("Enter STANDBY Mode \r\n");
HAL_PWR_EnterSTANDBYMode();
printf("Exit STANDBY Mode \r\n");
break;
/* 進(jìn)入停止模式 */
case KEY1_PRES:
LED1(0); /* 點(diǎn)亮綠燈,提示進(jìn)入停止模式 */
printf("Enter STOP Mode \r\n");
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
sys_stm32_clock_init(RCC_PLL_MUL9); /* 重新設(shè)置時鐘, 72Mhz */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
HAL_SuspendTick();
printf("Exit STOP Mode \r\n");
LED1(1);
break;
/* 進(jìn)入睡眠模式 */
case KEY0_PRES:
printf("Enter SLEEP Mode \r\n");
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
printf("Exit SLEEP Mode \r\n");
break;
}
}
if ((t % 20) == 0)
{
LED0_TOGGLE(); /* 每200ms,翻轉(zhuǎn)一次LED0 */
}
delay_ms(10);
t++;
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-843169.html
到了這里,關(guān)于【正點(diǎn)原子STM32】PVD低功耗實(shí)驗(yàn) – 電源監(jiān)控(POR/PDR監(jiān)控器、PVD監(jiān)控器、 BOR監(jiān)控器、AVD監(jiān)控器、VBAT閾值、溫度閾值、PVD相關(guān)寄存器和HAL庫驅(qū)動、PVD的使用步驟)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!