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
- #include "stm32f10x.h"
- #include "stm32_eval.h"
- void EXTI_Configuration(void);
- void NVIC_Configuration(void);
- int main(void)
- {
- GPIO_SetBits(GPIOC, GPIO_Pin_7);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//电源管理部分时钟开启
- EXTI_Configuration();
- NVIC_Configuration();
- PWR_PVDLevelConfig(PWR_PVDLevel_2V9);// 设定监控阀值
- PWR_PVDCmd(ENABLE);// 使能PVD
- while (1)
- {
- }
- }
- void EXTI_Configuration(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- /* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and
- falling edges */
- EXTI_ClearITPendingBit(EXTI_Line16);
- EXTI_InitStructure.EXTI_Line = EXTI_Line16;// PVD连接到中断线16上
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//使用中断模式
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//电压上升或下降越过设定阀值时都产生中断。
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;// 使能中断线
- EXTI_Init(&EXTI_InitStructure);// 初始
- }
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Configure one bit for preemption priority */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级配置
- /* Enable the PVD Interrupt */ //设置PVD中断
- NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- void PVD_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line16) != RESET)
- {
- /* LED1翻转 */
- STM_EVAL_LEDToggle(LED1);
- /* Clear the Key Button EXTI line pending bit */
- EXTI_ClearITPendingBit(EXTI_Line16);
- }
- }
浙公网安备 33010602011771号