Mbed OS 具备两种固件更新的方法:
在本文我们先讨论第一种方法。
固件更新是通过引导程序来完成的。引导程序(bootloader)是将程序从sd 卡上读出,然后写入到MCU的内部Flash ROM 中。
bootloader 是mbed OS 上的一个程序,它的源码在
https://github.com/ARMmbed/mbed-os-example-bootloader
bootloader 目前支持- u-blox EVK-ODIN-W2, Nucleo F429ZI 或者 K64F几种板。
导入
我们使用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/GCC_ARM 目录中,会出现两个文件:
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 结合到应用程序中。
程序源代码
https://github.com/ARMmbed/mbed-os-example-bootloader-blinky
导入代码
mbed import mbed-os-example-bootloader-blinky
cd mbed-os-example-bootloader-blink
将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
Copy 到SD卡
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 秒)
表明更新成功了。