微控制器異常復位後如何儲存變數資料

2021-10-06 03:05:37 字數 1494 閱讀 9028

1、理論

2、實踐

眾所周知,微控制器復位後變數數值會自動初始化,以華大半導體hc32l136為例,具有 7

個復位訊號**,每個復位訊號都可以讓

cpu

重新執行,絕大多數暫存器會被復位到復位值,程式會從復位向量處開始執行。

每個復位源由相應的復位標誌進行指示,復位標誌均由硬體置位,需要使用者軟體清零。

本篇部落格主要講授華大半導(stm32、c51等微控制器均可適用)復位(以看門狗復位為例)後變數資料儲存的方法。

這裡將用到__not_init屬性,其用於變數宣告,可禁止系統啟動時變數的初始化,有了__not_init屬性,編譯器只給指定變數分配空間,不會再初始化。

__not_init的兩種定義方式如下所示:

方式1:不指定儲存位置,由編譯器分配

__no_init 型別 變數名; ///< 例如:__no_init uint8_t cou_num;

方式2:指定儲存位置

實踐描述:使用__no_init屬性建立乙個變數cou_num,其將資料儲存在sram中,每隔300毫秒自加1並通過串列埠列印輸出數值,當檢測到上電復位和按鍵復位後,變數cou_num數值置為0,在看門狗復位下變數cou_num數值不變。

第1步:配置串列埠引腳、串列埠使能和串列埠中斷,**如下所示:

///< 串列埠引腳配置

///< 串列埠配置

///< uart1中斷函式

void uart1_irqhandler(void)

}

第2步:配置看門狗復位,每隔820毫秒若沒有餵狗,則復位,**如下所示:

///< wdt初始化配置

第3步:使用__no_init屬性定義cou_num變數,將陣列儲存在sram暫存器0x20001000中,**如下所示:

__no_init uint8_t cou_num @ 0x20001000;
第4步:新增上電復位源和reset腳復位源檢測,當檢測到其中之乙個復位的時候,cou_num置為0,**如下所示:

int32_t main(void)

while (1)}}

執行效果如下所示:

可見雖然看門狗每隔820毫秒復位一次,但是cou_num數值不收影響,但是也可以看出cou_num數值中間存在丟失,例如沒有列印輸出數值3,主要原因是執行到此數時,恰巧看門狗復位,所以串列埠未來得及列印,但是不影響cou_num計數。

51微控制器的復位引腳 51微控制器復位後的狀態

微控制器的復位操作使微控制器進入初始化狀態,其中包括使程式計數器pc 0000h,這表明程式從0000h位址單元開始執行。微控制器冷啟動後,片內ram為隨機值,執行中的復位操作不改變片內ram區中的內容,21個特殊功能暫存器復位後的狀態為確定值,見下表。值得指出的是,記住一些特殊功能暫存器復位後的主...

51微控制器的復位引腳 如何控制51微控制器的引腳

控制微控制器的引腳,分為兩個知識點,乙個是怎麼讓引腳微控制器輸出高低電平,乙個是怎麼檢測接入到引腳上的電平是高還是低。我們有時候會聽到這樣的話 此微控制器有幾個io口?這裡說的io口,就是輸入 input 輸出 output 介面。一般情況下,微控制器的引腳當中,除了電源引腳和晶振引腳,其它的都是i...

微控制器如何用C申請乙個固定位址的變數

微控制器c語言如何申請乙個固定位址的變數 一 各系列微控制器通用性的寫法 指標指向位址法 rstu1 指標變數名 rstu2 指標變數名 addr1 實際位址 如10 addr2 實際位址 如11 int8 prstut1 addr1 申請乙個8位指標變數 變數名為prstut1 int16 prs...