[APM32F4] APM32F407备份SRAM的使用

[复制链接]
 楼主| Alden 发表于 2025-3-24 16:04 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2025-3-24 16:04 编辑

#技术资源#
APM32F407的RAM分系统192KB+备份4KB
就研究了下备份SRAM该怎么使用
1742802364477.png
一、备份SRAM的作用
  • 数据保持
    备份SRAM由VBAT引脚供电,即使主电源(VDD)断开,只要VBAT(备用电池)存在,数据仍可保留。
    • 典型场景:系统掉电、待机模式(Standby Mode)或复位时保存关键数据。
  • 低功耗特性
    在低功耗模式下(如Standby模式),备份SRAM可通过VBAT保持数据,同时主SRAM会被断电。
  • 独立访问
    备份SRAM与主SRAM分离,不受内核复位或系统复位的影响,数据更安全。

二、应用场景
  • 关键数据存储
    • 系统配置参数(如校准数据、用户设置)
    • 运行日志或错误记录(需掉电不丢失)
    • 实时时钟(RTC)相关数据(配合RTC模块使用)
  • 低功耗模式
    • 在Standby或Stop模式下保存临时数据,唤醒后快速恢复。
  • 容错系统
    • 作为故障恢复时的数据备份,例如看门狗复位后恢复现场。



三、使用方法步骤1:硬件准备
  • 确保VBAT引脚连接备用电池(如纽扣电池),否则备份SRAM在VDD掉电后会丢失数据。
步骤2:使能备份域访问
  1.     PMU_EnableBackupAccess();
步骤3:初始化备份SRAM时钟
  1.   RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_BKPSRAM);
步骤4:数据读写在头文件中已经有了备份RAM的地址定义
// 定义备份SRAM基地址(固定为0x40024000)#define BKPSRAM_BASE 0x40024000
  1. // 写入数据
  2. *(__IO uint32_t*)(BKPSRAM_BASE + 0x00) = 0x12345678;

  3. // 读取数据
  4. uint32_t data = *(__IO uint32_t*)(BKPSRAM_BASE + 0x00);
在SDK的RTC_Alarm例程中增加备份RAM的使用进行测试。

  1. uint32_t data ;
  2. int main(void)
  3. {
  4.     USART_Config_T usartConfigStruct;

  5.     usartConfigStruct.baudRate = 115200;
  6.     usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  7.     usartConfigStruct.mode = USART_MODE_TX;
  8.     usartConfigStruct.parity = USART_PARITY_NONE;
  9.     usartConfigStruct.stopBits = USART_STOP_BIT_1;
  10.     usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  11.     APM_COMInit(COM1, &usartConfigStruct);

  12.     APM_LEDInit(LED2);
  13.     APM_LEDInit(LED3);
  14.     APM_LEDOff(LED2);
  15.     APM_LEDOff(LED3);

  16.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);

  17.     /* Allow access to RTC */
  18.     PMU_EnableBackupAccess();

  19.                 RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_BKPSRAM);

  20.     /* Enable the LSI OSC */
  21.     RCM_EnableLSI();

  22.     /* Reset RTC*/
  23.     RTC_Reset();

  24.     /* Config RTC */
  25.     RTC_Init();

  26.     /* Config Alarm */
  27.     RTC_AlarmsConfig();
  28.                 *(__IO uint32_t*)(BKPSRAM_BASE + 0x00) = 0x12345678;
  29.     printf("Please wait 5 seconds\r\n");
  30.     Delay(10000);
  31.     /* Alarm Enable */
  32.     RTC_EnableAlarmA();
  33.     APM_LEDOn(LED2);

  34.     /* wait until time out */
  35.     while(RTC_ReadStatusFlag(RTC_FLAG_ALRAF)==RESET);

  36.     printf("Time out\r\n");
  37.                 data = *(__IO uint32_t*)(BKPSRAM_BASE + 0x00);
  38.     printf("data=%x\r\n",data);
  39.     APM_LEDOff(LED2);
  40.     while(1)
  41.     {
  42.        APM_LEDToggle(LED3);
  43.        Delay(0x4FFFFF);
  44.     }
  45. }
测试结果:
微信图片_20250324160231.png
四、注意事项
  • 供电要求
    • 必须为VBAT提供备用电源,否则备份SRAM无法保持数据。
  • 访问权限
    • 每次复位后需重新调用   PMU_EnableBackupAccess();才能修改备份域内容。
  • 内存范围
    • STM32F407的备份SRAM大小为4KB,地址范围:0x40024000 ~ 0x40024FFF。
  • 数据校验
    • 建议添加CRC校验或软件冗余,防止数据意外损坏。

五、扩展应用
  • 与RTC配合:将RTC的闹钟时间、计数器等数据存入备份SRAM。
  • 快速启动:在Standby模式下保存上下文,缩短唤醒后的初始化时间。
通过合理利用备份SRAM,可显著提升系统的可靠性和低功耗性能。






风暴之眸 发表于 2025-3-25 22:35 | 显示全部楼层
“每次复位后需重新调用   PMU_EnableBackupAccess();才能修改备份域内容”
这个还没有注意到。
幸亏暂时使用这个功能,否则这得调试多久去啊
黎明热忱 发表于 2025-3-27 19:12 | 显示全部楼层
备份区的SRAM还不是直接访问啊!
我还想着把这部分地址区域放置到sct文件里面呢!
jobszheng 发表于 2025-3-29 09:45 | 显示全部楼层
之前使用的是RTC的备份寄存器,还真没有使用过备份RAM的空间。
星辰伴梦 发表于 2025-4-7 20:35 | 显示全部楼层
特别是对于低功耗和数据保持的需求,这些信息非常关键。
分形梦想家 发表于 2025-4-28 18:30 | 显示全部楼层
把关键运行数据保存在备份RAM中,等唤醒后,再写回去,以恢复运行的上下文
 楼主| Alden 发表于 2025-4-30 09:42 | 显示全部楼层
分形梦想家 发表于 2025-4-28 18:30
把关键运行数据保存在备份RAM中,等唤醒后,再写回去,以恢复运行的上下文 ...

是这样应用的
分形梦想家 发表于 2025-5-29 17:39 | 显示全部楼层
我还没有去看datasheet。备份RAM中有没有ECC功能?
雾里闲逛 发表于 2025-5-30 09:16 | 显示全部楼层
备份RAM,只要备用供电存在,其运行数据即可保存
涡流远见者 发表于 2025-5-31 08:56 | 显示全部楼层
备份域RAM在watchdog复位的时候,其内容会被擦除吗?
星云避风港 发表于 2025-5-31 14:44 | 显示全部楼层
备份RAM都用来保存啥数据啊
天鹅绒星星 发表于 2025-7-6 12:03 | 显示全部楼层
学习到了。
楼主提醒了,备份的数据要添加校验,以保证数据的完整性。
我们也使用了备份RAM空间,但没有添加校验。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

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