stm32g0 电源监控-踩坑总结

目录

一、背景

1. mcu 和 sdk 库

  • stm32g0 系列单片机
  • stm32 hal

2. 应用背景

在硬件产品运行的过程中,可能会遇到异常情况,导致mcu 供电电压突然变化,如果程序不能快速响应,可能会导致设备出现异常。传统的依靠adc 检测外部电压的方法,会存在检测不及时的问题。

3. stm32g0 提供的电源监控方案

stm32g0 系列单片机对电源监控提供了两类处理方案:

  • 满足特定电压mcu复位
  • 可编程电压监控器,电压达到门限,产生中断

二、电源监控器-复位

  • 上电复位(POR)
  • 掉电复位 (PDR)
  • 欠压复位(BOR)

POR/PDR 在所有功率模式下都有效。BOR 只能通过选项字节使能或禁止,其在关断模式下不可用。

1. 电气特征

在这里插入图片描述

2. 上电复位(POR)

上电复位(POR ,power-on reset )在mcu 电压低于1.70v 时,即会产生上电复位,如果mcu 一直处于这个电压,mcu 会一直处于复位状态。

3. 掉电复位( PDR)

掉电复位( PDR, power-drop reset)当mcu 在正常工作状态时,供电电压低于 1.69v 时,即会产生掉电复位。

4. 欠压复位(BOR)

上电复位和掉电复位的电压是固定的,可以理解成 mcu正常工作的极限情况。mcu 也提供了欠压复位(BOR, Brownout reset)的机制。

欠压复位允许在选项字寄存器配置欠压复位的阈值,并且提供了上升沿阈值电压和下降沿阈值电压可配置。

上升沿电压

阈值
上升沿电压1约2.1v
上升沿电压2约2.3v
上升沿电压3约2.6v
上升沿电压4约2.9v

下降沿电压

阈值
下降沿电压1约2.0v
下降沿电压2约2.2v
下降沿电压3约2.5v
下降沿电压4约2.8v

三、可编程电压检测器(PVD)

1.概念

可编程电压检测器 ( PVD, Programmable voltage detector) : 用户可以在程序中设置需要检测的电压等级,当电压上升或下降到该等级时,mcu 会产生标志位或者中断。

中断

PVD 产生的事件在内部连接到EXTI16

2. 电源电压检测器阈值

2.1上升阈值

阈值电压
level0约2.1v
level1约2.2v
level2约2.5v
level3约2.6v
level4约2.7v
level5约2.9v
level6约3.0v

2.2下降阈值

阈值电压
level0约2.0v
level1约2.2v
level2约2.4v
level3约2.5v
level4约2.6v
level5约2.8v
level6约2.9v

3. 编程实现

3.1 配置pvd

void device_pvd_conf( void )
{
    PWR_PVDTypeDef  pvd_conf = {0, 0};

    __HAL_RCC_PWR_CLK_ENABLE();
    HAL_NVIC_SetPriority( PVD_VDDIO2_IRQn, 0, 0 );
    HAL_NVIC_EnableIRQ( PVD_VDDIO2_IRQn );

    //falling 
    pvd_conf.Mode =  PWR_PVD_MODE_IT_FALLING;
    //level 6 ,vol = 2.9v
    pvd_conf.PVDLevel  = PWR_PVDLEVEL_FALLING_6;

    HAL_PWREx_ConfigPVD( &pvd_conf );
    HAL_PWREx_EnablePVD();
}

3.3 实现中断接口


void HAL_PWREx_PVD_PVM_Falling_Callback( void )
{
    // input your code
    HAL_PWREx_DisablePVD();
}
3.3.1 满足阈值电压时,接口函数没回调

我在中断接口这里踩了个坑。

HAL_PWREx_PVD_PVM_Falling_Callback 本来是stm32g0xx_hal_pwr_ex.c 里面定义的一个弱函数,它由HAL_PWREx_PVD_PVM_IRQHandler 调用。

我一开始以为实现了这个弱函数,功能就实现了。谁知道,当电压满足阈值电压时,并没有调用这个函数。

3.3.2找exti 的中断响应函数

查看exti 的中断响应函数,发现只有 EXTI0_1_IRQHandlerEXTI2_3_IRQHandler EXTI4_15_IRQHandler 发现并没有 pvd 事件对应的line16 处理函数。

3.3.3查看 库函数 HAL_PWREx_PVD_PVM_IRQHandler 的注释

在这里插入图片描述

上面注释提到,HAL_PWREx_PVD_PVM_IRQHandler 函数需要被 PVD_IRQHandler 函数调用。我参照注释的说明做了,也没效果。其实没效果也是对的。PVD_IRQHandler 并不是系统认可的中断向量表的成员,产生中断也不会调用它。看来st 的工程师也喜欢复制粘贴。

3.3.4查看启动文件的中断向量表,找到了解决办法

向量表如下所示

在这里插入图片描述

pvd 事件,对应中断向量表的是 PVD_VDDIO2_IRQHandler 函数,所以HAL_PWREx_PVD_PVM_IRQHandler 需要在 PVD_VDDIO2_IRQHandler 下面调用。

pvd 中断对应的中断号是

 PVD_VDDIO2_IRQn             = 1,      /*!< PVD through EXTI line 16, PVM (monit. VDDIO2) through EXTI line 34*/

3.4 pvd 事件对于的中断服务函数

void PVD_VDDIO2_IRQHandler( void )
{
    HAL_PWREx_PVD_PVM_IRQHandler();
}

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdut_llkkyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值