【简介】
S32K3XX 系列系列有着丰富的RAM资源,本地使用的S32K328片内有三块SRAM,每块大小为256KB

对应的RAM 范围为0x20400000~204bffff,此地址范围和link file 中的定义的范围也是匹配的。

从芯片手册中可以看出SRAM0 的64KB支持standby 模式保存的属性,从说明可知RAM 支持ECC ,每64bit ram 数据对应 8bit 的ECC校验码,采用的ECC算法为SECDEC

对于64KB的Standby RAM link file 中有如下配置弱国超出64KB 会触发异常的断言。
__STANDBY_RAM_LIMIT_END = 0x2040FFFF; /* 64Kbyte for standby ram */
.sram_bss (NOLOAD) :
{
. = ALIGN(8);
__standby_ram_begin__ = .;
*(.standby_data)
. = ALIGN(8);
__standby_ram_end__ = .;
. = ALIGN(16);
__sram_bss_start = .;
*(.bss)
*(.bss*)
. = ALIGN(16);
*(.mcal_bss)
. = ALIGN(4);
__sram_bss_end = .;
} > int_sram
ASSERT(__standby_ram_end__ <= __STANDBY_RAM_LIMIT_END, "Memory for standby ram overflow")S32K3 系列芯片是支持ECC特性的,ECC 默认为开启状态,使用RAM资源前需要对RAM 进行ECC初始化处理,启动代码中有如下的初始化处理。
/******************************************************************/ /* Autosar Guidance - The start-up code shall initialize a */ /* minimum amount of RAM in order to allow proper execution of */ /* the MCU driver services and the caller of these services. */ /******************************************************************/ RamInit: /* Initialize SRAM ECC */ ldr r0, =__RAM_INIT cmp r0, 0 /* Skip if __RAM_INIT is not set */ beq SRAM_LOOP_END ldr r0, =MCRGM_DES ldr r1, [r0] ldr r2, =MCRGM_DES_F_POR and r1, r1, r2 cmp r1, 0 beq NO_INIT_STANDBY_REGION ldr r2, =__INT_SRAM_START ldr r3, =__INT_SRAM_END b ZERO_64B_RAM NO_INIT_STANDBY_REGION: #ifdef EXTEND_LOWRAM_DERIVATIVES #if defined(S32K310)||defined(S32K311)||defined(S32M276)||defined(S32M274) ldr r2, =__BSS_SRAM_NC_START #else ldr r2, =__BSS_SRAM_START #endif #else ldr r2, =__BSS_SRAM_START #endif ldr r3, =__INT_SRAM_END ZERO_64B_RAM: cmp r2, r3 bge SRAM_LOOP_END movs r0, 0 movs r1, 0 SRAM_LOOP: strd r0, r1, [r2], #8 cmp r2, r3 blt SRAM_LOOP SRAM_LOOP_END:
以上代码 RAM 的ECC 的初始化是否执行是根据__RAM_INIT flag 来决定是否进行初始化,此符号是在link file中进行的定义,默认值为1,对应代码如下:

我们可以修改__RAM_INIT = 0 来关闭RAM ECC 初始化处理。
上述初始化代码会根据当前启动是否为POR 重启,如果是POR 重启则对整片的SRAM进行初始化,如果为非POR重启则跳过standby 的RAM区域进行初始化。以下的代码根据是否初始化standby RAM 来配置初始化RAM 的开始结束地址。

上述的符号的定义也是在link file 中进行定义。

我要赚赏金
