打印
[APM32F4]

APM32F407备份SRAM的使用

[复制链接]
74|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2025-3-24 16:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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();才能修改备份域内容”
这个还没有注意到。
幸亏暂时使用这个功能,否则这得调试多久去啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

89

帖子

1

粉丝