劉金華 王軍 楊達 王東
(北京動力機械研究所 北京市 100074)
基于dsPIC30F5011 單片機開發的ECU 控制軟件,由于需求不斷變更,用仿真器JTAG 接口燒錄軟件方式,需將電子控制器拆下返回外協生產廠家開蓋操作,過程復雜,周期長,協調難度大,管理費用高。因此基于控制器現有的CAN 通訊接口,開展在線升級設計很有必要。本文以某控制器硬件平臺為基礎,開展了基于dsPIC30F系列單片機嵌入式軟件在線升級設計,給出了調試通過的軟件相關設計方法。
本系統設計目標是:在目標機脫開仿真器上電運行時,可實現系統自動執行,并可通過上位機(PC機)對目標機代碼(嵌入式軟件)進行升級更新。
本系統目標機軟件(嵌入式軟件)采用C 語言和匯編語言混合編程方法、上位機軟件采用C 語言編寫,目標機軟件和上位機軟件具有可移植和可維護性等優點。本文給出了基于dsPIC30F5011 單片機的硬件平臺,使用通過調試的目標機源代碼在存儲器中空間地址分配及軟件設計方法。
系統主要由目標機系統和上位機系統組成。系統連接框圖見圖1。
目標機系統硬件主要由單片機(dsPIC30F5011)、IDE 仿真器(MPLAB ICD2)、連接電纜組成。目標機系統軟件包括:Windows XP 操作系統、MPLAB IDE(v8.01c)開發平臺、監控軟件、用戶應用軟件。
上位機系統主要由PC 機、 USB-CAN(CANalyst-II 分析儀)、VisualC++6.0 軟件開發平臺組成。
主機PC 端在線升級軟件運行后,打開CANalyst-II 分析儀并初始化選用的通道,按照既定的通訊協議,向目標端發送對碼指令,握手成功后,打開輸入的用戶應用程序可執行代碼文件,讀取該文件可執行代碼,進行逐條解析,解析完成后,按照既定的通訊協議向目標端發送,目標端監控程序將解析出的內容,按相應的存儲類別分別寫入各自的地址中,待接收到上位機發送的復位命令后,將程序指針指向用戶應用程序起始地址開始運行用戶應用程序。從而完成本次用戶應用程序的更新,控制器斷電后重新上電,在不運行上位機在線升級軟件的情況下,10s 后即執行用戶應用程序。在線升級過程參見圖2。
利用現有控制器與上位機之間的通訊接口,即CAN 總線接口,
使用擴展幀格式的數據幀,制定以下數據幀應用原則:
11 位基本ID 的D28 ~D25 位用來表示發送設備的ID;
11 位基本ID 的D24 ~D21 位用來表示接收設備的ID;

圖1:系統連接框圖

圖2:在線升級過程

圖3:PC 端在線升級程序流程
11 位基本ID 的D20 ~D18 位用來表示該幀數據的狀態,包括單幀數據包、數據組的第一幀和中間幀、數據組的最后一幀;
18 位擴展ID 的D17 ~D12 位用來表示幀數據的指令名稱,分為FLASH 編寫指令、EEPROM 編寫指令和CM 編寫指令;
18 位擴展ID 的D11 ~D0 位用來表示多幀數據的幀計數;

表1:仲裁段的應用定義
64 位數據段僅表示數據內容。
仲裁段的應用定義見表1。
為確保每幀數據傳輸可靠準確,在上述幀格式中,對于數據組幀,設計全部數據的CRC32 校驗和,在尾幀中送出,結合CAN 總線的底層CRC 校驗和進行雙重校驗,以便及時發現錯誤。
PC 端在線升級程序設計,使用Visual C++6.0 開發,通過動態鏈接庫形式操作CANalyst-II 分析儀的相關函數,完成與目標機之間的通訊設計,完成目標HEX 碼文件的解析。
軟件的設計流程參見圖3。
2.2.1 CANalyst-II 分析儀的相關函數
使用開發用庫文件:ControlCAN.lib,ControlCAN.DLL、VC 平臺函數聲明文件:ControlCAN.h。
(1)打開設備函數。
DWORD __stdcall VCI_OpenDevice(DWORD DevType,DWORD DevIndex,DWORD Reserved);
(2)關閉設備函數。
DWORD__stdcall VCI_Close Device(DWORD DevType,DWORD DevIndex);
(3)初始化指定的CAN 通道函數。
DWORD __stdcall VCI_InitCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex,PVCI_INIT_CONFIG pInitConfig);
(4)啟動CAN 卡的某一個CAN 通道函數。
DWORD __stdcall VCI_StartCAN(DWORD DevType,DWORD DevIndex,DWORD CANIndex);
(5)發送函數。
DWORD __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,DWORD Length);
(6)接收函數。
DWORD __stdcall VCI_Receive(DWORD DevType,DWORD DevIndex,DWORD CANIndex,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime);
2.2.2 HEX 文件格式
上位機在線升級程序處理Microchip 開發工具所用的標準HEX格式文件。支持的格式為Intel HEX 32 格式(INHX32),參見附錄A。
2.2.3 目標HEX 碼文件解析數據結構
存儲類定義如下:


圖4:dsPIC30F5011 程序存儲器地址分配

圖5:監控軟件程序流程圖

圖6:上位機在線升級程序運行過程及結果

圖7:用戶應用程序運行后周期性發送數據的情況

目標端監控程序位于程序存儲器的特定區域中,其起始地址為0x100,軟件啟動后,即讀取目標程序起始地址(本系統目標程序起始地址規定為0x1000),讀取其中監控程序延時值。如果監控程序未能在該延時值指定的期限內實現與上位機的對碼,將自動暫停并將執行權轉交給0x1002 中的目標程序。如監控程序與上位機對碼成功,將使用通過CAN 總線從上位機接收到的數據來編程EEPROM 和程序存儲器。dsPIC30F5011 程序存儲器的地址分布參見圖4,具體流程參見圖5。
中斷向量表(IVT)如圖4所示。IVT 位于程序存儲器中,起始單元地址是0x000004。IVT 包含62 個向量,這些向量由8 個不可屏蔽陷阱向量和最多54 個中斷源組成。備用中斷向量表(AIVT)位于IVT 之后。ALTIVT 控制位(INTCON2<15>)提供對AIVT的訪問。如果 ALTIVT 位置1,所有中斷和異常處理將使用備用向量而不是默認的向量。備用向量與默認向量的結構相同。本系統中監控軟件使用IVT,而用戶應用軟件使用AIVT。
(1)不能將用戶應用程序放入為目標端監控程序保留的存儲空間;
(2)用戶應用程序所需空間不得超過目標器件(dsPIC30F5011單片機)的存儲空間;
(3)必須為監控程序制定執行用戶應用程序的延時時間;


上位機在線升級程序運行過程及結果參見圖6所示。升級結束后用戶應用程序周期性發送的數據,使用CANalyst-II 分析儀提供的CANPRO 軟件接收并顯示數據,參見圖7所示。
附錄A
HEX 文件的基本格式為:
:BBAAAATTHHHH...HHHHCC
每條數據記錄以一個9 字符的前綴開始,且通常以一個2 字符的校驗和結束,無論何種格式,所有記錄都以“:”開始。各組成部分的說明如下:
(1)BB 是一個兩位數字的十六進制字節數,用來表示行中顯示的數據字節數量。此數除以2 即獲得每行的數據字數。
(2)AAAA 是一個四位數字的十六進制地址,用來表示數據記錄的起始地址,高字節在前,低字節在后。由于此格式僅支持8 位,地址被乘以2,所以,要得到實際的器件地址,需將此地址除以2。
(3)TT 是一個兩位數字的記錄類型。對于數據記錄,它為00;對于文件結束(End-of-File,EOF)記錄,為01;對于擴展的地址記錄(僅INHX32),為04,擴展地址的計算為擴展地址左移16 位+偏移地址。
(4)HHHH 是一個四位數字的十六進制數據字,低字節在前,高字節在后。TT 后跟BB/2 個數據字。
(5)CC 是一個兩位數字的十六進制校驗和,它為本行記錄中在其之前的所有字節之和的二進制補碼。