Alden 发表于 2025-3-24 16:04

APM32F407备份SRAM的使用

本帖最后由 Alden 于 2025-3-24 16:04 编辑

#技术资源#
APM32F407的RAM分系统192KB+备份4KB
就研究了下备份SRAM该怎么使用

一、备份SRAM的作用
[*]数据保持
备份SRAM由VBAT引脚供电,即使主电源(VDD)断开,只要VBAT(备用电池)存在,数据仍可保留。
[*]典型场景:系统掉电、待机模式(Standby Mode)或复位时保存关键数据。

[*]低功耗特性
在低功耗模式下(如Standby模式),备份SRAM可通过VBAT保持数据,同时主SRAM会被断电。
[*]独立访问
备份SRAM与主SRAM分离,不受内核复位或系统复位的影响,数据更安全。
二、应用场景
[*]关键数据存储
[*]系统配置参数(如校准数据、用户设置)
[*]运行日志或错误记录(需掉电不丢失)
[*]实时时钟(RTC)相关数据(配合RTC模块使用)

[*]低功耗模式
[*]在Standby或Stop模式下保存临时数据,唤醒后快速恢复。

[*]容错系统
[*]作为故障恢复时的数据备份,例如看门狗复位后恢复现场。



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

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

    usartConfigStruct.baudRate = 115200;
    usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    usartConfigStruct.mode = USART_MODE_TX;
    usartConfigStruct.parity = USART_PARITY_NONE;
    usartConfigStruct.stopBits = USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    APM_COMInit(COM1, &usartConfigStruct);

    APM_LEDInit(LED2);
    APM_LEDInit(LED3);
    APM_LEDOff(LED2);
    APM_LEDOff(LED3);

    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);

    /* Allow access to RTC */
    PMU_EnableBackupAccess();

                RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_BKPSRAM);

    /* Enable the LSI OSC */
    RCM_EnableLSI();

    /* Reset RTC*/
    RTC_Reset();

    /* Config RTC */
    RTC_Init();

    /* Config Alarm */
    RTC_AlarmsConfig();
                *(__IO uint32_t*)(BKPSRAM_BASE + 0x00) = 0x12345678;
    printf("Please wait 5 seconds\r\n");
    Delay(10000);
    /* Alarm Enable */
    RTC_EnableAlarmA();
    APM_LEDOn(LED2);

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

    printf("Time out\r\n");
                data = *(__IO uint32_t*)(BKPSRAM_BASE + 0x00);
    printf("data=%x\r\n",data);
    APM_LEDOff(LED2);
    while(1)
    {
       APM_LEDToggle(LED3);
       Delay(0x4FFFFF);
    }
}测试结果:

四、注意事项
[*]供电要求
[*]必须为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都用来保存啥数据啊
页: [1]
查看完整版本: APM32F407备份SRAM的使用