Mbed OS 固件更新(1)

Mbed OS 具备两种固件更新的方法:

  1.  通过SD 卡更新固件  将更新的二进制代码拷贝到SD卡上,插入Mbed OS 板卡上的SD卡中,按复位件,自动更新板上的固件,然后跳转到更新后的程序运行。
  2. 通过arm 云端服务器更新固件。

在本文我们先讨论第一种方法。

准备bootloader

固件更新是通过引导程序来完成的。引导程序(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 秒)

表明更新成功了。

 

 

你可能感兴趣的:(mbed,iot)