1、關(guān)于復(fù)位
說到復(fù)位,我們都不會陌生,對于一個(gè)MCU系統(tǒng),復(fù)位電路是必不可少的一部分。復(fù)位的種類有很多:上電復(fù)位、低電壓復(fù)位、引腳復(fù)位、看門狗復(fù)位、軟件復(fù)位等等。本文說的內(nèi)核復(fù)位是軟件復(fù)位的一種。
Cortex-M3內(nèi)核芯片提供了兩種軟件復(fù)位,分別是系統(tǒng)復(fù)位和內(nèi)核復(fù)位,而Cortex-M0+內(nèi)核芯片只提供了系統(tǒng)復(fù)位,內(nèi)核復(fù)位不支持,只能軟件模擬。
2、系統(tǒng)復(fù)位和內(nèi)核復(fù)位的區(qū)別
內(nèi)核復(fù)位:只復(fù)位內(nèi)核處理器,而不復(fù)位外設(shè)如GPIO、Timer、UART、Flash等的寄存器。
系統(tǒng)復(fù)位:既復(fù)位內(nèi)核處理器,又復(fù)位外設(shè)寄存器。
下面分別是Cortex-M3和Cortex-M0+的應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR)配置圖,從圖中可以看出,置位AIRCR寄存器中的SYSRESETREQ位(位偏移:2),即可實(shí)現(xiàn)系統(tǒng)復(fù)位;置位VECTRESET位(位偏移:0),即可實(shí)現(xiàn)內(nèi)核復(fù)位。Cortex-M0+中沒有VECTRESET的定義,故不支持內(nèi)核復(fù)位。本文會介紹一種軟件模擬內(nèi)核復(fù)位的方法。
圖1 Cortex-M3 應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR)
圖2 Cortex-M0+應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR)
系統(tǒng)復(fù)位在ARM官方的庫文件中都有提供相關(guān)的函數(shù),用戶直接調(diào)用即可。官方給出的系統(tǒng)復(fù)位函數(shù)定義如下所示:
內(nèi)核復(fù)位在ARM官方的庫文件中沒有相關(guān)的函數(shù),需要用戶自行編寫。Cortex-M3的內(nèi)核復(fù)位函數(shù)編寫如下:
3、軟件模擬內(nèi)核復(fù)位的方法
內(nèi)核復(fù)位在某些特殊應(yīng)用下,如OTA升級時(shí),往往會被用到。此時(shí),不希望復(fù)位外設(shè),只需要程序從頭開始跑即可。以中穎M0+內(nèi)核芯片為例,在啟動配置章節(jié)有介紹到,用軟件模擬內(nèi)核復(fù)位來使運(yùn)行在引導(dǎo)區(qū)的程序改由從用戶代碼區(qū)啟動。
中穎M0+內(nèi)核芯片從復(fù)位中退出時(shí),會首先讀取向量表中(從地址0x00000000開始,見圖3)的頭兩個(gè)字。第一個(gè)字為主棧指針(MSP)的初始值,而第二個(gè)字則為決定程序執(zhí)行起始地址(復(fù)位處理)的復(fù)位向量。該復(fù)位流程可以用軟件去模擬,圖4是軟件模擬內(nèi)核復(fù)位的C語言源碼。
圖3 向量表
圖4 軟件模擬內(nèi)核復(fù)位的C語言源碼
圖4源碼中,第1行定義了函數(shù)指針類型,取名為“FUNC_CALL”;第2,3行申明了兩個(gè)變量,分別是無符號整型變量main_pgm和函數(shù)指針類型變量func;第5~20行定義了一個(gè)函數(shù),取名為__NVIC_CoreReset(),該函數(shù)可以實(shí)現(xiàn)對MSP裝載復(fù)位初始值,并使程序跳轉(zhuǎn)到復(fù)位向量處開始執(zhí)行,進(jìn)而模擬了內(nèi)核復(fù)位。
函數(shù)__NVIC_CoreReset()中,第9行調(diào)用了ARM官方庫文件中的函數(shù)(見下圖),將存儲器0x0地址處的值賦給了寄存器MSP,實(shí)現(xiàn)了MSP復(fù)位初始值的裝載;第10行是將存儲器0x4地址處的值賦給變量main_pgm;第11行是將變量main_pgm強(qiáng)制轉(zhuǎn)換成函數(shù)指針類型并賦給func;第12行調(diào)用函數(shù)func(),最終使程序跳轉(zhuǎn)到了存儲器0x4地址存儲的復(fù)位向量處運(yùn)行。
用戶需要內(nèi)核復(fù)位時(shí),在程序中直接調(diào)用圖4中定義的函數(shù)__NVIC_CoreReset()即可。
4、總結(jié)
綜上所述,本文提供了一種軟件模擬內(nèi)核復(fù)位的方法,通過調(diào)用自定義函數(shù)__NVIC_CoreReset()即可實(shí)現(xiàn)內(nèi)核復(fù)位,給出了該函數(shù)的C語言源碼,用戶直接在自己程序中加載即可使用。該方法彌補(bǔ)了CortexM0+芯片沒有自帶內(nèi)核復(fù)位功能的不足。
原文標(biāo)題:中穎M0+內(nèi)核芯片軟件模擬內(nèi)核復(fù)位的方法
文章出處:【微信公眾號:中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423116 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1372瀏覽量
40275 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
中穎電子
+關(guān)注
關(guān)注
4文章
174瀏覽量
7434
原文標(biāo)題:中穎M0+內(nèi)核芯片軟件模擬內(nèi)核復(fù)位的方法
文章出處:【微信號:SINO_25181447,微信公眾號:中穎電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論