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,可显著提升系统的可靠性和低功耗性能。
“每次复位后需重新调用 PMU_EnableBackupAccess();才能修改备份域内容”
这个还没有注意到。
幸亏暂时使用这个功能,否则这得调试多久去啊
备份区的SRAM还不是直接访问啊!
我还想着把这部分地址区域放置到sct文件里面呢! 之前使用的是RTC的备份寄存器,还真没有使用过备份RAM的空间。 特别是对于低功耗和数据保持的需求,这些信息非常关键。 把关键运行数据保存在备份RAM中,等唤醒后,再写回去,以恢复运行的上下文 分形梦想家 发表于 2025-4-28 18:30
把关键运行数据保存在备份RAM中,等唤醒后,再写回去,以恢复运行的上下文 ...
是这样应用的 我还没有去看datasheet。备份RAM中有没有ECC功能? 备份RAM,只要备用供电存在,其运行数据即可保存 备份域RAM在watchdog复位的时候,其内容会被擦除吗? 备份RAM都用来保存啥数据啊
页:
[1]