LAT1278
Local Application Tips
LAT1278 Rev 1.0 Jun. 2023
STM32G071 standby 模式退出后的 SRAM 数据保留
关键字:STM32G071xxSRAM, StandbyRRS
1.问题的描述
某客户使用 STM32G071 芯片从 standby 模式下唤醒,想要 SRAM 的数据在退出 standby
模式后得以保持。根据手册的描述,配置了相应的比特位,但是发现数据仍然保持不了。
2.问题的复现
根据客户的描述,以及 STM32G071 的最新版参考手册 RM0444 发现,在 standby 式下,
可以通过设置 PWR_CR3 RRS 比特位去控制 SRAM 的保持能力,相应的 API 接口函数为
HAL_PWREx_EnableSRAMRetention()HAL_PWREx_DisableSRAMRetention() ;
基于例程......\STM32Cube\Repository\STM32Cube_FW_G0_V1.6.1\Projects\NUCLEO-
G071RB\Examples\PWR\PWR_STANDBY\EWARM 以及相应的 NUCLEO-G071 开发板,修改
部分代码,根据 LED4 的闪烁频率去判断 Standby 模式退出后,SARM 里面的数据是否能够保
持住。
LAT1278
LAT1278 - Rev 1.0 page 2/4
3.问题的排
基于上述的配置,简单的测试了一下,发现即使 HAL_PWREx_EnableSRAMRetention() 使
能了,但是测试代码中 sram_magic_word 的值没有保持住,显示的是 LED4 的闪烁频率为
1s
究竟是什么原因导致了数据没有保持住呢,再次查看参考手册,确定了只要使能 PWR_CR3
RRS 比特位即能保持住,对比了 PWR_CR3 RRS 比特位的说明, standby 式下,
SRAM 的数据可以保持,但是当退出 standby 模式呢?
由于测试的是从 standby 模式退出,standby 模式退出后会进行 reset,该复位导致 SRAM
的数据被覆盖或丢失?通过查阅资料,发现是编译器的配置导致的。以 IAR 为例,查看其默认的
脚本文件 icf
也就是说,在程序执行的时候,会 readwrite 的数据进行自动的初始化,而具有.noint 性质
的块则不初始化,所以这儿还需要 SRAM 里面要保持的数据放置在.noinit section 中。
4.问题的解决
知道原因之后,相应的措施也就明朗了,修改 icf 文件如下: