1、關于復位
說到復位,我們都不會陌生,對于一個MCU系統,復位電路是必不可少的一部分。復位的種類有很多:上電復位、低電壓復位、引腳復位、看門狗復位、軟件復位等等。本文說的內核復位是軟件復位的一種。
Cortex-M3內核芯片提供了兩種軟件復位,分別是系統復位和內核復位,而Cortex-M0+內核芯片只提供了系統復位,內核復位不支持,只能軟件模擬。
2、系統復位和內核復位的區別
內核復位:只復位內核處理器,而不復位外設如GPIO、Timer、UART、Flash等的寄存器。
系統復位:既復位內核處理器,又復位外設寄存器。
下面分別是Cortex-M3和Cortex-M0+的應用程序中斷及復位控制寄存器(AIRCR)配置圖,從圖中可以看出,置位AIRCR寄存器中的SYSRESETREQ位(位偏移:2),即可實現系統復位;置位VECTRESET位(位偏移:0),即可實現內核復位。Cortex-M0+中沒有VECTRESET的定義,故不支持內核復位。本文會介紹一種軟件模擬內核復位的方法。
圖1 Cortex-M3應用程序中斷及復位控制寄存器(AIRCR)
圖2 Cortex-M0+應用程序中斷及復位控制寄存器(AIRCR)
系統復位在ARM官方的庫文件中都有提供相關的函數,用戶直接調用即可。官方給出的系統復位函數定義如下所示:
內核復位在ARM官方的庫文件中沒有相關的函數,需要用戶自行編寫。Cortex-M3的內核復位函數編寫如下:
3、軟件模擬內核復位的方法
內核復位在某些特殊應用下,如OTA升級時,往往會被用到。此時,不希望復位外設,只需要程序從頭開始跑即可。以中穎M0+內核芯片為例,在啟動配置章節有介紹到,用軟件模擬內核復位來使運行在引導區的程序改由從用戶代碼區啟動。
中穎M0+內核芯片從復位中退出時,會首先讀取向量表中(從地址0x00000000開始,見圖3)的頭兩個字。第一個字為主棧指針(MSP)的初始值,而第二個字則為決定程序執行起始地址(復位處理)的復位向量。該復位流程可以用軟件去模擬,圖4是軟件模擬內核復位的C語言源碼。
圖3向量表
圖4軟件模擬內核復位的C語言源碼
圖4源碼中,第1行定義了函數指針類型,取名為“FUNC_CALL”;第2,3行申明了兩個變量,分別是無符號整型變量main_pgm和函數指針類型變量func;第5~20行定義了一個函數,取名為__NVIC_CoreReset(),該函數可以實現對MSP裝載復位初始值,并使程序跳轉到復位向量處開始執行,進而模擬了內核復位。
函數__NVIC_CoreReset()中,第9行調用了ARM官方庫文件中的函數(見下圖),將存儲器0x0地址處的值賦給了寄存器MSP,實現了MSP復位初始值的裝載;第10行是將存儲器0x4地址處的值賦給變量main_pgm;第11行是將變量main_pgm強制轉換成函數指針類型并賦給func;第12行調用函數func(),最終使程序跳轉到了存儲器0x4地址存儲的復位向量處運行。
用戶需要內核復位時,在程序中直接調用圖4中定義的函數__NVIC_CoreReset()即可。
4、總結
綜上所述,本文提供了一種軟件模擬內核復位的方法,通過調用自定義函數__NVIC_CoreReset()即可實現內核復位,給出了該函數的C語言源碼,用戶直接在自己程序中加載即可使用。該方法彌補了CortexM0+芯片沒有自帶內核復位功能的不足。
來源:中穎電子(作者:余為國)
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
芯片
+關注
關注
455文章
50714瀏覽量
423158 -
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
內核
+關注
關注
3文章
1372瀏覽量
40280 -
軟件模擬
+關注
關注
0文章
8瀏覽量
7224
發布評論請先 登錄
相關推薦
評論