在实际工程运用中需要对突发情况作出及时的相应,通常都需要考虑当系统电压下降或断电时,需要对控制系统加以保护。这时候就需要在程序中加入系统电压监测(PVD)。供电电压降低到某一个电压值时,需要系统进入保护状态,执行紧急关闭任务(对系统数据进行保存,并对外设进行相应的保护操作)。传统单片机例如STC12C60S2,其自带A/D,可以利用A/D对工作电压进行检测,每隔一段时间进行比较,如果异常进入保护模式,进行相关的保护措施。但是这种方法不但会占用MCU处理时间,而且利用ADC也增加了系统的功耗。STM32就可以很完美的解决这一问题,其内部自带了一个可编程电压检测器(PVD),对VDD的电压进行监控可以通过电源控制寄存器PLS[ 2:0 ]位来设置监控电压的阀值,这样通过与VDD电压比较达到了监控电压的目的。电源控制状态寄存器(PWR_CSR)中的PVDO用来表明VDD是高于还是低于PVD的电压阀值。当VDD下降到PVD阀值以下或VDD上升到PVD阀值之上时,通过外部中断16线上升或下降边沿触发设置,产生PVD中断。在中断处理函数中做相应的保护措施。具体由以下两表所示。

表1 阀值与PVD输出关系

表2 具体寄存器参数

下面对上面2张图和表格中的数据做一个简要的解释:

1)PVD = Programmable Votage Detector 可编程电压监测器

它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。在给出表格的上半部分就是可编程的监视阀值数据。当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。供电下降的阀值与供电上升的PVD阀值有一个固定的差值,这就是表中的VPVDhyst(PVD迟滞)这个参数,通过列出的PVD阀值数据可以看到这个差别。引入这个差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。

2)POR = Power On Reset 上电复位;PDR = Power Down Reset 掉电复位。

POR的功能是在VDD电压由低向高上升越过规定的阀值之前,保持芯片复位,当越过这个阀值后的一小段时间后(图中的"滞后时间"或表中的"复位迟滞"),结束复位并取复位向量,开始执行指令。这个阀值就是表中倒数第4行(min=1.8,typ=1.88,max=1.96)。

POR的功能是在VDD电压由高向低下降越过规定的阀值后,将在芯片内部产生复位,这个阀值就是表中倒数第3行(min=1.84,typ=1.92,max=2.0)。

3)可以看到POR比PDR大了0.04V,这就是表中倒数第2行,VPDRhyst(PDR迟滞)=40mV。

4)从上面的第2张图可以看到,当VDD上升越过POR阀值时,内部并不马上结束复位,而是等待一小段时间(Reset temporization),这就是表中的最后一行TRSTTEMPO,它的典型数值是2.5ms。

这个滞后时间是为了等待供电电压能够升高到最低可靠工作电压以上,我们看到POR阀值最小只有1.8V,最大也只有1.96V,都低于数据手册中给出的最低可靠工作电压2.0V,所以这个滞后时间是十分必要的,如果供电电压上升缓慢,尤其是从1.8V升到2.0V以上超过1~2.5ms,则很可能造成上电复位后MCU不能正常工作的情况。

STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。通过电源控制寄存器中的PLS[2:0]位可以用来设定监控电压的阀值,通过对外部 电压进行比较来监控电源。当条件触发,需要系统进入特别保护状态,执行紧急关闭任务:对系统的一些数据保存起来,同时对外设进行相应的保护操作。

操作流程:

1)、系统启动后启动PVD,并开启相应的中断。

PWR_PVDLevelConfig(PWR_PVDLevel_2V8); // 设定监控阀值PWR_PVDCmd(ENABLE); // 使能PVDEXTI_StructInit(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到中断线16上EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //使用中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Raising;//电压低于阀值时产生中断EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线EXTI_Init(&EXTI_InitStructure); // 初始

EXTI_InitStructure.EXTI_Trigger的赋值可选项:

EXTI_Trigger_Rising---表示电压从高下降到低于设定阀值时产生中断;

EXTI_Trigger_Falling---表示电压从低上升到高于设定阀值时产生中断;

EXTI_Trigger_Rising_Falling---表示电压上升或下降越过设定阀值时都产生中断。

2)、当工作电压低于设定阀值时,将产生PVD中断,在中断程序中进行相应的处理:

void PVD_IRQHandler(void){EXTI_ClearITPendingBit(EXTI_Line16);…… // 用户添加紧急处理代码处}

(以上内容是摘自网上的,以下内容是开发后总结的,经过验证的)

/************************************************************************************************************************************************************/ 20111220

STM32中PVD的编程:开始时参照网上的资料和技术文档的内容,把基本的代码组织了,但是程序还是无法如意向的执行(无论是用查询方式、还是中断方式);网上很少有提到解决为什么不能执行的,没有更多的参考,于是只能慢慢调试;

调试:首先是看PVD监控的标志位能否置起来,用死循环一直检测;然后要是行的话,再去用中断的方式;

结果发现时标志位无法被置起来,后来再去网上查,对比自己的代码,发现,漏了一步没进行:就是PVD所对应的时钟没有使能;

加上去后,果然能置位了。

总结:细想,对于stm32的外设或者模块的操作(配置、使用),在前期的配置中,基本上都是需要使能相应的时钟,而这次也是因为这个原因而出错;所以下次的使用中需要注意这方面的问题。

PVD的具体的编程:

基本的初始化和配置:

/************************************************************************** /
//Function : void EXTI_Configuration(void)//Description : configures;//Input : none;//Output : none//created by : *************************************************************************/
void EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure;EXTI_DeInit();EXTI_StructInit(&EXTI_InitStructure);EXTI_InitStructure.EXTI_Line = EXTI_Line16;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);}/**************************************************************************
//Function : void PVD_NVIC_Configuration(void)//Description ://Input : none;//Output : none//created by**************************************************************************/
void PVD_NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; :RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //point it;cann't lose it;这个必须要加;NVIC_Init(&NVIC_InitStructure);}//中断函数:extern void dev_pvd_irq_handle(void);void PVD_IRQHandler(void){dev_pvd_irq_handle();}/**************************************************************************
//Function : void dev_pvd_irq_handle(void)//Description : PVD handle function;//Input : none;//Output : none//created by**************************************************************************/
extern u8 is_power_on;void dev_pvd_irq_handle(void){ :EXTI_ClearITPendingBit(EXTI_Line16);//clear bit;if(PWR_GetFlagStatus(PWR_FLAG_PVDO)){dev_misc_power_on(0);}}//主函数中的操作:Main(){… …PVD_NVIC_Configuration();EXTI_Configuration();PWR_PVDLevelConfig(PWR_PVDLevel_2V9);//2.8V;added for PDV;//有范围的;
PWR_PVDCmd(ENABLE); //added for PDV;… …}//(除了用中断的方式,也可以用查询的方式:)if(PWR_GetFlagStatus(PWR_FLAG_PVDO)){… …}

STM32关于PVD低电压能检测的知识相关推荐

  1. stm32之PVD可编程电压监测器(掉电保存数据)

    前言:stm32系列提供了可编程电压检测器PVD,它是实时检测VDD的电压,当检测到电压低于或者高于PVD设置的阈值时,会想内核产生一个PVD中断(EXTI线中断)以使内核在复位前进行紧急处理.该电压 ...

  2. 低电压检测IC(复位IC)

    低电压检测IC(复位IC) 型号 输入 耐压 检测电压范围 检测电 压精度 输出形式 工作 电流 封装 直接替代型号 HM61C/ NXX2 12V 0.9/1.0/1.1/1.2/1.3/1.5/1 ...

  3. 复位IC,低电压检测IC PJ809

    复位IC,低电压检测IC PJ809 复位IC PJ809 series(2.63/2.7/2.93/3.08/4.0/4.38/4.63V,CMOS,低有效) SOT23 PJ803 series( ...

  4. FS61C低电压检测IC芯片 series Low Power Voltage Detector

    FS61C低电压检测IC芯片常规CMOS输出检测电压有1V 1.2V 1.5V 1.8V 2V 2.1V 2.2V 2.4V 2.5V 2.7V 2.8V 3V 3.3V 3.5V 3.6V 4V 5 ...

  5. 基于stm32单片机的汽车胎压车速检测(实物图+源程序+原理图+参考论文)

    资料编号:050 采用stm32 单片机,蓝牙技术设计一个汽车监控系统,要求监控汽车驻车时的落锁.胎压.车窗等功能,监控汽车行车时的速度.时间等功能,通过蓝牙上报手机app 全套资料齐全,具体功能请看 ...

  6. 眼图 非差分线_LVDS低电压差分信号简介

    LVDS低电压差分信号简介 1. 名词解释 1.1. 背景 随着数据传输速率越来越高,现在计算机系统中的数据传输接口基本上都串行化了,像USB.PCIe.SATA.DP等等外部总线将并行总线挤压到只剩 ...

  7. 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人

    0 简介 Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人 大家可用于 课程设计 或 毕业设计 print(" ...

  8. 基于Blinker ESP8266 远程电压电流、功率计、温湿度计、ADC接口测温、温控风扇、低电压保护、低压报警功能。用来监测我的太阳能充电。SSD1306可轮番显示电压信息和温度信息。APP图表

    ESP8266系列文章目录 目录 ESP8266系列文章目录 经过不断的努力,处女之作终于做出来了.用的Arduino 经过一段时间不断熟练了,做了一些更新:2022.10.30   可以直接主页下载 ...

  9. 并网-低电压穿越与孤岛并存分析

    孤岛保护和低电压穿越独立分析 在逆变器并网运行时,会不断通过频率偏移.无功扰动等主动式孤岛保护方式以及检测电网电压频率和电网电压幅值是否超出规定值等被动式防孤岛保护方式来判断自身是否处于孤岛状态.一旦 ...

最新文章

  1. 解决Linux最大进程数和最大文件句柄问题
  2. linux中cp:overwrite提示的问题
  3. 在SQLite中使用事务
  4. Photon多人游戏开发教程
  5. EE JSP:使用自定义标签库生成动态内容
  6. python列表应用案例-python列表使用实例
  7. Linux centos 使用yum安装MySQL
  8. SpringCloud系列博客父工程xml依赖
  9. Android开源框架:Universal-Image-Loader解析(四)TaskProcess
  10. springboot+微信小程序点餐系统的设计与实现毕业设计源码221541
  11. suse linux 忘记root密码,SUSE linux 忘记root密码
  12. 视频教程-三天掌握三菱FX系列PLC视频教程-单片机/工控
  13. Word 2010页眉页脚从某一页开始
  14. PyTorch | torch.manual_seed(1)是什么意思?torch随机数manual_seed(1)有什么用?如何理解torch.manual_seed(1)
  15. 计算机显示pc19,19寸显示器最佳分辨率是多少 怎么设置【图文教程】
  16. 单词数(HDU 2072)
  17. 浅谈ipad阅读类应用设计
  18. 【数学知识】方差、标准差、均方差、均方误差区别总结
  19. 安全架构-HTTP协议幂等性
  20. kali 利用msf通过win7永恒之蓝漏洞获取权限

热门文章

  1. 验证码机制之验证码自动识别
  2. cydia java_Cydia Substrate 使用
  3. Java——线程插队_join ()方法来实现“插队功能”
  4. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(一)
  5. 手写板行业调研报告 - 市场现状分析与发展前景预测
  6. JSP中自定义jstl标签
  7. 华为交换机怎么查看接口流量
  8. PDF文档物理结构概述
  9. 使用freesurfer进行海马亚区分割学习笔记
  10. 微信怎样加入精准粉丝