你好
我正在尝试让 S32K312 中的 SRAM 存储器末尾(256 字节)在功能 RESET 后保留数据。
我通过修改链接器脚本来实现这一点,将ram_rsvd2(以及 __INT_SRAM_END)拉回 256 字节,这样启动汇编脚本就不会再清除最后 256 字节。
Hareesh_S_0-1787256254412.pngHareesh_S_0-1787256254412.pngHareesh_S_0-1787256254412.pngHareesh_S_0-1787256254412.pngHareesh_S_0-1787256254412.png
为了测试此功能,我切换了 2 个 GPIO/LED——一个用于指示 SRAM 内容已保留,另一个用于指示 SRAM 内容未保留/无效。
Hareesh_S_1-1787256280872.pngHareesh_S_1-1787256280872.pngHareesh_S_1-1787256280872.pngHareesh_S_1-1787256280872.pngHareesh_S_1-1787256280872.png
项目首次烧录时,似乎按预期工作——LED_01 在第一个周期内为高电平,随后 LED_02 在 RESET 周期后保持高电平。
不过,在冷启动时,两个 LED 灯都不亮——我可以确认这是因为 MCU 在尝试访问保留的 SRAM 区域中的地址时发生了硬故障。
我还注意到,当 MCU 运行时(发生硬故障)连接调试器时,我无法通过内存监视器单独读取/写入特定 SRAM 区域中的数据(它显示 ???? 而不是数据)。S32 Design Studio 和 Segger Ozone 都存在这个问题。
这种硬故障行为也不稳定,因为有时在冷启动时,项目可以按预期工作,LED_01 为高电平,但这种情况很少发生。
我附上了一个可以重现我问题的最小示例项目。如果能得到一些关于调试/更好地理解这种行为的帮助,那就太好了!
此致,
哈里什·S
你好,
我还注意到,当 MCU 运行时(发生硬故障)连接调试器时,我无法通过内存监视器单独读取/写入特定 SRAM 区域中的数据(它显示 ???? 而不是数据)。S32 Design Studio 和 Segger Ozone 都存在这个问题。
这意味着 RAM 内容丢失,并且 RAM 中包含 ECC 错误——RAM 未初始化。如果复位导致 RAM 内容被破坏,则取决于执行的是哪种复位操作。
检查 RMG [DES/ FES] 寄存器,查看发生了哪种 RESET。
petervlna_0-1787295026947.pngpetervlna_0-1787295026947.pngpetervlna_0-1787295026947.pngpetervlna_0-1787295026947.pngpetervlna_0-1787295026947.png
petervlna_1-1787295110517.pngpetervlna_1-1787295110517.pngpetervlna_1-1787295110517.pngpetervlna_1-1787295110517.pngpetervlna_1-1787295110517.png
当从 RAM 读取 ECC 错误时,会触发硬故障。
顺祝商祺!
Peter
你好@petervlna ,
谢谢你的解释。我知道 SRAM 中的内容会无效,但没想到这会导致硬故障。
我还有一个问题——当我的应用程序进入待机模式并通过唤醒事件退出时,MC_RGM DES/FES 标志均未设置。这是预期行为吗?如果答案是肯定的,我该如何确定MCU是否已退出待机状态?这条后续内容是否更适合另开一篇社区帖子?通过唤醒信号退出待机状态是否会在 RDSS 寄存器中反映出来?
你好 ,
查阅了其他社区帖子和参考手册后,我的理解是,我应该结合 RDSS 检查 MC_ME[PREV_MODE](实际上是 MC_ME.MODE_STAT)来判断 MCU 是否已从待机状态唤醒。
除非我理解有误,否则我认为这已经解答了我的疑问。
非常感谢大家的支持!
此致,
哈里什·S
你好,
是的,这是意料之中的。由 WKPU 事件引起的从 STANDBY 唤醒不一定会设置任何 MC_RGM DES 或 FES 标志。如果 MC_RGM 中未报告 RESET 状态,则确定设备是否从待机状态恢复的推荐方法是检查 MC_ME PREV_MODE 字段。
顺祝商祺!
Peter