PVD-CH32可编程电压控制器PVD中断的使用方法
可编程电压监视器PVD,主要被用于监控系统主电源的变化,与电源控制寄存器PWR_CTLR 的PLS[2:0]所设置的门槛电压相比较,配合外部中断寄存器(EXTI)设置,可产生相关中断,以便及时通知系统进行数据保存等掉电前操作。
配置方法如下:
先使能PWR时钟,然后设置电压监视阈值,随后使能PVDE开启电源电压监视功能。
1 void PVD_Init(void) 2 { 3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 4 PWR_PVDLevelConfig(PWR_PVDLevel_2V9); 5 PWR_PVDCmd(ENABLE); 6 }
PVD功能内部连接EXTI模块的第16 线的上升/下降边沿触发设置,开启此中断(配置EXTI),当VDD下降到PVD阀值以下或上升到PVD 阀值之上时就会产生PVD 中断。设置为EXTI_Trigger_Rising会在供电电压低于PWR_PVDLevelConfig设置的值时进入PVD中断,此时PWR_FLAG_PVDO会被置1;设置为EXTI_Trigger_Falling会在供电电压高于PWR_PVDLevelConfig设置的值时进入PVD中断,此时PWR_FLAG_PVDO会被置0。
1 void PVD_NVIC_Config(void) 2 { 3 EXTI_InitTypeDef EXTI_InitStructure = {0}; 4 NVIC_InitTypeDef NVIC_InitStructure = {0}; 5 6 EXTI_InitStructure.EXTI_Line = EXTI_Line16; 7 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 8 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; 9 EXTI_InitStructure.EXTI_LineCmd = ENABLE; 10 EXTI_Init(&EXTI_InitStructure); 11 12 NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; 13 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 14 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 15 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 16 NVIC_Init(&NVIC_InitStructure); 17 }
中断服务函数如下,可在中断服务函数中添加读写Flash操作已保存重要数据。注意RISCV芯片需要添加硬件压栈声明,否则只会进一次中断。
硬件压栈声明:
1 void PVD_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
中断服务函数:
1 void PVD_IRQHandler(void) 2 { 3 if(PWR_GetFlagStatus(PWR_FLAG_PVDO)) 4 { 5 PWR_ClearFlag(PWR_FLAG_PVDO); 6 } 7 else { 8 9 } 10 EXTI_ClearITPendingBit(EXTI_Line16); /* Clear Flag */ 11 }