s32k144 bootloader升級
mcu : s32k144
can_tool : kvaser
摘要:實現can升級app程序,現在網上大多是CAN_FD升級bootloader 的程序,CAN_FD在消費型轎車可能已經使用,而隊友許多大型汽車,目前用的還是can通訊,所以實現can升級制定mcu的app程序就顯得尤為重要。本次發送的是摩托羅拉公司定義的s19文件(srec),上位機解析文件,發送。CAN_FD一幀數據能發64個字節,而CAN一幀數據只能發送8個字節(不包括ID等其他信息),而s19文件除了第一行可能超過64個字節外,其他行一般小於64個字節,所以CAN_FD的方式會很簡單,而can的方式會很麻煩。本文分為三個部分:boot loader、app、上位機軟件。
1.bootloader:
(1)bootloader主要實現功能:
(2)分析一下跳轉部分:
① s32k的棧頂地址為0x00000000,而stm32的棧頂地址一般為0x08000000。復位向量表起始地址 = 棧頂地址+4 ;我們平時復位地址就是這個地址。各部分程序映射地址如下圖
圖中使用的APP地址偏移量是0x00004000(8k)的大小,通過查看要燒錄的文件發現2k字節的大小是完全足夠的,我們此次就是用的地址為0x00002000
②單片機的函數名就是地址,運行函數其實就是將PC指針跳到函數的入口去執行程序
1 typedef void (*bootloader_fun)(void); /*定義函數指針類型*/ 2 bootloader_fun jump2app; /*定義函數指針*/ 3 .......... 4 /* 函數指針指向app的復位向量表的地址。注意將地址強轉成函數入口地址 */ 5 jump2app = (bootloader_fun)*(uint32_t*)(APP_ADDR + 4); 6 /* 設置棧頂指針*/ 7 MSR_MSP(APP_ADDR); 8 /*將pc指針指向入函數地址(app地址)運行*/ 9 jump2app();
PS.在跳轉之前還得can_deinit()和關閉全部的中斷 __asm volatile ("cpsid i" : : : "memory");
(3)其他注意要點
① bootloader中提供的外部接口:
Ⅰ.緩存buff的size
Ⅱ.bootloader的等待值
Ⅲ.app的棧頂地址
Ⅳ.和上位機通信的can幀ID
Ⅴ.要擦除app扇區的數量
②bootloader 注意:
Ⅰ.沒有使用獨立看門狗,s32k144的獨立看門狗從上電復位到掉電只能被初始化一次,所以app使用,bootloader沒有使用。以后版本會使用到
Ⅱ.進行flash操作的時候,不可能處理完一行的srec的值就寫入flash中,可以用一個buff緩存,這個buff的大小直接決定了更新速度。下面兩點要注意:
□ 為提高flash寫入速度,app扇區在第一次寫flash時就擦出全部app扇區,這個地方要注意擦除的地址要小於自己配的eeprom的地址,不然會將以前的數據擦除。
□ 在進行flash操作的時候不能被中斷打斷,所以返回上位機一條忙碌的信息,使其阻塞。
□ 緩存buff必須動態分配,跳轉前必須釋放
2.app
(1).修改app的鏈接文件
keil的話直接在output選項卡中修改棧頂地址就行,而我此次用的是S32DS,需要修改工程的鏈接文件如下圖
(2).在主函數中設置中斷向量表的偏移地址,並打開全局中斷
/* 此處偏移地址必須和bootloader中的一樣 */ S32_SCB->VTOR = 0x00002000 ; /* 關閉全局中斷*/ __asm volatile ("cpsie i" : : : "memory");
(3).添加CAN特殊ID
當接收到的幀ID是某一特定ID時,判斷接收到的值 unsigned char resetmcu[] ={0x52,0x45,0x53,0x45,0x54,0x4d,0x43,0x55};這些值對應RESETMCU的asicii碼對應的十六進制值
當正確時復位看門狗,mcu重新從0x00000000開始運行,完成更新軟件復位,從而更新程序
(4).app至少需要的接口 :引起看門狗復位的CAN_ID
3.kavser 上位機軟件
(1)主要功能如下圖:
(2)提供外部接口: 與MCU通訊的幀ID
PS :控制好一鍵復位和發送第一幀數據的時間間隔,太快就會丟失這一幀,太慢,bootloader已經跳到app中去了
4.量產燒錄
出廠第一次燒錄的時候必須將bootloader 的srec文件和app的srec文件合成一個srec文件,並用J-FLASH燒錄到MCU,J-FLASH可以合並文件和分段燒錄是一個比較非常好用的工具,非常方便
體會:本次發現C#是很好用的,以后可能用到着,一切皆工具