PVD----Programmable Voltage Detecter,即可编程电压检测器。在我们日常的应用中,有时候需要去检测我们的系统是不是掉电了?或者说,我们提前做好一些意外掉电前的保护措施,这个时候就需要用到芯片的PVD功能。
通过PVD,我们可以去设置一个基准/参考电压,当芯片的供电电压高于或低于这个数值时,均可以产生PVD中断,此时,我们可以在中断里做一些必要的条件处理。
本文以APM32F103XB为例,来说明PVD的使用:
1)用户通过电源控制寄存器PMU_CTRL的PLSEL位可以设置PVD的触发阈值,设置PVDEN位可以开启或关闭PVD功能;
2)通过读取电源控制/状态寄存器PMU_CSTS的PVDO**位状态可以得出此时VDD/VDDA电压是否高于设定的PVD阈值;
3)PVD中断事件在内部连接到了外部中断线16。如果在操作过程中,使能该外部中断线,就可以让该事件产生对应的中断。也就是将中断触发配置为上升沿和下降沿触发时,VDD/VDDA上升至PVD阈值之上或下降至PVD阈值之下时,均可以产生PVD中断。
下面是APM32F103手册对于PVD的描述(图):由于编辑器无法添加图片,如需查看可到附件PDF中查找。
int main(void) { APM_MINI_LEDInit(LED2); APM_MINI_LEDInit(LED3); PVD_Init_l(); while (1) { Delay(); } } PVD配置: void PVD_Init_l(void) { RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);//开启PMU时钟 PMU_ConfigPVDLevel(PMU_PVD_LEVEL_2V9);//选择PVD的触发电压 //PVD中断配置 NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_0);//设置中断分组 NVIC_EnableIRQRequest(PVD_IRQn,0,0);//设置PVD_IRQn中断等级,使能 //EINT中断线配置 EINT_Config_T EINT_PVD; EINT_PVD.line = EINT_LINE_16; EINT_PVD.mode = EINT_MODE_INTERRUPT;//配置为中断 EINT_PVD.trigger = EINT_TRIGGER_RISING_FALLING;//上升沿/下降沿触发 EINT_PVD.lineCmd = ENABLE; EINT_Config(&EINT_PVD); //使能PVD PMU_EnablePVD(); } 中断服务函数: void PVD_IRQHandler(void) { for(uint32_t i = 0;i < 6;i++) { if(i%2) { APM_MINI_LEDToggle(LED3); } else { APM_MINI_LEDToggle(LED2); } Delay(); NVIC_ClearPendingIRQ(PVD_IRQn); EINT_ClearIntFlag(EINT_LINE_16); } }
|