簡體   English   中英

在重置皮質m3上保留一些RAM值

[英]keep some RAM values on reset cortex m3

單擊板上或Kiel上的Reset按鈕后,是否有任何方法可以保留一些ram值或全局變量

我正在使用STM32L152ZE

免責聲明:我是根據在其他芯片和工具鏈上進行此類操作的經驗回答的。 我不知道基爾或那特定部分。

取決於重置按鈕的功能。

如果它直接在MCU上觸發外部復位中斷,則您可能會在復位時保留所有RAM值,並且僅使用C運行時初始化將全局變量清零/重新初始化。 要驗證這一點,請查看數據表中有關復位,RAM以及可能的待機/低功耗模式的部分,以獲取詳細信息。 大多數現代MCU在所有這些主題中都給出了一個完整的頂層部分。

如果將其完全重置為電源(如完全消除了為芯片供電的所有電壓),則所有投注都將關閉。 如果是這樣,我認為唯一的選擇就是片上EEPROM。

您必須查看原理圖和/或檢查復位狀態寄存器才能獲得明確的答案。

因此,讓我們假設它的重置確實允許您保留RAM-如果是這樣,那么典型的步驟就可以了...

  1. 在鏈接器指令文件中添加一個未由C運行時初始化初始化的特殊節(或多個節?)。

  2. 使用#pragma語句圍繞變量定義/將其與變量定義關聯(例如,調出該特殊部分)。

  3. 啟動時,檢查重置原因代碼寄存器以了解RAM是否包含有效數據。

假設它們是兩個單獨編譯的程序,則需要做出類似的規定以防止引導加載程序也接觸RAM。

作為創建特殊部分的替代方法,Kiel 可能會提供C運行時啟動代碼的版本,該版本不會隱式地將任何全局變量“清零”,而是僅使用初始值初始化全局變量。 通常可以使用它來縮短啟動時間。 但是,您必須深入研究編譯器手冊(或只是編寫自己的C runt time init代碼)。

STM32L152ZE包括一個16 KB EEPROM和128字節的備份寄存器。

EEPROM就是這樣,並且不會遭受STM32寫入自己的閃存的問題,因為STM32在該處使總線停頓並因此在寫入和擦除模塊時執行代碼。

備用寄存器與設備的其余部分(以及RTC)位於單獨的電源域中,只要在該域中保留電源,就可以保留數據。 有一種保護機制,需要特定的順序來讀取和寫入這些寄存器。

如果您只是對您感興趣的復位幸免於難,那么我相信,只要通過復位保持電源(即不通過電源循環復位),就可以維護SRAM。 但是,默認情況下,Keil項目配置為在啟動時將所有IRAM段初始化為零。 您可以在項目設置中保留一個部分作為“ no-init”部分,並使用變量__attribute__擴展名在該部分或特定地址處顯式實例化變量。

如果您使用的是Keil IDE而不是使用自己的鏈接器配置文件,則它非常簡單。 在“目標-目標選項”中,有一個部分“讀/寫存儲區”,您在此處定義了一個新區域,所有未初始化的變量都將放置在該區域中。 例如,開始0x20000000和大小0x20,如果您的RAM從0x20000000開始並且您想在復位后保留前32個字節,請選中“ NoInit”框。 然后,在“目標的選項-鏈接器”中,確保選中“使用目標對話框的內存布局”選項,以便自動生成鏈接器SCT文件。

現在的最后一步是將變量放入0x20000000到0x20000020區域。您在項目的單個文件中聲明所有未初始化的變量。現在,在項目窗口中右鍵單擊文件名,然后選擇選項“ Options for文件“ xxx.c”,然后在存儲器分配中為ZI數據選擇0x20000000至0x20000020區域。 (希望您的未初始化變量在聲明期間未在代碼中分配任何值)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM