uds 诊断协议的bootloader开发
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uds診斷協議的bootloader開發概述
本文介紹的內容基于MC9SG128 MCU和UDS 協議,包括ECU下位機開發(CW5.1),上位機開發(VS2010,C#),和APP開發(CW5.1),診斷下載流程和檢測方法通過車廠企業測試標準。
主體流程:? ?
? ?UDS診斷進入bootloader的流程:ECU上電時,先進入bootloader,初始化MCU后讀取EEPROM判斷是否可以跳轉到app層,如果判斷條件不滿足,則留在boot執行。這時上位機燒錄啟動后,會發送0x10 02 進入編程會話,然后解鎖ECU,發送0x34,0x36,0x37等服務請求將上位機加載的app代碼(.s19格式的文件)以數據的形式發送到下位機,下位機接收到代碼后通過寫flash,將代碼保存在flash(先進行地址分區)當中。 基本邏輯就是這樣。但是大部分情況都是從app跳入到boot中,這里有個關鍵是,上位機發0x10 02 只發一次,app接收到0x10 02 后產生復位后到boot中就會變成default session,這時需要判斷復位是因為重新上下電產生還是由于app運行時接收到了0x10 02,由固定位置的EEPROM中的內容確定此時是否需要從boot層跳跳轉到app層。
下載流程圖如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
本項目 bootloader原理框圖:
解鎖ECU算法采用的是SHA256 和 AES128加密解密算法,UDS安全訪問認證流程如下圖:
需要注意的幾個問題:
1.bootloader flash/EEPROM 內存分配方法:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?飛思卡爾9s12G128 單片機flash 內存映射表 | ||||
| 是否分頁訪問 | Page Num(0x) | Global Address(0x) | prm address(0x) | Size |
| Paged | 08 | 2_0000~2_3FFF | 16K | |
| Paged | 09 | 2_4000~2_7FFF | 16K | |
| Paged | 0A | 2_8000~2_BFFF | 0A8000~0ABFFF | 16K |
| Paged | 0B | 2_C000_2_EFFF | 16K | |
| Paged | 0C | 3_0000~3_3FFF | 0C8000~0CBFFF | 16K |
| No?Paged | 0D | 3_4000~3_7FFF | 4000-7FFF | 16K |
| Paged | 0E | 3_8000~3_BFFF | 16K | |
| No Paged | 0F | 3_C000_3_EFFF | 16K | |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? 1.1.MC9s12系列單片機尋址的特點:
由于16位單片機的 尋址范圍最多是0x0000~0xFFFF(64K),為了擴大尋址范圍,飛思卡爾單片機采取了地址分頁機制,簡單講就是NVM通過高地址+低字節地址來確定真實的flash地址空間,從而實現對flah的讀寫,具體如何手寫一段flash 寫函數又是一篇博文了。
? ? 2.1.中斷向量表必須放在非分頁區
? ? ? ? ? ?非分頁區可以由CPU 的pC指針直接訪問,當發生復位或者跳轉時,pc指針需要找到中斷向量表此時不能通過NVM來訪問flash,因此應用層工程就必須將中斷向量表放在非分頁區。
? ? 3.1.當 flash空間不足時,(此處應該附上9s12 內存映射圖)
? ? ? ? ?
2.s19 文件解析:附上文件解析的代碼(C#)
3.C# 的簡單使用:
? ? 3.1:加密/解密算法動態鏈接庫的制作:
? ? 3.2:USBCAN_II 動態鏈接庫的使用:
? ? 3.3:vspy3 動態鏈接庫的添加:
? ? 3.4:c# 中“全局變量"的使用:
? ? 3.5:生成bootloader上位機界面:
4. C語言 的隨機數生成:
? ? ? ? unsigned char value = random();即可得到一個隨機數(需要先#include "stdlib.h"這個頭文件)
5. UDS協議網絡層的概念(BS,FF,SF,CF P2Serve,P2*serve)
6.? 故障觸發和存儲,以及讀取的實現:
7.? c# 窗體假死bug的解決,以及按比例縮放窗體空間的方法:
? ? ? 這里的假死指的是 當點擊“燒錄”按鈕后,上位機就開始工作,此時窗體無法拖動,也不能縮小放大。
? ? ? 假死的本質原因:窗體線程正在進行數據收發,無法響應對窗體控件的操作。
? ? ? 解決此問題的辦法:將數據下載的操作委托給另一個線程,這樣窗體線程就能在燒錄過程中響應對鼠標窗體的操作了。
? ? ? 附上核心代碼:
總結
以上是生活随笔為你收集整理的uds 诊断协议的bootloader开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux-使用之vim出现的问题
- 下一篇: 【图像处理】——Python图像分割边缘