三大开发环境下的Standby RAM变量配置教程

天资达人 科技创新 2025-07-07 4380 0

嵌入式低功耗设计中,Standby RAM(待机保持内存)是芯片在深度休眠模式下仍能保持数据的关键硬件资源。但许多开发者苦于不同开发环境的配置差异,难以高效利用这一特性。

本文将以e2studio(瑞萨)、KEIL MDK(ARM)和IAR EW(IAR Embedded Workbench)三大主流开发环境为例,手把手教你在瑞萨RA6M4平台上实现“将变量精准分配至Standby RAM”的终极目标。对于其他内置Standby RAM的瑞萨RA系列MCU产品,均可参考本文的配置过程,并参考硬件手册做适当修改。本例中,Standby RAM的起始地址为0x28000000,大小为0x400。

9fbe7cfc-5630-11f0-b147-92fbcf53809c.png

01e2studio工程中

(1)在fsp.ld文件中添加以下内容,定义Standby RAM这部分区域:

9fe97e98-5630-11f0-b147-92fbcf53809c.png

(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区域中。

a0183152-5630-11f0-b147-92fbcf53809c.png

02KEIL MDK工程中

(1)打开KEIL MDK工程,点击Option for Target

a0319d72-5630-11f0-b147-92fbcf53809c.png

Target标签页Read/Write Memory Areas,定义一块区域

a09da2f6-5630-11f0-b147-92fbcf53809c.png

点击Linker标签页,取消链接勾选,自定义链接脚本,点击2处编辑

a0b1fe22-5630-11f0-b147-92fbcf53809c.png

定义一片区域

a0d5bdda-5630-11f0-b147-92fbcf53809c.png

(2)定义变量

uint8_t var00[10] __attribute__((section("SAMPLE_NAME_A")));

(3)代码中添加对这个变量的写入

a0e3a5c6-5630-11f0-b147-92fbcf53809c.png

(4)编译&调试,进行验证

从Memory窗口,可以看到放置在Standby RAM区域的变量被正常写入

a0f4d954-5630-11f0-b147-92fbcf53809c.png

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)在用户代码中手动初始化,并赋值

a10bb750-5630-11f0-b147-92fbcf53809c.png

(4)编译&调试,进行验证

从Memory窗口,确认变量地址和数值。

a11d136a-5630-11f0-b147-92fbcf53809c.png

通过上述步骤,我们实现了三大开发环境下的Standby RAM变量配置。无论你使用e2studio、KEIL MDK还是IAR EW,核心逻辑始终一致:

编译器层:通过链接脚本隔离内存区域

代码层:结合复位类型检测实现按需初始化