[应用相关] STM32掉电保存配置参数技巧

[复制链接]
184|0
heimaojingzhang 发表于 2025-10-15 16:37 | 显示全部楼层 |阅读模式
一.介绍

        STM32掉电保存配置参数的方式有很多,可以外接EEPROM,也可以使用FLASH,前两种就不介绍了,这里笔者说一下使用芯片内置的备份寄存器(BKP)来实现。

        使用备份寄存器的跟前两种相比,优点是不需要外设,但是缺点也很明显,由于适用的是内置寄存器,能存储的数据也不多。

1148768ef1a6e91684.png

重点说明,备份寄存器并非完全不需要电源,上面的芯片图有个VBAT引脚就是连接电源的,只需要在开发板上连接一个纽扣电池就可以了。

二.使用方法

1.初始化

        备份寄存器并不是普通SRAM或Flash,它是RTC外设的一部分,他们存储在备用域,该域有独立电源VBAT供电,可以在MCU复位或断电后保存数据。

void BKPSRAM_int(void)
{
        // 1. 使能PWR时钟
        __HAL_RCC_BKPRAM_CLK_ENABLE();
    // 2. 允许访问备份寄存器
        HAL_PWR_EnableBkUpAccess();
        // 3. 允许备份寄存器掉电保存
        HAL_PWREx_EnableBkUpReg();                 
}       

RTC_HandleTypeDef hrtc; /* 这个一定要,操作寄存器需要RTC的句柄*/

/* RTC时钟的初始化可要可不要,有些STM32系列RTC时钟必须启用,一定要确保RTC有时钟源 */
void RTC_Init_Backup(void)
{
    // 1. 使能 RTC 时钟
    __HAL_RCC_RTC_ENABLE();

    // 2. RTC 初始化(可用默认参数,主要保证 Backup Registers 可用)
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    hrtc.Init.AsynchPrediv = 127;
    hrtc.Init.SynchPrediv = 255;
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    if (HAL_RTC_Init(&hrtc) != HAL_OK)
    {
        Error_Handler();
    }
}



2.读写

        在HAL库中,读写备份寄存器使用是HAL_RTCEx_BKUPWrit,HAL_RTCEx_BKUPRead函数。

        写函数有三个参数,一个是RTC句柄,一个是寄存器的编号,另一个是数据,我使用的stm32h7,总共就有32个寄存器。F1系列每个寄存器能存16位的数据,F2/F4/F7系列的寄存器可以存储32为数据。

/**
  * @brief  Write a data in a specified RTC Backup data register.
  * @param  hrtc RTC handle
  * @param  BackupRegister RTC Backup data Register number.
  *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 31 to
  *                                 specify the register.
  * @param  Data Data to be written in the specified Backup data register.
  * @retval None
  */
void HAL_RTCEx_BKUPWrite(const RTC_HandleTypeDef * hrtc, uint32_t BackupRegister, uint32_t Data)

//示例
HAL_RTCEx_BKUPWrite(&hrtc,0,1); //向寄存器0写入数据1



        读函数只有两个参数,一个是句柄,一个就是寄存器编号。返回值就是数据。

/**
  * @brief  Read data from the specified RTC Backup data Register.
  * @param  hrtc RTC handle
  * @param  BackupRegister RTC Backup data Register number.
  *          This parameter can be: RTC_BKP_DRx where x can be from 0 to 31 to
  *                                 specify the register.
  * @retval Read value
  */
uint32_t HAL_RTCEx_BKUPRead(const RTC_HandleTypeDef * hrtc, uint32_t BackupRegister)

//示例
uint32_t temp = HAL_RTCEx_BKUPRead(&hrtc,0);



————————————————
版权声明:本文为CSDN博主「德涵玉润」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hanhanhan233/article/details/152045039

您需要登录后才可以回帖 登录 | 注册

本版积分规则

112

主题

4379

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部