1、關于復位
說到復位,我們都不會陌生,對于一個MCU系統(tǒng),復位電路是必不可少的一部分。復位的種類有很多:上電復位、低電壓復位、引腳復位、看門狗復位、軟件復位等等。本文說的內核復位是軟件復位的一種。
Cortex-M3內核芯片提供了兩種軟件復位,分別是系統(tǒng)復位和內核復位,而Cortex-M0+內核芯片只提供了系統(tǒng)復位,內核復位不支持,只能軟件模擬。
2、系統(tǒng)復位和內核復位的區(qū)別
內核復位:只復位內核處理器,而不復位外設如GPIO、Timer、UART、Flash等的寄存器。
系統(tǒng)復位:既復位內核處理器,又復位外設寄存器。
下面分別是Cortex-M3和Cortex-M0+的應用程序中斷及復位控制寄存器(AIRCR)配置圖,從圖中可以看出,置位AIRCR寄存器中的SYSRESETREQ位(位偏移:2),即可實現系統(tǒng)復位;置位VECTRESET位(位偏移:0),即可實現內核復位。Cortex-M0+中沒有VECTRESET的定義,故不支持內核復位。本文會介紹一種軟件模擬內核復位的方法。
圖1 Cortex-M3 應用程序中斷及復位控制寄存器(AIRCR)
圖2 Cortex-M0+應用程序中斷及復位控制寄存器(AIRCR)
系統(tǒng)復位在ARM官方的庫文件中都有提供相關的函數,用戶直接調用即可。官方給出的系統(tǒng)復位函數定義如下所示:
內核復位在ARM官方的庫文件中沒有相關的函數,需要用戶自行編寫。Cortex-M3的內核復位函數編寫如下:
3、軟件模擬內核復位的方法
內核復位在某些特殊應用下,如OTA升級時,往往會被用到。此時,不希望復位外設,只需要程序從頭開始跑即可。以中穎M0+內核芯片為例,在啟動配置章節(jié)有介紹到,用軟件模擬內核復位來使運行在引導區(qū)的程序改由從用戶代碼區(qū)啟動。
中穎M0+內核芯片從復位中退出時,會首先讀取向量表中(從地址0x00000000開始,見圖3)的頭兩個字。第一個字為主棧指針(MSP)的初始值,而第二個字則為決定程序執(zhí)行起始地址(復位處理)的復位向量。該復位流程可以用軟件去模擬,圖4是軟件模擬內核復位的C語言源碼。
圖3 向量表
圖4 軟件模擬內核復位的C語言源碼
圖4源碼中,第1行定義了函數指針類型,取名為“FUNC_CALL”;第2,3行申明了兩個變量,分別是無符號整型變量main_pgm和函數指針類型變量func;第5~20行定義了一個函數,取名為__NVIC_CoreReset(),該函數可以實現對MSP裝載復位初始值,并使程序跳轉到復位向量處開始執(zhí)行,進而模擬了內核復位。
函數__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+芯片沒有自帶內核復位功能的不足。
原文標題:中穎M0+內核芯片軟件模擬內核復位的方法
文章出處:【微信公眾號:中穎電子】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅
-
芯片
+關注
關注
456文章
51170瀏覽量
427261 -
內核
+關注
關注
3文章
1382瀏覽量
40422 -
函數
+關注
關注
3文章
4346瀏覽量
62971 -
中穎電子
+關注
關注
4文章
176瀏覽量
7608
原文標題:中穎M0+內核芯片軟件模擬內核復位的方法
文章出處:【微信號:SINO_25181447,微信公眾號:中穎電子】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論