这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】SRAM ECC 初始化流程梳理

共1条 1/1 1 跳转至

【S32K3XX】SRAM ECC 初始化流程梳理

高工
2025-09-21 09:14:27     打赏

【简介】

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

image.png

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

image.png

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

image.png

对于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,对应代码如下:

image.png

我们可以修改__RAM_INIT = 0 来关闭RAM ECC 初始化处理。

上述初始化代码会根据当前启动是否为POR 重启,如果是POR 重启则对整片的SRAM进行初始化,如果为非POR重启则跳过standby 的RAM区域进行初始化。以下的代码根据是否初始化standby RAM 来配置初始化RAM 的开始结束地址。

image.png

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

image.png





共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]