PVD-CH32可编程电压控制器PVD中断的使用方法

发布时间 2023-04-26 17:22:27作者: WCH_CH32

  可编程电压监视器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")));

  中断服务函数: