STM32 PVD掉电检测功能的使用方法

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

STM32 PVD掉电检测功能的使用方法

前言

在实际应用场景中可能会出现设备电源电压异常下降或掉电的情况因此有时候需要检测设备是否掉电或者在设备掉电的瞬间做一些紧急关机处理比如保存重要的用户数据记录运行时间紧急通知其他平台等等。

1 PVD简介

1.1 工作原理

STM32本身内置了一种掉电检测机制——PVD(Programmable Voltage Detecter)即可编程电压检测器。
其原理是通过PVD监测电压变化并提前设定好一个基准电压当芯片的供电电压高于或低于该基准电压时便产生PVD中断在PVD中断里面就可以做一些紧急处理。

PVD门限阀值如下图所示
在这里插入图片描述

1.2 软件配置步骤

1、初始化配置PVD参数。
2、在中断函数加入紧急处理代码。

PVD参数具体配置如下
通过配置电源/状态控制寄存器(PWR_CSR)和电源控制寄存器(PWR_CR)来监控电源电压。

电源控制寄存器(PWR_CR)如下
在这里插入图片描述

其中PLS[2:0]这几位选择监控电压的阀值。PVDE位用来使能PVD。

电源/状态控制寄存器(PWR_CSR)如下
在这里插入图片描述

其中PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。

PVD事件在内部连接到外部中断的第16线如果该中断在外部中断寄存器中是使能的该事件就会产生中断。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时根据外部中断第16线的上升/下降边沿触发设置就会产生PVD中断。通过这一特性可将PVD用于用于执行紧急关闭任务。
在这里插入图片描述

1.3 注意事项

1、如果项目使用了多个外设中断要注意PVD中断的优先级。
2、注意紧急处理代码的执行时间要在MCU电压降到完全不能工作前执行完可以通过调整PVD阈值电压或者在MCU供电电源处加大电容以延缓掉电时间。
3、PVD的阀值触发有100mV的迟滞可能是为了消抖详见上面的PVD门限阀值图因此设置阀值时最好留一点余量。
4、如果PVD中断触发方式使用上升下降沿触发在电压不稳定的情况下可能会反复触发中断此时可以通过设置标志位来保证紧急代码只运行1次。

2 程序编写

参考测试代码

/**
  * @brief  This function handles the PVD Output interrupt request.
  * @param  None
  * @retval None
  */
void PVD_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line16) != RESET)
    {
        /* 掉电时运行的紧急代码 */
        printf("low power.\n");

        /* Clear the Key Button EXTI line pending bit */
        EXTI_ClearITPendingBit(EXTI_Line16);
    }
}

/**
  * @brief  Configures EXTI Lines.
  * @param  None
  * @retval None
  */
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    /* Configure EXTI Line16(PVD Output) to generate an interrupt on rising and falling edges */
    EXTI_ClearITPendingBit(EXTI_Line16);
    EXTI_InitStructure.EXTI_Line = EXTI_Line16;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}

/**
  * @brief  Configures NVIC and Vector Table base location.
  * @param  None
  * @retval None
  */
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    /* Enable the PVD Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void PVD_Init(void)
{    
    /* Enable PWR and BKP clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    /* Configure EXTI Line to generate an interrupt on falling edge */
    EXTI_Configuration();
    /* NVIC configuration */
    NVIC_Configuration();
    /* Configure the PVD Level to 2.9V */
    PWR_PVDLevelConfig(PWR_PVDLevel_2V9);
    /* Enable the PVD Output */
    PWR_PVDCmd(ENABLE);
}

int main(void)
{     
    uart_init(115200);
    PVD_Init();
    printf("init success.\n");
    while (1)
    {
    }
}

示例代码测试结果
在这里插入图片描述

结束语

上面的测试例子只是给大家做一个参考实际上需要根据项目的具体需求去补充细节这里就不再多说了。
好了关于STM32如何使用PVD掉电检测功能就介绍到这里如果你们还有什么问题欢迎评论区留言。

如果这篇文章能够帮到你就…懂的。
请添加图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“STM32 PVD掉电检测功能的使用方法” 的相关文章