袁 鋒,丁元章,張 偉,蔡定江
(1.長三角新能源汽車研究院有限公司,江蘇 鹽城 224000;2.長三角電驅(qū)動科技鹽城有限公司,江蘇 鹽城 224000)
車輛網(wǎng)關(guān)(GateWay,GW)為純電動乘用車的重要零部件,在車輛數(shù)據(jù)協(xié)議實(shí)現(xiàn)與數(shù)據(jù)傳輸上起著關(guān)鍵作用。如果控制數(shù)據(jù)協(xié)議升級,車輛網(wǎng)關(guān)則需要相應(yīng)的程序更新,傳統(tǒng)工具下載升級效率差,所以Bootloader的開發(fā)就顯得尤為重要[1-2]。Bootloader是固化在微處理器內(nèi)部Flash特定位置的一段程序代碼。每次處理器啟動都會運(yùn)行Bootloader,它會檢查是否有來自CAN總線的程序下載請求,如果有則進(jìn)入Bootloader下載模式,進(jìn)行程序下載,并校驗(yàn)其完整性,最終完成應(yīng)用程序的更新;如果沒有來自總線的程序下載請求,則跳轉(zhuǎn)至原有應(yīng)用程序執(zhí)行[3-5]。
本文采用NXP S32DS IDE集成開發(fā)環(huán)境S32 Design Studio for S32 Platform 3.4完成基于Cortex-M4F內(nèi)核S32K148處理器CAN Bootloader軟件開發(fā),程序調(diào)試器采用SUGGER JLlink V6.9。上位機(jī)開發(fā)采用Visual Studio 2010實(shí)現(xiàn),通信CAN控制器采用USBCAN-E-mini實(shí)現(xiàn)。
Bootloader是車輛網(wǎng)關(guān)啟動時完成加載引導(dǎo)程序執(zhí)行的代碼。Bootloader一般有兩種工作模式:①啟動加載模式,該模式下Bootloader作用是將之前存儲在存儲器中的應(yīng)用程序加載到RAM中去執(zhí)行;②下載模式,本文研究的重點(diǎn),主要功能是下載應(yīng)用程序,將程序先存在RAM中,再刷寫至Flash等固態(tài)存儲器中完成程序的下載。本文Bootloader系統(tǒng)采用的是基于上位機(jī)(PC作為上位機(jī))、CAN控制器(USBCAN-E)和基于S32K148處理器的車輛網(wǎng)關(guān)(下位機(jī))的結(jié)構(gòu),上位機(jī)發(fā)送的數(shù)據(jù)經(jīng)CAN控制器傳送至車輛網(wǎng)關(guān)模塊。同樣,當(dāng)網(wǎng)關(guān)模塊接收到應(yīng)答后,會通過CAN控制器將數(shù)據(jù)發(fā)送至上位機(jī),其結(jié)構(gòu)如圖1所示。
程序進(jìn)入Bootloader模式一般有以下兩種方式。
1)通過判斷處理器某個引腳電平的高低,識別電平高低狀態(tài),軟件判斷執(zhí)行應(yīng)用程序或進(jìn)入Bootloader下載模式。
2)通過設(shè)置標(biāo)志位判斷,需要PC上位機(jī)與CAN控制器總線數(shù)據(jù)配合,識別特定的CAN數(shù)據(jù)格式、標(biāo)識符和字節(jié)數(shù)據(jù),軟件判斷執(zhí)行應(yīng)用程序或進(jìn)入Bootloader下載模式。
本文采用方式2實(shí)現(xiàn),該方式雖然在軟件處理上稍顯復(fù)雜,需要PC上位機(jī)與下位機(jī)之間的數(shù)據(jù)和時序的配合。但是相較于方式1,不需要引出單獨(dú)的引腳,可以減少使用一個I/O口,在整車應(yīng)用上具有一定的便利性,且節(jié)省了I/O資源。
圖1 Bootloader結(jié)構(gòu)圖
S32K148微處理器包含各種存儲器和內(nèi)存映射外設(shè),它們位于一個32位連續(xù)地址空間中,地址空間統(tǒng)一編址。該芯片具有3×512KB P-Flash空間,分配地址段為0x00000000~0x0017FFFF。Bootloader在此空間實(shí)現(xiàn),分配地址0x00000000~0x00007FFF為Bootloader代碼存儲空間,大小為32KB,其余的P-Flash空間為應(yīng)用程序使用。
S32K148處理器具有3個獨(dú)立的CAN模塊,可用來實(shí)現(xiàn)Bootloader的數(shù)據(jù)傳輸和狀態(tài)控制功能。其具有3路FlexCAN模塊,均可配置為CAN或CAN-FD工作模式。因目前車輛CAN總線大多還處于CAN工作模式,本文基于CAN模式采用CAN0 來實(shí)現(xiàn)。主要配置如下。
1)配置時鐘寄存器為外部16MHz晶振時鐘,并開啟時鐘門。
2)配置為CAN模式。
3)設(shè)置數(shù)據(jù)幀格式為標(biāo)準(zhǔn)幀,波特率為500kb/s。
4)配置采用中斷方式。
Flash模塊的配置是Bootloader實(shí)現(xiàn)的重要一環(huán),需要對相關(guān)寄存器進(jìn)行配置。對Flash模塊編程主要涉及Flash初始化、Flash擦除與編程寫入操作,本文選用的S32K148微控制器Flash存儲空間為0x00000000~0x00007FFF,主要配置如下。
1)配置Flash時鐘源為內(nèi)部SPLLDIV2時鐘,頻率為20MHz,并開啟時鐘門。
2)P-Flash的擦除方式為扇區(qū)擦除,芯片采用的是交叉訪問方式實(shí)現(xiàn),最小擦除扇區(qū)為4KB,需在Flash驅(qū)動中進(jìn)行相應(yīng)設(shè)置,執(zhí)行擦除指令時,需配置FCCOB0為0x09,擦除完成之后,方可對Flash執(zhí)行寫命令。
3)P-Flash在FTFC->FCCOB寄存器中配置相應(yīng)命令,實(shí)現(xiàn)Flash的編程寫入。FCCOB0為命令寄存器,可用來配置編程、擦除等命令。通過配置FCCOB0=0x07實(shí)現(xiàn)編程功能。一次編程的字節(jié)數(shù)為8個字節(jié)。編程地址和數(shù)據(jù)存儲在FCCOB1~FCCOB11寄存器中。
在前文中提到Bootloader是固化在整車網(wǎng)關(guān)等ECU微控制器的內(nèi)部Flash中某特定位置的一段程序代碼,應(yīng)用程序同樣也是存儲在內(nèi)部Flash中,兩者共同占據(jù)Flash存儲空間。所以二者的存儲地址要正確分配,避免重疊。
在本文中,Bootloader存放在0x00000000~0x00007FFF地址空間中。在LinkFiles文件中修改如下。
S19文件是NXP微控制器的程序刷寫文件,一般由開發(fā)環(huán)境自動輸出,具有特定的格式[6-7]。在不同的芯片和編譯環(huán)境中,其生成的文件不同。如MC9S12系列的編譯器Code-Warrior 5.2中,其生成文件的后綴為.s19,在MPC56系列編譯器CodeWarrior 2.10中,其生成的文件后綴為.mot,本文使用的S32 Design Studio生成的S-format 格式的文件后綴為.srec。雖然后綴名不同,其均具有相同的數(shù)據(jù)格式,簡述如下。
取生成的S19文件的中幾行記錄加以說明。
1)“S0”它是S文件的第一行數(shù)據(jù),主要表示S文件的路徑以及文件名信息。
2)“S1”表示該行是一條S1類型的數(shù)據(jù),數(shù)據(jù)13表示該行記錄有0x13個字節(jié)(包括2字節(jié)地址、16字節(jié)的數(shù)據(jù)、1字節(jié)校驗(yàn))。
3)“8000”表示該行記錄的地址信息。
4)“00F00120118400007984000079840000”表示該行S1類型數(shù)據(jù)的數(shù)據(jù)信息。
5)“CC”是該行數(shù)據(jù)的最后一個字節(jié),表示該行記錄的校驗(yàn)值。
本文采用S32 Design Studio進(jìn)行開發(fā),下文就在該環(huán)境下生成S19文件進(jìn)行說明和討論。S32 Design Studio可以經(jīng)過簡單的配置選擇,即可以生成S-format輸出文件。前文表述,S-format中的程序信息是由S1、S2或S3等行記錄組成。S1文件代表行記錄中2字節(jié)的地址域,S2文件代表行記錄中3字節(jié)的地址域,S3文件代表行記錄中4字節(jié)的地址域。通過實(shí)踐發(fā)現(xiàn),在默認(rèn)情況下,S32 Design Studio根據(jù)程序地址空間以及代碼規(guī)模自動選擇生成S1、S2或S3格式行記錄。這樣對我們在Bootloader開發(fā)中,進(jìn)行上位機(jī)開發(fā)中帶來了不便。
為解決上述問題,在開發(fā)中,根據(jù)芯片的地址寬度為32位的特點(diǎn),實(shí)現(xiàn)在將S19代碼生成或轉(zhuǎn)換為S3格式。實(shí)現(xiàn)方式有以下兩種。
1)在S32 Design Studio中設(shè)置,強(qiáng)制生成S3格式行記錄。
2)在S32 Design Studio中保持默認(rèn),通過上位機(jī)實(shí)現(xiàn)S1、S2向S3格式的轉(zhuǎn)換。
本文采用方式2,在上位機(jī)中軟件編程實(shí)現(xiàn)格式的轉(zhuǎn)換,便于工具的一致性和通用性。
示例如圖2與圖3所示。
圖2 生成S19文件
圖3 S3格式上位機(jī)轉(zhuǎn)換
系統(tǒng)啟動后,初始化系統(tǒng)時鐘、Flash模塊、CAN模塊和控制變量。初始化完成后,進(jìn)入主程序運(yùn)行,定時接收Bootloader連接數(shù)據(jù)幀。當(dāng)接收到特定的數(shù)據(jù)幀并連接成功后,進(jìn)入Bootloader下載模式,執(zhí)行應(yīng)用程序刷寫循環(huán)。刷寫完成后,跳轉(zhuǎn)到應(yīng)用程序起始地址執(zhí)行。本文中的應(yīng)用程序初始地址位0x00008000。
整個Bootloader流程如圖4所示。
圖4 Bootloader流程圖
下面給出本文上位機(jī)與基于S32K148處理器的下位機(jī)具體的通信過程,通過CAN通信口將S19記錄文件寫入網(wǎng)關(guān)ECU中。
1)上位機(jī)端開啟,加載并轉(zhuǎn)換記錄文件,點(diǎn)擊啟動連接,持續(xù)發(fā)送報(bào)文ID=0x64,data0=0xFF至下位機(jī)。下位機(jī)上電初始化,初始化完成后。進(jìn)入計(jì)時循環(huán),并中斷接收上位機(jī)報(bào)文,與上位機(jī)建立通信連接。若連接成功,回復(fù)ID=0xC8,data0=0x01至上位機(jī),否則跳轉(zhuǎn)到應(yīng)用程序起始地址執(zhí)行。
2)連接成功,下位機(jī)執(zhí)行擦除指令,擦除Bootloader所在地址之外的地址空間。
3)擦除完成,下位機(jī)發(fā)送當(dāng)前狀態(tài)ID=0xC8,data0=0xC1至上位機(jī),上位機(jī)開始逐行讀取S19文件行記錄,并發(fā)送至下位機(jī),一行發(fā)送完成,上位機(jī)發(fā)送ID=0x64,data=0xFE。
4)下位機(jī)接收到一行完成標(biāo)識,對接收到的數(shù)據(jù)進(jìn)行校驗(yàn)。
5)數(shù)據(jù)校驗(yàn)成功后,執(zhí)行Flash寫入操作,將S19文件行記錄中的數(shù)據(jù)寫入地址。行寫入完成,ID=0xC8,data=0xC3至上位機(jī),表示一行數(shù)據(jù)接收并寫入完成。
6)循環(huán)執(zhí)行行記錄接收、校驗(yàn)和行編程。
7)上位機(jī)發(fā)送ID=0x64,data=0xFD,表示整個S19文件發(fā)送完成。
刷寫過程如圖5所示。
圖5 刷寫過程示例圖
本文介紹了基于S32K系列微控制器S32K148,采用CAN總線技術(shù),通過NXP S32DS IDE工具進(jìn)行Bootloader相關(guān)的開發(fā)與實(shí)現(xiàn)。系統(tǒng)通過識別特定的CAN數(shù)據(jù)格式、標(biāo)識符和數(shù)據(jù)字符選擇進(jìn)入下載模式或者執(zhí)行應(yīng)用程序[8]。Bootloader與上位機(jī)通過固定ID的CAN幀進(jìn)行交互反饋,可以成功地完成S19文件的下載并將其刷至目標(biāo)Flash模塊中,便于系統(tǒng)升級。此外,本文了基于S32K148芯片的開發(fā)過程對于其它基于S32K系列Bootloader的開發(fā)也有一定的借鑒作用。當(dāng)然本文也存在著需要進(jìn)一步改進(jìn)的地方,如采用UDS 14229協(xié)議傳輸S19文件和采用基于CAN-FD的Bootloader開發(fā),這是后續(xù)開發(fā)的方向。