在嵌入式低功耗设计中,Standby RAM(待机保持内存)是芯片在深度休眠模式下仍能保持数据的关键硬件资源。但许多开发者苦于不同开发环境的配置差异,难以高效利用这一特性。
本文将以e2studio(瑞萨)、KEIL MDK(ARM)和IAR EW(IAR Embedded Workbench)三大主流开发环境为例,手把手教你在瑞萨RA6M4平台上实现“将变量精准分配至Standby RAM”的终极目标。对于其他内置Standby RAM的瑞萨RA系列MCU产品,均可参考本文的配置过程,并参考硬件手册做适当修改。本例中,Standby RAM的起始地址为0x28000000,大小为0x400。
01e2studio工程中
(1)在fsp.ld文件中添加以下内容,定义Standby RAM这部分区域:
(2)hal_entry.c中在R_BSP_WarmStart中添加以下内容,允许使用Standby RAM并进行初始化。
(3)代码编辑、编译&调试,并打开Memory窗口进行验证。
需要放置到Standby RAM区域的数据需要做特定的声明。例如:
uint8_t g_standby_ram_variable[512] BSP_PLACE_IN_SECTION(“.standby_ram”) = {0,1,2,3,4,5,6,7,8,9,10};
从下图中可以看到数组g_standby_ram_variable[512]的数据已经放在Standby RAM区域中。
02KEIL MDK工程中
(1)打开KEIL MDK工程,点击Option for Target
Target标签页Read/Write Memory Areas,定义一块区域
点击Linker标签页,取消链接勾选,自定义链接脚本,点击2处编辑
定义一片区域
(2)定义变量
uint8_t var00[10] __attribute__((section("SAMPLE_NAME_A")));
(3)代码中添加对这个变量的写入
(4)编译&调试,进行验证
从Memory窗口,可以看到放置在Standby RAM区域的变量被正常写入
03IAR EW工程中
(1)修改链接器配置文件(.icf)
在项目的链接器配置文件中定义Standby RAM区域和段:
define region STANDBY_RAM = mem:[from 0x28000000 to 0x280003FF];
define block STANDBY_BLOCK { section .standby_ram };
place in STANDBY_RAM { block STANDBY_BLOCK };
do not initialize { section .standby_ram};
(2)在代码中声明变量
使用__no_init关键字和#pragma location指令将变量分配到指定段:
#pragma location = ".standby_ram"
__no_init uint8_t g_standby_ram_variable[512];
(3)在用户代码中手动初始化,并赋值
(4)编译&调试,进行验证
从Memory窗口,确认变量地址和数值。
通过上述步骤,我们实现了三大开发环境下的Standby RAM变量配置。无论你使用e2studio、KEIL MDK还是IAR EW,核心逻辑始终一致:
编译器层:通过链接脚本隔离内存区域
代码层:结合复位类型检测实现按需初始化