STM32F103 PVD可编程电压监测器

STM32F103 PVD可编程电压监测器

PVD (Programmable Votage Detector) ,即可编程电压监测器 。stm32库函数手册中没有细讲这个模块,只是在 PWM一章中列出了两个相关函数。但是这个功能在实际项目中会有较大的作用,

当电压过低时,对系统的一些数据使用掉电不丢失的 EEPROM 或 Flash 保存起来,同时对外设进行相应的保护操作。

PVD的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。供电下降的阀值与供电上升的PVD阀值有一个固定的差值,引入这个差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。

用户在使用STM32时,可以利用其内部的PVD对VDD的电压进行监控,通过电源控制寄存器(PWR_CR)中的PLS[2:0]位来设定监控的电压值。

PLS[2:0]位用于选择PVD监控电源的电压阀值:

000:2.2V

001:2.3V

010:2.4V

011:2.5V

100:2.6V

101:2.7V

110:2.8V

111:2.9V

在电源控制/状态寄存器(PWR_CSR)中的PVDO标志用来表明VDD是高于还是低于PVD设定的电压阀值。该事件连接到外部中断的第16线,如果该中断在外部中断寄存器中被使能的,该事件就会产生中断。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。

所以我做了一个实验,测试了stm32 的PVD功能。设定PVD监控阀值 为2.8V,通过一个分压模块将5v电压通过一个可调电阻分压给stm32, 在PVD中断中设定点亮一个LED,调整可调电阻大小,校验PVD是否触发。

code

    1. #include "stm32f10x.h"
    1. #include "stm32_eval.h"
    1. void EXTI_Configuration(void);
    1. void NVIC_Configuration(void);

    1. int main(void)
    1. {
    1. GPIO_SetBits(GPIOC, GPIO_Pin_7);
    1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//电源管理部分时钟开启
    1. EXTI_Configuration();
    1. NVIC_Configuration();

    1. PWR_PVDLevelConfig(PWR_PVDLevel_2V9);// 设定监控阀值
    1. PWR_PVDCmd(ENABLE);// 使能PVD

    1. while (1)
    1. {
    1. }
    1. }
    1. void EXTI_Configuration(void)
    1. {
    1. EXTI_InitTypeDef EXTI_InitStructure;
    1. /* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and
    1. falling edges */
    1. EXTI_ClearITPendingBit(EXTI_Line16);
    1. EXTI_InitStructure.EXTI_Line = EXTI_Line16;// PVD连接到中断线16上
    1. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//使用中断模式
    1. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//电压上升或下降越过设定阀值时都产生中断。
    1. EXTI_InitStructure.EXTI_LineCmd = ENABLE;// 使能中断线
    1. EXTI_Init(&EXTI_InitStructure);// 初始
    1. }

    1. void NVIC_Configuration(void)
    1. {
    1. NVIC_InitTypeDef NVIC_InitStructure;

    1. /* Configure one bit for preemption priority */
    1. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级配置

    1. /* Enable the PVD Interrupt */ //设置PVD中断
    1. NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
    1. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    1. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    1. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    1. NVIC_Init(&NVIC_InitStructure);
    1. }

    1. void PVD_IRQHandler(void)
    1. {
    1. if(EXTI_GetITStatus(EXTI_Line16) != RESET)
    1. {
    1. /* LED1翻转 */
    1. STM_EVAL_LEDToggle(LED1);
    1. /* Clear the Key Button EXTI line pending bit */
    1. EXTI_ClearITPendingBit(EXTI_Line16);
    1. }
    1. }
posted @ 2025-11-06 11:24  张大帅哥  阅读(10)  评论(0)    收藏  举报