STM32L151 PVD、BOR、POR/PDR的理解
STM32L151C8T6电源控制模块的使用(PVD、BOR、POR/PDR的理解)
第一次在CSDN上写博客,有错误还请大佬指出。
本人在项目过程中应用stm32l151模块,在以前的项目中,对电源的要求并不高,一般都是直接上电直接断电,这样并没有对电源方面考虑很多,但是这次的项目对电源方面提出很多要求,由于本次项目采用的是电容供电,而且电路的供电部分的设计导致了芯片的上电和断电是一个很缓慢的过程,以正常的思维进行程序设计的时候,就是在上电后读取断电时保存在EEPROM中的数据的时候,发现读取到的数据并不正常,和正常的数据存在着偏差,所以思考再三觉得是由于上电缓慢,这样导致了虽然程序在一定的电压下开始工作,但是部分外设并没有进行正常的配置。所以发生了一些未知错误。
阅读stm32芯片手册,发现其中的电源管理模块可以解决相关问题。
基本概念:
首先是基本概念的阐述:(本基本概念部分摘自stm32l151c8芯片手册以及零死角玩转STM32—基于野火F429[挑战者]开发板)
1、上电复位与掉电复位(POR 与PDR)
当检测到VDD 的电压低于阈值VPOR 及VPDR 时,无需外部电路辅助,STM32 芯片 会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。见图1(此图片摘自stm32l151c8手册P54),在刚开始电压低于VPOR 时(约1.5V),STM32 保持在上电复位状态(POR,Power On Reset),当 VDD 电压持续上升至大于VPOR 时,芯片开始正常运行,而在芯片正常运行的时候,当检 测到VDD 电压下降至低于VPDR 阈值(约1.5V),会进入掉电复位状态(PDR,Power Down Reset)。
根据图2(摘自零死角玩转STM32—基于野火F429[挑战者]开发板以及网上的大量资料),这个有一个40mV的阈值,但是手册上好像没有这么大的数值,不过手册上还有这个表格图3,不太明确是什么意思。如果根据这个手册的说明,阈值在不使用BOR的情况下应该是100mV。
2. 欠压复位(BOR)
POR 与PDR 的复位电压阈值是固定的,如果用户想要自行设定复位阈值,可以使用STM32 的BOR 功能(Brownout Reset)。它可以编程控制电压检测工作在图4中的阈值级别(此图片摘自stm32l151c8手册P54),通过修改“选项字节”(某些特殊寄存器)中的BOR_LEV 位即可控制阈值级别。其复位控制示意图见图5。
根据POR 与PDR的说明,其上电电压为1.5V左右,但是在1.5V电压下,芯片很多外设并不能正常工作,这种情况下如果上电很快,则不用多考虑,但是如果上电缓慢,当VDD大于1.5V左右时,程序开始运行,此时VDD还是比较低,而程序的初始化已经开始,这个情况下上电之后可能程序并不能正常运行,那么此时BOR就很有必要了。只需要设置BOR的等级,就可以把上电电压提高,此时可以保证程序在开始运行时VDD是充足的。
3.可编程电压检测器PVD
上述POR、PDR 以及BOR 功能都是使用其电压阈值与外部供电电压VDD 比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外,STM32 还提供了可编程电压检测器PVD,它也是实时检测VDD 的电压,当检测到电压低于VPVD 阈值时,会向内核产生一个PVD 中断(EXTI16 线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR 设置。
具体使用
PVD中断
PVD中断触发的原因有三种配置,判断具体的触发原因根据程序的内部流程是判断PWR power control/status register (PWR_CSR)寄存器的Bit 2 PVDO: PVD output位,该位的描述在下图,根据此描述,当VDD比PVD阈值(上限值)高的时候,PVD output为0,当VDD比PVD阈值(下限值)低时,PVD output为1,这样就体现出了Rising和Falling以及Rising_Falling。也就是当VDD开始大于PVD阈值(上限值)时,PVD output从1变成0,这时就是Falling,这个时候一般也就是上电过程,反之PVD output从0变成1,此时就是Rising。如果需要区分这两个中断实现不同的中断服务函数,那么就需要在PVD中断服务函数中,通过PVDO位来判断发生的具体是什么复位。
当上电开始,为了能够保证触发PVD复位并且执行完成PVD的中断服务函数,中断服务函数执行具体所需时间需要根据具体操作来定,这样也就是需要保证PVD发生中断到程序运行停止的时间要大于中断服务函数所需时间,具体的时间也就是PVD的下限阈值降落到BOR下限阈值这个过程所需要花费的时间,这个下降曲线和电器特性有关,两个下限阈值则由我们来确定,也就是由我们来确定BOR level以及PVD level,这个手册里已经规定了相应的几组level,他们相对应的上下限阈值也在手册里有说明。
对应到库函数中已经定义好的函数
如果不使用BOR,那么根据手册说明,程序在电压值为1.5V左右就会启动运行。
但是参考手册说明,1.5V情况下并不是所有的外设都能正常工作,为了保证外设能够正常工作,所以需要使用BOR,相当于延迟上电时间,保证电压可靠的基础上开始进行程序运行。
在使用过程中还发现了一个问题,就是我设置的PVD复位是上升沿复位,也就是从设计角度而言,我只希望在程序掉电的时候才会进入PVD中断,但是在使用过程中发现了一个问题,综合判断之后发现在上电的时候也出现了一次PVD中断。然后根据手册的说明
手册上写明,在默认情况下PWR_CSR寄存器的值是0x0000 0008,也就是说默认情况下PVDO位为0,而由于程序上电缓慢,在这种情况下配置完成PVD后,系统检测到VDD电压低于PVD下限值,这时硬件会在PVDO位写入1,这样就产生了一个上升沿信号触发了PVD中断。
最后画一张图