7.8日BOOTLOAD總結(3)

小智001發表於2024-07-08

今天突破性進展,成功實現了SC92系列的單區遠端升級功能,之前廠家給的DEMO程式存在一些問題,或者說是KEIL5軟體的問題,導致FLASH分割槽內的程式燒寫出現了問題。
問題描述:用工具將BOOT和APP程式合併後,FLASH分割槽的01H-600H為BOOT程式,600H以後為APP程式,等同於先燒錄APP程式,再燒錄BOOT程式。若先燒錄APP程式,再燒錄BOOT程式會出現問題,APP程式的HEX檔案轉為BIN檔案後檢視發現在00H-600H處也有資料,不過多數為空(00H),將BOOT區程式破壞掉了;合併後的程式燒錄後,用IAP去燒寫APP程式,出現了類似上面的問題,APP區內資料被破壞,無法正常執行,不過真正的BOOT區沒有被破壞,由於IAP寫是在600H開始寫入的,但是會把APP的BIN檔案內的00H-600H的無效資料寫入到600H-C00H區域內,正常APP程式應該是從600H處開始寫入APP的資料,如圖所示

解決方案:KEIL5軟體生成的HEX檔案轉成BIN檔案後無法編輯(本來想把前600H的資料刪除的,發現只能清零,不能刪除),後考慮從BOOT程式入手,對接收到的資料進行處理,IAP收到APP資料的前600H包資料不做處理只計數,對600H以後接收到的資料進行正常寫入到晶片FLASH 600H區域及以後。這樣處理後IAP寫入正常的APP程式便可以正常執行了。此時的BOOT區和APP區與合併後的BOOT-APP一致。
由於SC92系列晶片沒有硬體支援讀取FLASH內容,導致很多問題只能一點點排除,最開始猜到了APP區程式出現了問題,但是不知道問題出現在哪裡,對比合並後的BOOT-APP的BIN檔案、BOOT的BIN檔案、APP的BIN檔案後發現了該問題。具體原因不知道是不是因為KEIL5軟體生成的HEX檔案出現了問題,還是廠家給的DEMO程式本來就有問題,不過好在最後終於是解決了問題。下一步要研究AB雙區備份的問題了。
總結一下,單區的BOOTLOAD方法:
51微控制器啟動流程:當51微控制器上電後,CPU會從CODE區的00H地址開始取得指令,通常00H地址存放的是一條跳轉指令,將程式跳轉至STARTUP程式中,在STARTUP程式中完成清RAM和一些變數的初始化。完成了以上動作之後程式才會跳轉到main函式執行相關程式。為了保證Bootloader功能正常執行,程式需要首先進入Bootloader工程的STARTUP程式和main以完成一些Bootloader功能相關的設定,在完成了設定之後才允許跳轉至使用者工程的STARTUP檔案和main中執行使用者的應用程式碼。
首先分割槽,分為載入程式BOOT區和使用者程式APP區
其次設定中斷向量重對映,重對映到使用者程式APP區地址開頭,接下來的地址儲存使用者APP區的STARTUP資料(KEIL5工具詳細配置見上一篇文章)

最後完善相關配置,如設定更新完成標誌、出錯標誌、雙方的串列埠通訊協議等。