在一些使用場景中,用戶有大量的數據需要寫提前寫到flash中,在應用代碼中通過操作flash讀寫接口來讀取這些數據使用,本文將演示如何將這些數據添加到sdk生成的W806.fls固件末端,然後使用下載工具一起寫到flash裡。需要注意的是,用戶數據的長度需要大於1024字節,不夠的可以用任意數據補齊,否則會燒錄失敗。
假設用戶數據文件為user.bin,將user.bin放到SDK目錄bin/W806目錄下。user.bin裡我隨便寫入了寫數據。
打開tools/W806/utilities/aft_build_project.sh文件,根據W806的固件生成規則,在每一個.bin文件前面添加一個header,生成一個.img文件,將多個.img文件連接起來就是最後生成的.fls文件。所以在如下位置添加了兩個定義,user_img_header是用戶數據的header存放的地址,這個header只在燒錄的時候臨時使用,所以此處用的是內存的地址,內存的起始地址是0x20000000,大小是288KB,選擇任意中間的位置都可以。user_img_pos是用戶數據存放的起始地址,這個地址可以自己定義,需要注意不要和運行固件的地址重疊了,運行固件的起始地址是run_img_header=0x08010000,編譯後生成的W806.img文件大小就是運行固件的大小,兩者相加後就是用戶數據的最小起始地址,小於這個地址就會重疊,造成錯誤。
在下面的代碼裡添加如下兩行代碼,wm_tool.exe就是用來操作生成固件的工具,具體可參見wm_tool.c文件,這裡只說明幾個用到的參數。-b代表將要操作的.bin文件路徑,此處是放在bin/W806/user.bin,所以這裡也對應的是這個目錄,如果放在SDK的其他路徑下,這裡也要對應做修改。-o代表生成的.img文件的路徑和名字,放在同一個目錄下即可,所以還是bin/W806/user。-it標識img文件的類型,等於0代表的是secboot.img,等於1代表的是運行固件的img,此處我們選擇與運行固件相同的類型。-fc代表是否壓縮,選擇0不壓縮。-ra代表固件存放的起始地址,選擇上一步定義的user_img_pos。-ih表述header的地址,選擇上一步定義的user_img_header。其他參數暫時用不到,不做說明。
下一行代碼是將生成的.img文件拼接起來生成.fls文件。可以看到原來的代碼只是將secboot.img和W806.img拼接起來,生成了W806.fls。所以在W806.img後面加上user.img參數。修改完成保存。
為了測試是否成功,在main.c裡添加測試代碼如下,調用flash讀接口HAL_FLASH_Read讀取剛才定義的用戶數據起始地址0x08080400位置數據,看是否和user.bin的內容一致。
再次編譯工程,生成固件,可以看到在/bin/W806目錄下,生成了user.img文件。
下載固件,使用的是Upgrade Tools V1.4.19版本,可以看到在下載過程中,一共下載了三個.img文件,打印的數據也和user.bin裡的數據是一樣的。
如果在修改應用代碼過程中擔心固件和數據地址有重疊而不知道,可以在sdk的ld/W806/gcc_csky.ld文件中修改運行區固件的大小,這樣如果固件超範圍到了數據區地址,會編譯報錯,可以重新劃分數據起始地址向後移動。
點贊