今天突破性進展,成功實現了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工具詳細配置見上一篇文章)
最後完善相關配置,如設定更新完成標誌、出錯標誌、雙方的串列埠通訊協議等。
7.8日BOOTLOAD總結(3)
相關文章
- rt-thread bootloadthreadboot
- OOP 1~3總結OOP
- 2024暑假總結3
- shell學習總結-3
- 3月8日總結
- 3月21日總結
- 3月22日總結
- 3月11號總結
- 3月15日總結
- 3月18日總結
- vue3 文件總結Vue
- 每日總結3月7日
- 每日總結3月8日
- css3新特性總結CSSS3
- 每日總結4月3日
- 每日總結3月26日
- 每日總結3月27日
- 每日總結3月28日
- 每日總結3月29日
- 《三體3:死神永生》總結
- C語言全面總結-3C語言
- iOS開發經驗總結3iOS
- 3/25數倉面試總結面試
- CSS3一些總結CSSS3
- LeetCode 3Sum(015)解法總結LeetCode
- 解除安裝anaconda3總結
- 3年PHPer的面試總結PHP面試
- ServiceMesh 3:路由控制(圖文總結)路由
- 題目集1~3的總結
- 【知識點】SQLite3總結SQLite
- 【面試總結】記一次失敗的 bilibili 面試總結(3)面試
- 前端知識點總結——C3前端
- android sqlite3 not found 解決總結AndroidSQLite
- OOP題目集1~3的總結OOP
- OOP 1-3次作業總結OOP
- 每日總結2024年3月10日
- NCHU題目集1~3的總結
- 對題目集1~3的總結