1. 程式人生 > >Mbed OS 韌體更新

Mbed OS 韌體更新

Mbed OS 具備兩種韌體更新的方法:

  1.  通過SD 卡更新韌體  將更新的二進位制程式碼拷貝到SD卡上,插入Mbed OS 板卡上的SD卡中,按復位件,自動更新板上的韌體,然後跳轉到更新後的程式執行。
  2. 通過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

/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 結合到應用程式中。

程式原始碼

匯入程式碼

mbed import mbed-os-example-bootloader-blinkycd 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 秒)

表明更新成功了。