你好,
当我使用 PE Micro 调试 S32K344 时,我发现了一个数组(__attribute__ ((section(".standby_data")))位于备用 RAM 段中的 volatile uint32_t WkupSourcestatus1[64];) 在进入 main() 时被意外修改。然后,如附图所示,我手动修改了寄存器,重新初始化了备用 RAM 区域。数据已正确初始化为 0,进入 main() 函数后,一切运行正常。但是,RESET 后,当我进入 Reset_Handler 时,WkupSourcestatus1 数组中的数据又被修改了。为什么会发生这种情况?我注意到数组中出现了大量的 0x5AA55AA5 值。这是否与 SBAF_BOOT_MARKER 有关?我在另一块电路板上测试过,现象相同。
8.png8.png8.png8.png8.png8.png8.png
然后我改用 J-Link 进行调试,发现调试过程中 RESET 时没有出现异常。但是,在重新启动调试会话后,备用 RAM 区域中的所有数据都会变成 0xDEADBEEF。这是预期行为吗?
S32K344
S32DS3.6.4
RTD700
PE 版本 6.0.8
BR,
杰森
HI
抱歉回复晚了,最近需要处理的咨询很多。
我建议您参考有关S32K311 待机 RAM 保留的讨论,了解如何使用待机 RAM。
此致敬礼,
Robin
RESET 期间备用 RAM 的内容将保持不变,您观察到的值应该是 MCU RESET 前的内容。
=======================================================================================
RAM 由 SRAM 存储器和 TCM 集成而成。部分SRAM内存处于待机状态
模式。这意味着将MCU设置为待机模式后,该存储器中的内容将被保留。这
S32K3产品系列利用了ARM Cortex M7架构的TCM特性,其主要目的是
为核心提供确定性的访问时间,以便访问一些重要数据,避免访问延迟。这
该特性可在实时操作系统中加以利用。
如前所述,由待机功能域提供的存储在待机 SRAM 存储器中的数据在以下情况下会被保留:
MCU处于待机模式,唤醒后即可使用。但 Run 提供的 SRAM 中的数据却来自这里。
功能域不可用,需要在唤醒后进行初始化,以避免 ECC 错误。很重要
需要指出的是,唤醒后,待机 SRAM 不需要初始化以避免 ECC 错误,但是
SRAM 的其余部分确实需要它,因此应该在启动代码中进行适当的区分。一个
以下代码示例说明了如何进行这种区分。
嗨,杰森,
J-Link : 0xDEADBEEF — 来自 JLinkScript 的 ECC 初始化
这是预期行为,由 J-Link 的 `S32K344.jlinkscript` 中内置的 ` SetupTarget ()` 函数执行。请检查日志中是否存在类似以下内容的条目:
SetupTarget() start
Initializing ECC RAM...
RAMCodeAddr: 0x20000000 RAMInitAddr: 0x20000010 RAMInitSize: 0x00007FF0
InitPattern: 0xDEADBEEF ECC RAM initialized successfully
Initializing ECC RAM...
RAMCodeAddr: 0x20000000 RAMInitAddr: 0x20400000 RAMInitSize: 0x00004000
InitPattern: 0xDEADBEEF ECC RAM initialized successfully ← Standby RAM!
SetupTarget() end - Took 25.3ms
我不确定PEMicro是否有类似的机制,但以下是控制台日志:
;begin_cs device=$00400000, length=$003F4000, ram=$20400000
Loading programming algorithm ...
看起来,闪存编程算法会暂时加载到地址 $20400000(备用 RAM 的起始地址)的 RAM 中执行。
您可能需要向PEMicro 技术支持进一步核实。您有PEMicro账户吗?或者您希望我帮您查询一下?