1. 程式人生 > 其它 >將PC上的資料匯入到MCU的External Flash上續

將PC上的資料匯入到MCU的External Flash上續

在Keil和Segger Embeded Studio上實現Flashload不成功後,轉到用Segger的JLink的CommanderScript的配合終於完成了將PC上的資料成功傳到擴充套件Flash上了。

將實現方法以及碰見的坑整理一下:

  • 實現方法:
    • 在Apollo3 MCU上用Keil開發一個程式,將指定地址的Internal Flash的資料塊Copy到External Flash上。
    • 由於Internal Flash的空間有限,通常是2MB,算上已經使用的,也就是能有1MB左右的空間可以做搬運的中轉站,所以在MCU跑的的程式每次只能搬運1MB內容
    • 在PC上用C語言開發一個將大檔案切割成1MB小檔案的工具,將檔案分割成數個1MB大小的檔案。
    • 寫JLink Command Script將1MB的檔案從PC 搬到Internal Flash上
    • 寫JLink Command Script通知MCU的程式,將資料搬到External Flash上。
    • JLink 與MCU的程式通過 JLink 命令(w4,m32命令)與MCU的程式訪問同一記憶體資料空間,來通知MCU程式資料已經準備好了,JLink通過Sleep來確認MCU的搬運結果
  • 碰見的坑:
    • 每次Loadbin後,MCU的程式會Halt了。Jlink與MCU之間的記憶體通訊空間就不正常了。
      • 剛開始的時候,操作順序是在一個script中,呼叫loadbin將資料檔案載入Internel Flash上,然後通過w4命令通知MCU去搬運,發現兩邊根本碰不上。
        • 解決方法:在Loadbin資料檔案後,再次呼叫將MCU的執行程式Loadbin載入進入MCU上,呼叫reset/g兩個命令才能正常執行。
    • 每次Loadbin,Jlink會檢查Load的資料與MCU的Internal Flash的資料是否一致,如果沒有變化,不會做loadbin操作。導致載入MCU的搬運程式不會被重置MCU執行環境,也不能正常進行搬運工作。
      • 解決方法:每次呼叫loadbin之前將對應的Internal Flash地址段Erase一次,這樣就能正常操作了。