Mbed OS 韌體更新
Mbed OS 具備兩種韌體更新的方法:
- 通過SD 卡更新韌體 將更新的二進位制程式碼拷貝到SD卡上,插入Mbed OS 板卡上的SD卡中,按復位件,自動更新板上的韌體,然後跳轉到更新後的程式執行。
- 通過arm 雲端伺服器更新韌體。
在本文我們先討論第一種方法。
準備bootloader
韌體更新是通過載入程式來完成的。載入程式(bootloader)是將程式從sd 卡上讀出,然後寫入到MCU的內部Flash ROM 中。
bootloader 是mbed OS 上的一個程式,它的原始碼在
匯入
我們使用Mbed CLI 工具來編譯bootloader。
mbed import mbed-os-example-bootloader
cd mbed-os-example-bootloader
修改
對於特定的板,需要修改mbe_app.json,有下面兩部分:
1 SD卡的引腳:
對於modular-2 模組化電腦,SD卡的定義如下
"target_overrides": { ………. "NUCLEO_F429ZI": { "target.restrict_size": "0x40000", "sd_card_mosi": "PC_12", "sd_card_miso": "PC_11", "sd_card_sck": "PC_10", "sd_card_cs": "PC_9" }, }
2. 定義升級程式的名稱:
"config": {
"update_file": {
"help": "Path to the application update binary on the SD card",
"value": "\"mbed-os-example-blinky_application.bin\""
},
}
編譯
mbed compile -m Nucleo F429ZI -t GCC_ARM
如果編譯成功,在BUILD/Nucleo F429ZI
mbed-os-example-bootloader.bin
mbed-os-example-bootloader-application.bin
其中mbed-os-example-bootloader.bin 是我們需要的bootloader二進位制程式碼,它可以結合到應用程式中。
結合到應用程式中
上一節產生的mbed-os-example-bootloader.bin ,結合到一個應用程式中,才能使這個程式轉變成可以更新韌體的應用程式( 稱為loadable image)。第一次要預先將可更新韌體燒入到裝置中。裝置中的程式可以在上電後會讀取sd 卡,如果有update 的loadable image ,會自動燒入裝置的FlashRom 中,實現程式韌體更新。當然,為了實現程式不斷地update,寫入sd 的image中也應該是loadable image。
下面我們來看看如何將bootloader 結合到應用程式中。
程式原始碼
匯入程式碼
mbed import mbed-os-example-bootloader-blinky
cd mbed-os-example-bootloader-blinky
將mbed-os-example-bootloader.bin拷貝到bootloader資料夾中。
修改mbed.app.json
指定bootloader
"target_overrides": {
"NUCLEO_F429ZI": {
"target.bootloader_img": "bootloader/mbed-os-example-bootloader.bin"
},
}
main.cpp的修改:
#include "mbed.h"
DigitalOut led1(PC_7);
int main() {
while (true) {
led1 = !led1;
wait(0.5);
}
}
編譯
mbed compile -m Nucleo_F429ZI -t GCC_ARM
如果編譯成功,
在BUILD/Nucleo F429ZI/GCC_ARM 目錄中,會出現兩個檔案:
mbed-os-example-bootloader-blinky.bin
mbed-os-example-bootloader-blinky -application.bin
燒入
將modular-2 和PC機連線,將mbed-os-example-bootloader-blinky.bin 拖入到板的碟符下實現燒入。
可以看見LED 紅燈閃爍。每秒一次。
升級
將main.cpp 做一些改動:
#include "mbed.h"
DigitalOut led1(PC_7);
int main() {
printf("bootloader Test\n");
while (true) {
led1 = !led1;
wait(1);
}
}
再一次編譯
mbed compile -m Nucleo_F429ZI -t GCC_ARM
mbed-os-example-bootloader-blinky -application.bin的名稱修改成mbed-os-example -blinky -application.bin(和bootloader mbed_app.json 中保持一致),然後將這個檔案拷貝到sd卡中,按復位健。這就將Update 韌體。在串列埠除錯中出現:
Firmware size is 64784 bytes
………
80%Flashed 81%Flashed 82%Flashed 83%Flashed 84%Flashed 85%Flashed 86%Flashed 87%Flashed 88%Flashed 89%Flashed 90%Flashed 91%Flashed 92%Flashed 93%Flashed 94%Flashed 95%Flashed 96%Flashed 97%Flashed 98%Flashed 99%Flashed 100%
Starting application
bootloader Test
紅髮閃速變慢(2 秒)
表明更新成功了。