STM32 G4 HAL库 POR/PDR/BOR、PVD;实现掉电保存数据和掉电复位

STM32 G4 HAL库 POR/PDR/BOR、PVD;实现掉电保存数据和掉电复位

没啥好说的直接上代码首先是BOR(欠压复位)

/* BOR欠压复位配置函数*/
void BOR_Config(void)
{
   FLASH_OBProgramInitTypeDef  sConfigBOR = {0};
  
   /* 解锁FLAS,解锁OB */
   HAL_FLASH_Unlock();
   HAL_FLASH_OB_Unlock();
   
   /* 获取当前Option Byte配置 */
   HAL_FLASHEx_OBGetConfig(&sConfigBOR);
   
   if ((sConfigBOR.USERConfig & 0x700) != OB_BOR_LEVEL_4)      //检查掉电复位电平是否正确
  {
     sConfigBOR.OptionType = OPTIONBYTE_USER;
     sConfigBOR.USERType   = OB_USER_BOR_LEV;
     sConfigBOR.USERConfig = OB_BOR_LEVEL_4;                   //设置掉电复位电平
     HAL_FLASHEx_OBProgram(&sConfigBOR);

     /* 开始对选项字节进行编程 */
     HAL_FLASH_OB_Launch();
  }
   /* 锁定Flash,锁定OB */
   HAL_FLASH_OB_Lock();
   HAL_FLASH_Lock();

}

如果只有一个芯片要改的话起始还可以使用STM32CubeProgrammer修改,因为BOR实际上是Option Bytes 选项字节;
STM32CubeProgrammer修改 Option Bytes
PVD可编程电源检测器

/* PVD可编程电源检测器初始化配置函数*/
void PVD_Config(void)
{
   /* 配置PWR时钟 */
    __HAL_RCC_PWR_CLK_ENABLE();
   
   /* 配置中断优先级,使能PVD中断 */
    HAL_NVIC_SetPriority(PVD_PVM_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(PVD_PVM_IRQn);
 
    /* 设置PVD电平,设置中断类型:低于设置电平产生上升沿,高于设置电平产生下降沿 */
    PWR_PVDTypeDef sConfigPVD;
    sConfigPVD.PVDLevel = PWR_PVDLEVEL_6;                // LEVEL_0 - 2.0V
    sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;    //电源欠压,恢复均产生中断
   
      if (HAL_PWR_ConfigPVD(&sConfigPVD) != HAL_OK)
     {
       Error_Handler();
     }
 
    /* 使能PVD */
    HAL_PWR_EnablePVD();
}

/* PVD可编程电源检测器中断回调函数*/
void HAL_PWR_PVDCallback(void)
{
   PWR_PVDTypeDef sConfigPVD;
   if(__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO))     //判断是 欠压 OR 电压恢复
   {  
      /* 配置判断 电源恢复的参考电平 */
      sConfigPVD.PVDLevel = PWR_PVDLEVEL_6;                 //LEVEL_6 - 2.9V
      sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
      HAL_PWR_ConfigPVD(&sConfigPVD);
      
      /* 当VDD低于设定阈值(欠压) 时执行的代码, */
      
      
   }
   else
   {
      /* 配置 判断电源欠压的参考电平 */
      sConfigPVD.PVDLevel = PWR_PVDLEVEL_0;                 //LEVEL_0 - 2.0V
      sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
      HAL_PWR_ConfigPVD(&sConfigPVD);
      
      /* 当VDD高于设定阈值(电源恢复)时执行的代码 */
      
      
   }
}

查了资料好像PDR/POR对应的VPDR/VPOR不能修改,有知道的小伙伴可以评论交流一下。
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值