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 选项字节;
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不能修改,有知道的小伙伴可以评论交流一下。