瞭解更多關於bootloader 的C語言實現,請加我Q扣: 1273623966 (驗證信息請填 bootloader),歡迎咨詢或定製bootloader(線上升級程式)。 不知道為什麼,現在工業控制領域也向汽車領域學習,產品需要帶bootloader, 產品出貨後也要可以通過bootloade ...
瞭解更多關於bootloader 的C語言實現,請加我Q扣: 1273623966 (驗證信息請填 bootloader),歡迎咨詢或定製bootloader(線上升級程式)。
不知道為什麼,現在工業控制領域也向汽車領域學習,產品需要帶bootloader, 產品出貨後也要可以通過bootloader更新應用程式。最近一個老客戶就讓我給其工控產品開發一個RS485的bootloader,產品使用的晶元是Microchip 的8-bit單片機PIC18,通信匯流排是RS485。我其實之前沒接觸過RS485匯流排,先學習了一下RS485匯流排,才開始RS485 bootloader的開發。RS485 bootloader 是在Uart bootloader 基礎上開發的,由於沒有客戶產品上的同款PIC18單片機, 我是在PIC18F46K22上開發好,然後由客戶自己移植到他們在用的PIC18單片機上。好在RS485 bootloader 三層軟體架構,應用層和底層是分開的,非常好移植。架構見圖:
RS485 bootloader 是使用XC8 和MPLABX 開發的。RS485 bootloader 上位機是使用C# 和VS2013 開發的,上位機界面如圖:
RS485 bootloader 通過燒寫器燒寫到PIC18 單片機後,後續更新應用程式只需一個USB轉RS485工具,USB接電腦,RS485匯流排和PIC18板子相連,操作上位機即可升級應用程式。RS485可以組網,所以RS485 bootloader 和Uart bootloader 的最大區別就是每幀數據都帶有節點地址,RS485節點收到每幀的數據,提取裡面的節點地址,在和自己的節點地址進行比較,相同才響應上位機並執行相應的動作完成應用程式的升級。
RS485 bootloader 是一個獨立的程式,以PIC18F46K22為例,bootloader存儲在ROM空間的0x000 - 0x7FF, 應用程式存儲在ROM空間的0x800 - 0xFFFF。所以bootloader 和應用程式共用單片機的整個ROM空間,boot loader 不使用interrupt, interrupt vector 需要重映射到應用程式空間, PIC18的interrupt vector 重映射非常容易,只需在應用程式的MPLAB X工程里配置好ROM offset=0x800即可。
RS485 bootloader 和 上位機之間的通信協議是自定義協議,RS485 bootloader 接收上位機傳過來的內容,按照自定義協議的格式解讀。格式解讀的代碼段:
switch (comRxCtrl) { case COMRX_SOF: if (ch == ':') { comRxCtrl = COMRX_ADDR; } break; case COMRX_ADDR: if (ch == COM_ADDRESS) { comRxCtrl = COMRX_DATA; } else { comRxCtrl = COMRX_SOF; } break; case COMRX_DATA: if (comData.rxIndex <= (comFrame.stuRecord.len + 5)) { comFrame.rawRecord[comData.rxIndex++] = ch; } else { comData.status |= COM_RX_OVERFLOW; } break; default: break; }
~!!~!!~!!~!!~!!~WELCOME TO MY HOME: WWW.CNBLOGS.COM/GEEKYGEEK~!!~!!~!!~!!~!!~