新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > dsPIC33F單片機的程序升級探討

        dsPIC33F單片機的程序升級探討

        作者: 時間:2011-09-19 來源:網絡 收藏

        2 引導程序的實現

          2.1 程序流程

          進入引導程序后,程序的執行流程如下:

          (1)初始化電路板,包括單片機的工作頻率、外圍接口等,尤其要注意啟用單片機的“備用中斷向量表”。因為單片機復位后默認啟用“中斷向量表”,而由基本原理的說明可看出,引導程序必須采用“備用中斷向量表”。

          (2)判斷程序走向,通過標志判斷是跳轉到應用程序,還是執行流程。

          (3)若標志為“正常運行”,則調用GOTO指令跳轉到應用程序。

          (4)若程序升級標志為“程序升級”,則執行程序升級流程,這是引導程序的重點。

          程序升級按“塊”更新,每“塊”包含1 024個存儲單元(以字為單位),即每幀數據需包含2 048個字節的程序代碼。在更新程序時并不是簡單地用接收到的新程序代碼覆蓋舊程序,對于一些特殊幀需特殊處理,通過對比應用程序編譯后的程序存儲器結構與實際應用中的程序存儲器結構可以很好地理解這點。圖2(a)所示為實際應用中的程序存儲器內部結構;(b)為應用程序編譯后的程序存儲器結構。通過對比這兩張圖可以看出,“GOTO指令”、“備用中斷向量表”、“引導程序”這些區間的程序不能直接覆蓋,若“GOTO指令”被覆蓋,則程序升級后程序直接跳轉到應用程序,不會執行引導程序;若“備用中斷向量表”被覆蓋,則引導程序中的中斷服務程序無法執行;若“引導程序”區間的內容被覆蓋,則引導程序被清空,顯然會帶來災難性的后果。因此對于第1幀數據需特別處理,該幀數據對應程序存儲器第1塊(地址為0~0x3FF)的內容,包含“GOTO指令”、“復位地址”、“中斷向量表”和“備用中斷向量表”的內容,為了保證"GOTO指令”和“備用中斷向量表”的內容不被修改,需要先讀出原“GOTO指令”和“備用中斷向量表”的內容,替代接收數據緩沖區中對應位置的內容,然后寫入程序存儲區的第1塊;對于第2幀到第50幀(0xe800/0x400),這些是引導程序的內容,顯然不能做任何修改,因此這幾幀數據接收后直接丟棄;從第51幀到最后一幀,這是應用程序的內容,也是真正要升級的內容,所以可直接覆蓋舊內容。程序升級后,將程序更新標志恢復為“正常運行”狀態,然后復位CPU,則經引導程序又進入了新的應用程序,從而實現了應用程序的升級。

          基于以上說明可得引導程序的詳細流程如圖3所示。

          

        引導程序的詳細流程

          2.2 關鍵細節的實現

          (1)啟用“備用中斷向量表”。設置INTCON2寄存器中ALTIVT控制位的值,其值設置為“1”則啟用“備用中斷向量表”;設置為“0”則啟用“中斷向量表”。

          (2)程序首址的設置。在以上流程的說明中談到引導程序的首址為0x400,而應用程序的首址為0xc800,則設置程序的首址可通過修改鏈接描述文件(.gld文件)實現。以J256GP710單片機為例,將引導程序首址改為0x400,其實現步驟為:打開p33FJ256GP710.gld文件,將其中的“program(xr):ORIGIN=0x200,LENGTH=0x2AA00”改為“pro-gram(xr) :ORIGIN=0x400,LENGTH=0x2A900”;將“_ _CODE_ BASE=0x200”改為“_ _CODE_BASE=0x400”。應用程序首址的修改也采用相同方法。

          (3)讀/寫程序存儲器。在參考文獻中有很完整的原理說明,也有完整的源代碼,可直接使用。

          (4)軟件復位CPU。在應用程序運行過程中發現需升級程序或在引導程序中升級程序完畢時,均需對CPU進行軟件復位,這可通過單片機提供的“reset”指令實現,可在程序相應位置執行“reset”指令即可。



        關鍵詞: dsPIC33F 程序升級

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 林周县| 时尚| 和田县| 景泰县| 灵石县| 商城县| 大石桥市| 洛扎县| 淅川县| 永州市| 米林县| 安平县| 福建省| 宁远县| 阿坝县| 洪湖市| 安顺市| 玛沁县| 蕉岭县| 舞阳县| 绍兴市| 沙洋县| 沂南县| 芜湖市| 绥芬河市| 抚松县| 甘肃省| 高州市| 武强县| 韶山市| 浦东新区| 昭平县| 交口县| 辉县市| 东宁县| 遂宁市| 阳曲县| 淮安市| 来安县| 六枝特区| 阿尔山市|