01問題的描述
某客戶使用 STM32G071 芯片從 standby 模式下喚醒,想要 SRAM 的數據在退出 standby模式后得以保持。根據手冊的描述,配置了相應的比特位,但是發現數據仍然保持不了。
02問題的復現
根據客戶的描述,以及 STM32G071 的最新版參考手冊 RM0444 發現,在 standby 模式下,可以通過設置 PWR_CR3 的 RRS 比特位去控制 SRAM 的保持能力,相應的 API 接口函數為HAL_PWREx_EnableSRAMRetention()、HAL_PWREx_DisableSRAMRetention() ;
基于例程
......STM32CubeRepositorySTM32Cube_FW_G0_V1.6.1ProjectsNUCLEOG071RBExamplesPWRPWR_STANDBYEWARM
以及相應的 NUCLEO-G071 開發板,修改部分代碼,根據 LED4 的閃爍頻率去判斷從 Standby 模式退出后,SARM 里面的數據是否能夠保持住。
03問題的排查
基于上述的配置,簡單的測試了一下,發現即使 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 中。
04問題的解決
知道原因之后,相應的措施也就明朗了,修改 icf 文件如下:
并將想要保持的 SRAM 中的數據前面加關鍵字__no_init :
再次下載程序,發現 LED4 的閃爍頻率跟隨 RRS 比特位值的不同而不同,符合預期。另外在實現的過程中,需要說明兩點的是:
1、修改 icf 后,可以通過 map 文件查看,應如下文所示,如果發現“P2”mismatch 之類的提示,檢查下該 section 中的變量,如上面提到的 sram_magic_word,可能被編譯器優化了,在map 中也搜索不到該名稱,則可以在實際的代碼中使用該變量進行一些運算或判斷,然后重新編譯即可解決。
2、當調試器連著 IAR 調試界面運行的時候,無論 RRS 的值設置為 0 或 1,G071 從standby 模式下退出后,SRAM 中的內容均可以保持,如果需要驗證 RRS 的值的影響,則建議斷開調試器,讓程序 free-running ,可以通過比如 LED 的閃爍頻率去判斷結果。
審核編輯:湯梓紅
-
芯片
+關注
關注
455文章
50816瀏覽量
423615 -
接口
+關注
關注
33文章
8598瀏覽量
151157 -
sram
+關注
關注
6文章
767瀏覽量
114690 -
STM32
+關注
關注
2270文章
10900瀏覽量
356011 -
代碼
+關注
關注
30文章
4788瀏覽量
68612
原文標題:實戰經驗 | STM32G071 從 standby 模式退出后的 SRAM 數據保留
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論