在rt-thread下實現OTA在線固件更新功能

2020-09-03 紅楓物聯網

簡介

為了能讓開發者快速掌握 OTA 升級這把利器,RT-Thread 開發團隊提供了通用的 Bootloader。開發者通過該 Bootloader 即可直接使用 RT-Thread OTA 功能,輕鬆實現對設備端固件的管理、升級與維護。

下圖展示了 RT-Thread 通用 Bootloader 的軟體框架:

RT-Thread 通用 Bootloader 有如下特點:

  • 以 bin 文件的形式提供,無需修改即可使用
  • 資源佔用小,ROM 最小只需要 16KB,最大 32KB
  • 適用於多系列 stm32 晶片(目前支持 F1 和 F4 系列 )
  • 支持各種 SPI Flash 存儲固件
  • 支持固件加解密功能
  • 支持多種固件壓縮方式
  • 支持恢復出廠固件功能
  • 以上功能均可自由配置

功能說明

Bootloader 的主要功能是更新 app 分區中的固件。

分區表介紹

通用 Bootloader 中的分區表包含如下三個分區:

分區名起始地址分區大小分區位置介紹app自定義自定義片內 Flash存儲 app 固件download自定義自定義片內 Flash 或者片外 SPI Flash存儲待升級固件factory自定義自定義片內 Flash 或者片外 SPI Flash存儲出廠固件

升級固件功能

當系統需要升級固件時,Bootloader 將從 download 分區將固件搬運到 app 分區,主要功能流程如下所示:

  1. Bootloader 啟動時檢查 download 分區和 app 分區中的固件版本。
  2. 如果兩個固件版本相同,則跳轉到 app 分區,Bootloader 運行結束。
  3. 固件版本不同則將 download 分區中的固件搬運到 app 分區。
  4. 在搬運的過程中 Bootloader 可以對固件進行校驗、解密、解壓縮等操作。
  5. 搬運完畢後,刪除 download 分區中存儲的固件。
  6. 重啟系統跳轉到 app 分區中的固件運行,Bootloader 運行結束。

Bootloader 工作過程如下圖所示:

恢復固件功能

當系統中的固件損壞,Bootloader 將從 factory 分區將固件搬運到 app 分區,主要功能流程如下所示:

  1. Bootloader 啟動時檢查觸發固件恢復的引腳是否為有效電平。
  2. 如果有效電平持續超過 10S 則將 factory 分區中的固件搬運到 app 分區中。
  3. 如果有效電平沒有持續超過 10S 則繼續進行 2.2 小節中介紹的啟動步驟。
  4. 在搬運的過程中 Bootloader 可以對固件進行校驗、解密、解壓縮等操作。
  5. 搬運完畢後,保持 factory 分區中的固件不變。
  6. 重啟系統跳轉到 app 分區中的固件運行,Bootloader 運行結束。

獲取 Bootloader

Bootloader 可以通過網頁端在線生成的方式來獲取。開發者根據自己使用的晶片,填寫相關參數,然後點擊生成按鈕,即可在線生成 Bootloader。

Bootloader 在線獲取地址: http://iot.rt-thread.com

登陸帳號

新建產品

進入設備管理

進入生成頁面

進入 Bootloader 生成頁面後,根據頁面提示填寫板卡參數,點擊生成固件按鈕即可在線自動生成 BootLoader,同時也會將生成的固件發送到用戶郵箱中。

下面提供一個示例配置以供參考,開發者則需要根據自己手中板卡的實際情況,勾選和填寫所需功能。

點擊生成按鈕後,等待大約一分鐘即可通過自動下載或者郵件的方式獲取定製的 Bootloader。

使用 Bootloader

準備工作

  1. 在線生成 Bootloader 時可以自定義使用某個引腳作為串口輸出引腳,例如 PA9。波特率設置為 115200 ,通過 usb 轉串口正確地連接到 PC 端。
  2. 保證 jlink 正常連接到開發板。

燒錄 Bootloader

方法 1: J-Flash 工具燒寫

以 STM32F407ZGT6 晶片為例講述如何使用 J-Flash 工具燒錄 bootloader.bin 到開發板中,操作步驟如下:

  1. 打開 J-Flash 工具,配置燒錄參數。

  1. 選擇打開固件功能。

  1. 選擇需要燒錄的固件,這裡選擇在線生成後下載到本地的 Bootloader 固件。

  1. 燒錄 bootloader.bin 到指定地址 0x8000000。

  1. 連接開發板。

  1. 開始燒錄固件。

固件燒錄成功後會自動運行 Bootloader,列印出 RT-Thread 的 logo。

方法 2: ST-LINK Utility 工具燒寫

以下介紹如何使用 ST-LINK Utility 工具燒錄 bootloader.bin 到開發板中,這需要配合 ST-LINK 進行燒寫,操作步驟如下所示:

  1. 連接開發板。

  1. 設置連接選項。

  1. 燒錄:選擇需要燒錄的固件,這裡選擇在線生成後下載到本地的 Bootloader 固件。

製作 app 固件

本小節介紹如何使用 stm32 系列的 BSP 製作一個可以用於 OTA 升級的,包含 OTA 下載器功能 app 固件。

接下來的示例中所用的 BSP 路徑為 stm32/stm32f407-atk-explorer。

固件中使用的分區表如下所示:

分區名起始地址分區大小分區位置app0x8040000128k片內 Flashdownload0x8020000128k片內 Flashfactory0x8060000128k片內 Flash

製作該 app 固件有如下三個步驟:

  • 為 BSP 添加下載器功能,下載需要的軟體包並修改 FAL 分區表
  • 修改 stm32 BSP 中斷向量表跳轉地址
  • 修改 BSP 連結腳本

在後面的章節中,將按照上述步驟來製作 app 固件。

添加下載器功能

本小節介紹如何將下載器功能添加到 app 固件中。

添加該功能需要使用 env 工具,本次下載的軟體包在 iot 類別中,需要按照如下步驟操作:

  1. 下載 ota_downloader 軟體包,選中 Ymodem 功能。

  1. 添加 BSP Flash 驅動。

註:如果 BSP 沒有該選項,則需要手動在 board 文件夾的 Kconfig 添加下面定義,保存,然後重新進入 menuconfig 即可。

config BSP_USING_ON_CHIP_FLASH bool &34; default n

  1. 配置完畢後,先使用 pkgs --update 命令將所需要的軟體包下載下來,然後使用 scons --target=mdk5 命令重新生成 mdk 工程。

配置 FAL 分區

本小節將講述如何初始化 FAL 組件,並修改 FAL 分區表。開發者需要對 FAL 進行簡單入門,無需移植,只需要了解如何配置即可,詳細內容可參考 官方文檔。

本次製作的 app 固件將附帶下載器功能,下載器會將固件下載到 download 分區。根據第 4 章開始時的分區表可知,download 分區的地址為 0x8020000,而 app 分區的地址為 0x8040000。

初始化 FAL

由於 FAL 組件會被 ota_downloader 軟體包自動選中,因此直接添加 FAL 組件的初始化代碼即可。

  1. 修改 stm32f407-atk-explorer/board/ports/fal_cfg.h 文件中的分區表,使分區表中 download 分區的起始地址和大小與 Bootloader 中的 download 分區一致。

注意:如果 BSP 中沒有該頭文件,可以在該 BSP 目錄下 /packages/fal-latest/samples/porting 中複製一份進行修改,其中分區地址和大小是根據實際 bootloader 中定義的大小進行設置。下圖中標記處了可能需要修改的地方,請根據個人實際情況進行修改。

修改 app 固件配置

由於 app 分區的起始地址為 0x08040000,app 固件如果想運行在該地址,就需要修改連結腳本和中斷向量的跳轉地址。

  1. 修改固件的連結地址為 0x8040000。
  1. 修改中斷向量表的跳轉基地址為 0x8040000。

首先在 main.c 文件中添加如下代碼,這段代碼的功能是重新設定中斷向量跳轉地址為 app 分區的地址。

/** * Function ota_app_vtor_reconfig * Description Set Vector Table base location to the start addr of app(RT_APP_PART_ADDR).*/static int ota_app_vtor_reconfig(void){ #define NVIC_VTOR_MASK 0x3FFFFF80 /* Set the Vector Table base location by user application firmware definition */ SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK; return 0;}INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

然後在 main 函數中添加版本信息列印,如下圖所示:

  1. 下載 app 程序

直接點擊下載程序,固件就會被燒錄到 app 分區。Bootloader 啟動後將跳轉到 app 分區運行,實驗效果如下圖所示:

可以看到串口輸出的信息 The current version of APP firmware is 1.0.0,即當前固件的版本為 1.0.0 。

打包 app 固件

本小節講述如何使用 RT-Thread OTA 固件打包器對 app 固件進行打包,製作可以被下載到 download 分區的升級固件。固件打包工具可以在 ota_downloader 軟體包下的 tools 文件夾內找到。

  1. 在對固件進行打包操作前,先修改 stm32f407-atk-explorer/applications/main.c 中 APP_VERSION 宏的值為 2.0.0 作為參照,然後重新編譯一遍生成新的 rtthread.bin 文件,修改內容如下圖所示:

  1. 雙擊打開 tools\ota_packager\rt_ota_packaging_tool.exe 程序,使用 OTA 固件打包工具將上一步編譯出的 rtthread.bin 文件打包成可被升級的 rtthread.rbl 文件,如下圖所示:

固件打包器提供三種固件壓縮方式:fastlz、quicklz 和 gzip,一種固件加密方式 AES256。開發者可以根據實際需求選擇合適的加密壓縮方式。

執行 OTA

Ymodem 升級固件

使用 Ymodem 協議升級固件時,推薦使用 Xshell 終端。

在 msh 命令行中輸入 ymodem_ota 命令後,點擊滑鼠右鍵,然後在菜單欄找到用 YMODEM 發送選項發送文件,如下圖所示:

  1. 選擇 Ymodem 方式發送升級固件。

  1. 選中之前 OTA 固件打包工具生成的 rtthread.rbl 文件。

接下來升級固件就會通過 Ymodem 的方式被下載到 download 分區。

執行 OTA 升級

固件被下載到 download 分區後,系統會自動重啟,執行 OTA 升級。

升級完畢後可以看到如下效果:

串口輸出信息為 The current version of APP firmware is 2.0.0 ,說明固件已經被升級到 2.0.0 版本了。

更多固件下載方式

HTTP/HTTPS 固件升級是另外一種固件下載方式,製作下載器時如果開啟了系統中的網絡驅動,即可使用此種方式下載固件。具體步驟與 Ymodem 升級固件 小節大體一致。以下是配置截圖:

在終端輸入 http_ota http://xxx/xxx/rtthreadf.rbl 命令,系統將會從連結 http://xxx/xxx/rtthreadf.rbl` 處下載固件到 download 分區,之後系統會自動重啟,執行 OTA 升級程序。

恢復出廠固件

在生成頁面中選中了 恢復出廠固件引腳 功能後,即開啟了出廠固件恢復功能。開發者可以將製作好的 app 固件燒錄至 factory 分區中,在系統啟動前按下恢復出廠固件引腳(可選擇一個或者兩個引腳作為固件恢復觸發引腳)並保持 10S,即可從 factory 分區中恢復出廠固件到 app 分區中。

恢復出廠按鍵引腳配置如下:

factory 分區的配置如下所示:

按照上圖的配置,factory 分區被設置為從片內 Flash 首地址偏移 0x60000 的位置開始,大小為 128KB,想要使用固件恢復功能,則需要將可用的 app 固件燒錄到該分區中,固件恢復過程如下圖所示:

相關焦點

  • 如何讓開源LED電子時鐘屏跑起Bootloader和OTA升級
    Bootloader 的主要功能是更新 app 分區中的固件。以上資料來源:RT-Thread官方文檔,詳細可以參考:https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/三、操作流程分區說明:基於使用的STM32F401RCT6的內部Flash為256K,開源LED電子時鐘屏的源程序的固件大小為
  • 玩轉RT-Thread之荔枝派Nano(全志F1C100S)一、新手上路
    更詳細信息及開發文檔可在官網https://www.rt-thread.org獲取。RT-Thread代碼開源在github及國內的碼雲,2個倉庫同步更新。2018年3月底最新版本為3.0.3。RT-Thread下載RT-Thread官方github地址為:https://github.com/RT-Thread/rt-thread。在Env工具下使用:git clone https://github.com/RT-Thread/rt-thread.git。
  • 【RT-Thread】線程的基本知識
    在多線程系統中,我們根據功能的不同,把整個系統分割成一個個獨立的且無法返回的函數,這個函數我們稱為線程。線程由哪些部分組成?RT-Thread 中的線程由三部分組成:線程代碼(函數)、線程控制塊、線程堆棧。線程棧在一個裸機系統中, 如果有全局變量,有子函數調用,有中斷發生。
  • 人生苦短,用 RT-Thread MicroPython 享受編程的樂趣
    在 i.MX RT1050 EVK 開發板上實現這樣的一個讀取板載的 6 軸傳感器信息和系統 CPU 利用率等信息,實時顯示到網頁中效果,你猜需要多少代碼?事實上 RT-Thread 的同事利用 RT-Thread MicroPython軟體包,只做了些線的連接,敲幾個命令就實現了!
  • 使用STM32 通用 Bootloader ,讓 OTA 更加 Easy
    隨著物聯網時代到來,越來越多的智能設備擁有了在線升級的能力,無論是系統更新,產品功能迭代還是漏洞修復都能在第一時間抵達用戶手中的智能設備。在線升級功能需要使用 OTA (Over-the-Air) 技術 ,OTA 技術簡單地說就是通過網絡來升級手中的智能設備,進而使用設備最新版本的功能。
  • RT-Thread教程一之Linux下開發環境及QEMU配置
    RT-Thread原始碼Linux下安裝git後在工程目錄下(比~/Workplace)執行git clone https://github.com/RT-Thread/rt-thread我們看一下樹目錄結構rt-thread git:(master) tree . -L 1.
  • RT-Thread Studio V1.1 新版本發布
    【官網下載地址】https://www.rt-thread.org/page/studio.html(或點擊文末閱讀原文下載) 亮點功能1: 相對於V1.0.0創建裸板工程只支持STM32F1系列,V1.1.0已經實現了ST全系列支持  !
  • RISC-V單片機快速入門03-基於RT_Thread Nano添加控制臺
    前言:上一節,我們完成了GD32VF103在RT_Thread Nano上的移植,本節我們為其增加控制臺輸出功能,以及通過FinSH組件和用戶交互功能。實現rt_hw_console_output如下:void rt_hw_console_output(const char str){ rt_enter_critical(); while(str !
  • RT Thread v2.1.0 正式版發布
    下載連結:git打包下載:http://git.oschina.net/rtthread/rt-thread/repository/archive/v2.1.0這個版本經歷的時間比較長,並且原定的一些目標也還未能完成(更全的POSIX支持,包括device fd,socket等在內的select API接口等)。
  • RT-Thread Studio開發環境搭建
    一、基礎知識RT-Thread Studio 主要包括工程創建和管理,代碼編輯,SDK管理,RT-Thread配置,構建配置,調試配置,程序下載和調試等功能,結合圖形化配置系統以及軟體包和組件資源,減少重複工作,提高開發效率。
  • 一文詳解RT-Thread自動初始化
    官網文檔提及到了, (他們的文檔在這裡:https://www.rt-thread.org/document/site/programming-manual/basic/basic/#rt-thread_3),但是寫的只是概念層面上的,看完後會使用但原理還是不太清楚。之前研究過,今天把它總結下,寫出來分享。
  • 《rt-thread驅動框架分析》-i2c驅動
    在stm32的BSP中提供了軟體I2C的驅動,不過為了全面介紹,硬體I2C的對接,作者也進行簡單的對接和實現。rt_int32_t (*get_sda)(void *data); rt_int32_t (*get_scl)(void *data); void (*udelay)(rt_uint32_t us); rt_uint32_t delay_us; rt_uint32_t timeout;};函數指針 功能 void (set_sda
  • rt-thread內核對象標誌(object.flag)總結
    1 前言 在前面介紹rt-thread內核對象時(http://blog.csdn.net/flydream0?viewmode=contents),有介紹到rt-thread內核對象成員flag,但是沒有怎麼具體介紹他的含意,只是把它當做普通標誌來理解,這裡特意將此flag提出來總結一下,這也是這篇博文的目的. 首先,內核對象的flag確實是一標誌,且是8個位的數據,按位來定義的,那麼它到底各個位是怎麼定義的呢?答案是用在不同的內核對象時,它的各位定義會有所不同.
  • 國內自主物聯網作業系統 RT-Thread 3.0.1 發布
    在 3.0.1 版本中,USB Stack 得到了極大的增強,在 STM32F4xx 處理器上實現了對應的 USB Device 驅動,以及包括 HID,MSC,甚至是 RNDIS,ECM,WinUSB 等一系列的class driver。
  • 國產開源物聯網作業系統RT-Thread Smart正式上線(附原始碼下載地址)
    353EETC-電子工程專輯353EETC-電子工程專輯rt-smart內核即可包含基本功能,rt-smart用戶態應用環境採用musl libc提供POSIX接口調用及C運行環境,延續 RT-Thread 原有的生態,使用scons構建或其他的構建工具,例如xmake,cmake等,並對接 RT-Thread 在線軟體包;同時支持 POSIX,方便 Linux 應用的移植。
  • RISC-V單片機快速入門02-移植RT_Thread Nano
    /document/site/tutorial/nano/nano-port-gcc-riscv/an0042-nano-port-gcc-riscv/include &34;34;gd32vf103c_start.h&include &34;static rt_thread_t dynamic_thread = RT_NULL;void led_process_thread_entry(void
  • 物聯網作業系統一站式開發工具:RT-Thread Studio
    如果已經安裝過V1.0.0,直接重新啟動Studio就可以自動探測更新,直接升級至1.0.2。或者直接從官網下載V1.0.2完整版安裝程序。 相對V1.0.0,升級版本有很多亮點改進和新增功能期待大家來體驗。
  • RT-Thread x STM32 全連接創意創客大賽已開始報名
    RT-Thread版本使用說明可以使用:RT-Thread nano(源碼可在IDE內獲取或者RT-Thread文檔中心)或者RT-Thread完整版本(源碼下載可通過https://gitee.com/rtthread
  • RT-Thread V4.0.2 正式發布,優化 BSP、多核等方面體驗
    我們也從來不認為,功能越多,把系統搞得越複雜就是越有利、有效。小而美的物聯網作業系統,一直是我們的追求和口號。 這個時候肯定又有人會問,既然RT-Thread就這些功能,那如何體現出在其他方面的價值?這個要從我們2017年發布RT-Thread 3.0時說起。