dsPIC33F單片機的程序升級探討
2 引導程序的實(shí)現
2.1 程序流程
進(jìn)入引導程序后,程序的執行流程如下:
(1)初始化電路板,包括單片機的工作頻率、外圍接口等,尤其要注意啟用單片機的“備用中斷向量表”。因為dsPIC33F單片機復位后默認啟用“中斷向量表”,而由基本原理的說(shuō)明可看出,引導程序必須采用“備用中斷向量表”。
(2)判斷程序走向,通過(guò)程序升級標志判斷是跳轉到應用程序,還是執行程序升級流程。
(3)若程序升級標志為“正常運行”,則調用GOTO指令跳轉到應用程序。
(4)若程序升級標志為“程序升級”,則執行程序升級流程,這是引導程序的重點(diǎn)。
程序升級按“塊”更新,每“塊”包含1 024個(gè)存儲單元(以字為單位),即每幀數據需包含2 048個(gè)字節的程序代碼。在更新程序時(shí)并不是簡(jiǎn)單地用接收到的新程序代碼覆蓋舊程序,對于一些特殊幀需特殊處理,通過(guò)對比應用程序編譯后的程序存儲器結構與實(shí)際應用中的程序存儲器結構可以很好地理解這點(diǎn)。圖2(a)所示為實(shí)際應用中的程序存儲器內部結構;(b)為應用程序編譯后的程序存儲器結構。通過(guò)對比這兩張圖可以看出,“GOTO指令”、“備用中斷向量表”、“引導程序”這些區間的程序不能直接覆蓋,若“GOTO指令”被覆蓋,則程序升級后程序直接跳轉到應用程序,不會(huì )執行引導程序;若“備用中斷向量表”被覆蓋,則引導程序中的中斷服務(wù)程序無(wú)法執行;若“引導程序”區間的內容被覆蓋,則引導程序被清空,顯然會(huì )帶來(lái)災難性的后果。因此對于第1幀數據需特別處理,該幀數據對應程序存儲器第1塊(地址為0~0x3FF)的內容,包含“GOTO指令”、“復位地址”、“中斷向量表”和“備用中斷向量表”的內容,為了保證"GOTO指令”和“備用中斷向量表”的內容不被修改,需要先讀出原“GOTO指令”和“備用中斷向量表”的內容,替代接收數據緩沖區中對應位置的內容,然后寫(xiě)入程序存儲區的第1塊;對于第2幀到第50幀(0xe800/0x400),這些是引導程序的內容,顯然不能做任何修改,因此這幾幀數據接收后直接丟棄;從第51幀到最后一幀,這是應用程序的內容,也是真正要升級的內容,所以可直接覆蓋舊內容。程序升級后,將程序更新標志恢復為“正常運行”狀態(tài),然后復位CPU,則經(jīng)引導程序又進(jìn)入了新的應用程序,從而實(shí)現了應用程序的升級。
基于以上說(shuō)明可得引導程序的詳細流程如圖3所示。
2.2 關(guān)鍵細節的實(shí)現
(1)啟用“備用中斷向量表”。設置INTCON2寄存器中ALTIVT控制位的值,其值設置為“1”則啟用“備用中斷向量表”;設置為“0”則啟用“中斷向量表”。
(2)程序首址的設置。在以上流程的說(shuō)明中談到引導程序的首址為0x400,而應用程序的首址為0xc800,則設置程序的首址可通過(guò)修改鏈接描述文件(.gld文件)實(shí)現。以dsPIC33FJ256GP710單片機為例,將引導程序首址改為0x400,其實(shí)現步驟為:打開(kāi)p33FJ256GP710.gld文件,將其中的“program(xr):ORIGIN=0x200,LENGTH=0x2AA00”改為“pro-gram(xr) :ORIGIN=0x400,LENGTH=0x2A900”;將“_ _CODE_ BASE=0x200”改為“_ _CODE_BASE=0x400”。應用程序首址的修改也采用相同方法。
(3)讀/寫(xiě)程序存儲器。在參考文獻中有很完整的原理說(shuō)明,也有完整的源代碼,可直接使用。
(4)軟件復位CPU。在應用程序運行過(guò)程中發(fā)現需升級程序或在引導程序中升級程序完畢時(shí),均需對CPU進(jìn)行軟件復位,這可通過(guò)dsPIC33F單片機提供的“reset”指令實(shí)現,可在程序相應位置執行“reset”指令即可。
評論