本文基于沁恒CH58X 單片機的OTA功能
一鍵三連,收藏+點贊+評論 私信可獲取原文
📋 個人簡介
- 💖 作者簡介:大家好,我是喜歡記錄零碎知識點的小菜鳥。😎
- 📝 個人主頁:歡迎訪問我的 Ethernet_Comm 博客主頁🔥
- 🎉 支持我:點贊👍+收藏??+留言📝
- 📣 系列專欄:沁恒藍牙mesh二次開發 🍁
- 💬格言:寫文檔啊不是寫文章,重要的還是直白!🔥
OTA 下位機流程
下位機,收到指令:
【擦除】
收到數據幀: 0x81 len xx xx xx xx // 1字節 cmd + 1 字節長度 + 2字節 起始地址 + 2 字節 block 數量
執行動作: 上位機發一幀數據,下位機回應一幀ACK,直到上位機發送完,開始啟動擦除
【編程】
收到 數據幀: 0x80 len xx xx xx …… // 1字節 cmd + 1 字節長度 + 2字節 地址 + 243 字節數據
執行動作: 將接收到的數據,一幀一幀的寫到 APP2 的 flash 區域,每寫完一幀都和上位機回復ACK
【校驗】
收到 數據幀: 0x82 len xx xx xx …… // 1字節 cmd + 1 字節長度 + 2字節 地址 + 243 字節數據
執行動作: 依次讀取 APP2 的 flash,并校驗,直到結束,期間每寫完一幀都和上位機回復ACK
【發送信息】
收到數據幀: 0x84 len xx xx xx …… // 1字節 cmd + 1 字節長度 + 245 字節數據
執行動作: 向上位機發送一些列信息
【編程結束】
收到數據幀: 0x83 len xx xx xx xx // 1字節 cmd + 1 字節長度 + 2 字節數據
執行動作: 關中斷、修改 flash 標志位,軟復位
下位機報文:
【編程】
// 接收到一幀數據 + 寫入 flash + 向上位機發送 ack
// 0x80, 0xf0, 0x00, 0x01
// cmd + 數據長度 240 + 起始地址 0x1000 + 236 字節的 flash 數據
IAP_PROM: 00027000 len:240
0x80, 0xf0, 0x00, 0x01, 0x6f, 0x00, 0xc0, 0x74, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x20, 0x76, 0x22, 0x00, 0x20, 0xa9, 0xbd, 0xf9, 0xf5, 0x94, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x20, 0x00, 0x20, 0x98, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x20, 0x00, 0x20, 0xa0, 0x20, 0x00, 0x20, 0xa2, 0x20, 0x00, 0x20, 0xa4, 0x20, 0x00, 0x20, 0xa6, 0x20, 0x00, 0x20, 0xa8, 0x20, 0x00, 0x20, 0xaa, 0x20, 0x00, 0x20, 0xac, 0x20, 0x00, 0x20, 0xae, 0x20, 0x00, 0x20, 0xb0, 0x20, 0x00, 0x20, 0xb2, 0x20, 0x00, 0x20, 0xb4, 0x20, 0x00, 0x20, 0xf2, 0x22, 0x00, 0x20, 0xb8, 0x20, 0x00, 0x20, 0xba, 0x20, 0x00, 0x20, 0xbc, 0x20, 0x00, 0x20, 0xbe, 0x20, 0x00, 0x20, 0xc0, 0x20, 0x00, 0x20, 0xc2, 0x20, 0x00, 0x20, 0xc4, 0x20, 0x00, 0x20, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0xb7, 0x17, 0x00, 0x40, 0x93, 0x06, 0x70, 0x05, 0x23, 0x80, 0xd7, 0x04, 0x13, 0x07, 0x80, 0xfa, 0x23, 0x80, 0xe7, 0x04, 0x01, 0x00, 0x01, 0x00, 0x03, 0xc6, 0xb7, 0x04, 0x13, 0x76,
PROM:send ack to phone // 地址:0x10f0
IAP_PROM: 000270f0 len:240
0x80, 0xf0, 0x0f, 0x01, ……………………………………………………
PROM:send ack to phone
【校驗】
IAP_VERIFY: 00027000 len:240
0x82, 0xf0, 0x00, 0x01, 0x6f, 0x00, 0xc0, 0x74, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x20, 0x76, 0x22, 0x00, 0x20, 0xa9, 0xbd, 0xf9, 0xf5, 0x94, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x20, 0x00, 0x20, 0x98, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x20, 0x00, 0x20, 0xa0, 0x20, 0x00, 0x20, 0xa2, 0x20, 0x00, 0x20, 0xa4, 0x20, 0x00, 0x20, 0xa6, 0x20, 0x00, 0x20, 0xa8, 0x20, 0x00, 0x20, 0xaa, 0x20, 0x00, 0x20, 0xac, 0x20, 0x00, 0x20, 0xae, 0x20, 0x00, 0x20, 0xb0, 0x20, 0x00, 0x20, 0xb2, 0x20, 0x00, 0x20, 0xb4, 0x20, 0x00, 0x20, 0xf2, 0x22, 0x00, 0x20, 0xb8, 0x20, 0x00, 0x20, 0xba, 0x20, 0x00, 0x20, 0xbc, 0x20, 0x00, 0x20, 0xbe, 0x20, 0x00, 0x20, 0xc0, 0x20, 0x00, 0x20, 0xc2, 0x20, 0x00, 0x20, 0xc4, 0x20, 0x00, 0x20, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0xb7, 0x17, 0x00, 0x40, 0x93, 0x06, 0x70, 0x05, 0x23, 0x80, 0xd7, 0x04, 0x13, 0x07, 0x80, 0xfa, 0x23, 0x80, 0xe7, 0x04, 0x01, 0x00, 0x01, 0x00, 0x03, 0xc6, 0xb7, 0x04, 0x13, 0x76,
VERIFY:send ack to phone
【結束】
IAP_END
Image Flag 03
下位機地址計算
比如說編程時,上位機傳輸的地址為:第一幀:0x1000 第二幀:0x10f0
實際編程時,第一幀地址:0x00027000 ,第二幀地址: 0x000270f0
計算:
- 0x00 0x01 兩個u8 轉u16 ,小端格式存儲 變為 0x1000 ,這是 Jump_IAP 的結束地址
- 左移4位,變為u32 , 0x0000_1000
- 偏移 IMAGEA 地址, 0x0000_1000 + 152K = 0x00027000