前言
有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检测器。通过PVD我们可以设定一个基准电压,当芯片的供电电压高于或低于该基准电压时便产生PVD中断,我们可以在PVD中断里做一些处理。
PVD介绍
本文以STM32F1x为例,来说明PVD的使用。
用户可以利用PVD对VDD电压与电源控制寄存器(PWR_CR)中的PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。
通过设置PVDE位来使能PVD。电源控制/状态寄存器(PWR_CSR)中的PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。
该事件在内部连接到外部中断的第16线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。例如,这一特性可用于用于执行紧急关闭任务。
由PLS[2:0]的介绍可以发现PVD的电压阈值共有8个等级,实际使用时可根据自己的实际情况进行选择。
对于软件编程中具体如何实现可以自行编写相关代码,也可关注【玩转单片机与嵌入式】公众号,在后台获取相关代码。
PVD的作用
在实际做产品/项目的过程中,可能大家对PVD的作用会忽视掉,下面列举PVD的作用:
记录设备掉电时间
这个很好理解,可能业务上就有这个需求,或者可以利用这一点来完成低功耗设备的待机时长测试。
通知其他处理离线
假如设备中有由干电池供电的MCU1和由锂电池供电的MCU2,MCU1的部分功能可能需要MCU2来完成,MCU1需要知道MCU2是否离线(因为锂电池可拔插,可能随时被拔)。这种情况就可以在MCU2上利用PVD来通知MCU1。通知的方式有很多,例如串口直接通知另一方自己将要断电了。
PS:当然也可通过MCU2监听MCU1的电源来实现。
防止掉电过程中程序跑飞
小编在之前设计的一款产品有一定的概率会出现程序丢失的情况,最初怀疑竞争对手恶意破坏或竞争对手尝试读取程序导致程序自动擦除。
后来经过实际测试发现:由于设备电压降落较慢,下电时间较长(约20ms)。在下电过程中电压较低/电压不稳定时PC指针乱跑(即所谓的程序跑飞),正好PC指向了代码中擦除Flash的位置。(设备进行ISP程序升级需要将自身的Flash擦除写入新数据)。
后来最终的解决方案为:在代码中增加PVD功能,在PVD中断中进行软件复位,保证程序不跑飞。
---The end---
联系客服