灵动微-MM32 电源管理
在应用开发中,通常需要考虑当出现系统供电电压下降或掉电突发状况时,需对控制系统加以保护,防止出现意外,故在程序中需加入对系统电压的监控。当供电电压降低到某一电压值时,需要系统进入特别保护状态,执行紧急关闭任务:对系统的一些数据保存起来,同时对外设进行相应的保护操作。MM32L0系列产品的工作电压(VDD)为 2.0V ~ 5.5V。通过内置的电压调节器提供所需的 1.5V 电源。
注: VDDA 和 VSSA 必须分别连到 VDD和 VSS。
MM32L0系列产品内部有一个完整的上电复位(POR)和掉电复位(PDR)电路,当供电电压达到 2.0V 时系统才能正常工作。
当 VDD/VDDA 低于指定的限位电压 VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路。
POR = Power On Reset 上电复位;PDR = Power Down Reset 掉电复位。
POR的功能是在VDD电压由低向高上升越过规定的阀值之前,保持芯片复位,当越过这个阀值后的一小段时间后(图中的"滞后时间"或表中的"复位迟滞"),结束复位并取复位向量,开始执行指令。当VDD上升越过POR阀值时,内部并不马上结束复位,而是等待一小段时间(Reset temporization)。Reset temporization是为了等待供电电压能够升高到最低可靠工作电压以上,我们看到POR阀值典型值只有1.656V(参考MM32 DS手册表内嵌复位和电源控制模块特性),低于数据手册中给出的最低可靠工作电压2.0V,所以这个滞后时间是十分必要的,如果供电电压上升缓慢,尤其是从1.8V升到2.0V以上超过1~2.5ms,则很可能造成上电复位后MCU不能正常工作的情况。
PDR功能是在VDD电压由高向低下降越过规定的阀值后,将在芯片内部产生复位。
MM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。通过电源控制寄存器中的PLS[12:9]位来设定监控电压的阀值,通过对外部电压进行比较来监控电源。当条件触发,需要系统进入特别保护状态,执行紧急关闭任务:对系统的一些数据保存起来,同时对外设进行相应的保护操作。
用户可以利用 PVD 对 VDD电压与电源控制寄存器(PWR_CTRL)中的PLS[12:9]位进行比较来监控电源,这几位选择监控电压的阀值。
PVD = Programmable Votage Detector 可编程电压监测器,它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。
PLS[12:9]位用于选择PVD监控电源的电压阀值:
0000:1.8V 0101:3.3V 1010:4.8V
0001:2.1V 0110:3.6V
0010:2.4V 0111:3.9V
0011:2.7V 1000:4.2V
0100:3.0V 1001:4.5V
电源控制/状态寄存器(PWR_CSTA)中的 PVDO 标志用来表明 VDD是高于还是低于 PVD 的电压阀值。该事件在内部连接到外部中断的第 16线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当 VDD下降到 PVD 阀值以下和(或)当 VDD 上升到 PVD 阀值之上时,根据外部中断第 16 线的上升/下降边沿触发设置,就会产生 PVD 中断。例如,这一特性可用于用于执行紧急关闭任务。
一、库函数操作流程(中断方式):
1)、电源接口时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
2)、PWR_PVDLevelConfig(PWR_PVDLevel_4V2); // 设定监控阀值
3)、PWR_PVDCmd(ENABLE); // 使能PVD
4)、EXTI_ClearITPendingBit(EXTI_Line16);//清中断
5)、EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到中断线16上
6)、EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //使用中断模式
7)、EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//表示电压上升或下降越过设定阀值时都产生中断
8)、EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线
9)、EXTI_Init(&EXTI_InitStructure); // 初始化
EXTI_InitStructure.EXTI_Trigger的赋值可选项:
EXTI_Trigger_Rising---表示电压从高下降到低于设定阀值时产生中断;
EXTI_Trigger_Falling---表示电压从低上升到高于设定阀值时产生中断;
EXTI_Trigger_Rising_Falling---表示电压上升或下降越过设定阀值时都产生中断。
10)、中断优先级配置
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
2、当工作电压低于设定阀值时,将产生PVD中断,在中断程序中进行相应的处理:
void PVD_IRQHandler(void)
{
if( RESET != EXTI_GetITStatus(EXTI_Line16))
{
EXTI_ClearITPendingBit(EXTI_Line16); …… // 用户添加紧急处理代码处
WriteToBackupReg(0x3210);//往BKP寄存器里面存数据
}
}
在测试的例程中,我配置的PVD工作方式为中断上升和下降沿触发,当VDD高于预设PVD阈值或者低于阈值而产生边沿触发时,都会形成一次PVD中断,然后读取PWR_CSR的PVDO标志位检查是低电压提醒还是高电压提醒,以此来达到监控MCU供电情况的目的。
二、寄存器操作流程(查询方式):
1)、电源接口时钟使能
RCC->APB1ENR |= 0x10000000;
2)、设置阈值电压,电源电压检测器(PVD)使能
PWR->CR =0x1010; //电压检测阈值=4.2v,PVDE=1使能
3)、等待PVDO输出状态
if((PWR->CSR&0x0004) !=0)
{
SCB->AIRCR =0x05fa0004;//软件复位
}
else
{
WriteToBackupReg(0x3210);//往BKP寄存器里面存数据
return;
}
小结:
1、 MM32L0系列产品 PVD所对应的时钟挂在APB1上,在使用PVD功能时需要使能PWR时钟。
2、 使用寄存器配置如何判断掉电过程还是还是上电过程?
可以根据电源控制/状态寄存器(PWR_CSR)的PVDO位来判断,PVDO从1变0表示上电过程,从0变1表示掉电过程,用户可以根据该位来判断是需要上电复位还是掉电复位。
如需要了解更多灵动微MCU产品,请联系灵动微核心代理商-颖特新科技
编辑:ls 最后修改时间:2022-06-08