最近開發了stm32用SD卡進行IAP固件升級用的bootloader,特整理一下筆記:
首先說一下升級原理,固件升級需要有2套程序,1套就是加載引導程序,也就是所謂的bootloader。另一套就是APP程序。
主要的難點就是bootloader程序了。下面講解如何寫基於SD卡的bootloader程序。
編寫基於SD卡的固件升級bootloader,需要做一下幾項工作:
- 編寫移植能驅動SD卡的SDIO驅動bsp
- 移植能讀寫SD卡的文件系統
- 對flash程序存儲區進行分區
- 移植能進行stm32的片內flash讀寫的驅動
- 從SD卡加載讀取APP程序,以及寫flash,跳轉
- Keil編譯出.bin文件
(1) SD卡SDIO驅動 && 文件系統移植
首先,要想能支持從SD卡進行固件升級,首先MCU需要能從SD卡進行讀寫。操作SD卡對於stm32有集成的硬件SDIO接口,然後還需要移植能讀寫SD卡的文件系統。說到移植SD卡的文件系統,這裏有個小插曲不得不說,一開始我移植的文件系統,發現太大了,編譯出來的bootloader足足有180多kB,佔據了stm32的flash的半壁江山。後來對文件系統進行了裁剪後之後不到30k了。
1.1 SDIO驅動:
SDIO驅動我也是沒時間自己去寫,而是直接移植的官方的sdio驅動部分,裏面集成了基於SDIO的讀寫擦操作的API接口,移植好後可以直接調用。說到SDIO驅動,我就再多說兩句吧,請看下面的電氣連接:
SD卡中有4個DATAx數據總線(DATA0-DATA3),實際應用電路中,如果對讀寫速度沒有太高的要求,可以直接使用DATA0作爲數據傳輸線,其它都不必連接。這時的SDIO驅動中需要將 SDIO_BusWide_4b換成 SDIO_BusWide_1b。如下圖
把以上兩處都換成1根數據線的驅動後,就可以快樂的使用sdio總線讀寫SD卡了。
1.2 文件系統移植
我這裏移植了野火例程的FATFS文件系統,該系統使用的是ff9,如下圖
移植的時候只將diskio.c ff.c以及cc936.c放到工程裏面即可,如下圖:
我剛移植完時,發現編譯出來的文件,足足有180多k, 絕大多數都是因爲中文編碼的文件佔用了太多儲存,根本不能作爲bootloader使用,需要對文件系統進行裁剪,裁剪方法就是將
ffconf.h裏面的宏修改一下:
這個宏默認是936,也就是支持中文編碼,現在把它改爲1,也就是不支持中文等,編譯出來一下子就會變小了,哈哈O(∩_∩)O哈哈~。
2. 對stm32的片內flash進行分區處理:
我使用的是512kB Flash存儲的片內flash,這是stm32的片內flash映射圖: