開發stm32 目前在國内用的最多的集成開發環境就是MDK。最近做一個stm32的IAP在線升級程序,這個IAP程序編譯以後生成的bin文件我需要對它做個修改,存入我對整個APP代碼部分的checksum校驗。這樣我就可以通過bootloader來驗證我app部分代碼的完整性。
這裡面有個關鍵地方就是要對編譯好的bin文件進行修改。仔細想想MDK本身編譯好以後直接生成的是hex而非bin文件,那麼生成的bin是通過編譯後添加了一個選項生成的,如下圖所示:
圈起來的地方完整的命令如下: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe –bin -o ./IAP-LED/IAP-LED.bin ./IAP-LED/IAP-LED.axf
也就是編譯晚以後會調用這條命令把IAP-LED.AXF 文件轉換成bin文件。
于是呢我就順着這條思路,來實現編譯後對我bin文件的修改。但是這裡我不再是調用一個現成的exe文件,而是換成了python腳本,測試了還果然ok。(前提是電腦上要安裝python并且添加到環境變量中)
下面就公布下我這段python代碼:
import os import sys import struct APP_SIZE=0XB0 #bin文件中的偏移地址 APP_CHECK=0XB4 APP_VER=0XB8 arg=sys.argv[1] #sys.argv[1] 表示傳入的第一個參數 fileName=str(arg) #通過傳入參數獲取bin文件名稱 f = open(fileName,'rb') #打開文件 buf=bytearray(f.read()) #讀取文件内容并轉換為byteArray,原為bytes不能編輯 f.close() #關閉文件 fileSize=len(buf) #獲取bin文件長度 print('|***************************bin add check tool********************************|') print('|*******************************BY Derrick************************************|') print('--read source file success! fileName: ' fileName ' filesize: ' str(fileSize)) newFileName=fileName[:-4] '-Check.bin' #拼接出新文件名 fileChecksum=sum(buf) #定義checksum print('--calc checksum is :' str(fileChecksum)) #把unsigned int型整數打包存進buf中 struct.pack_into('I',buf,APP_SIZE,fileSize) #寫入文件長度 struct.pack_into('I',buf,APP_CHECK,fileChecksum) #寫入checksum f=open(newFileName,'wb') #把buf内容寫入新的bin文件中 f.write(buf) f.close() print('--New bin file generated :' newFileName)
然後我把這個這個代碼保存為APPC.py名稱。并把它和我的MDK工程放在同一個文件夾下面。之後就是在我的mdk設置裡面添加編譯後執行該腳本了:
這樣做有什麼好處呢?就是每次編譯完我就可以直接獲得我想要的最終結果,而不再需要手動的把bin再通過手動進行修改。大大提高了效率
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!