本文以依托 GC211 和秉火開發板,講述如何實現MCU開發和OTA升級。 用戶如果將開發了的產品發布上線銷售,后期需要更新固件和程序,就需要用到遠程OTA固件升級,就能對已發布的產品進行遠程升級。 01 硬件材料 1.機智云4G模組GC211,此模組采用中移模組ML302,支持網絡,移動,聯通,電信4G網絡,可前往機智云官方和淘寶店鋪購買。https://shop159680395.taobao.com/ 2.秉火【F103開發板-指南者】
02 云端開發
2.1、云端部署
創建新產品,可根據自己需求選擇。
添加如下數據點,可根據自己需求
生成STM32F103代碼下載備用 03 硬件部分說明 3.1 關于STM32啟動 ARM7/ARM9 內核的控制器在復位后,CPU 會從存儲空間的絕對地址0x000000 取出第一條指令執行復位中斷服務程序的方式啟動,即固定了復位后的起始地址為0x000000(PC =0x000000)同時中斷向量表的位置并不是固定的。 然而,Cortex-M3 內核啟動有3 種情況: 1、通過boot 引腳設置可以將中斷向量表定位于SRAM 區,即起始地址為0x2000000,同時復位后PC 指針位于0x2000000 處; 2、通過boot 引腳設置可以將中斷向量表定位于FLASH 區,即起始地址為0x8000000,同時復位后PC 指針位于0x8000000 處; 3、通過boot 引腳設置可以將中斷向量表定位于內置Bootloader 區; Cortex-M3 內核規定,起始地址必須存放堆頂指針,而第二個地址則必須存放復位中斷入口向量地址,這樣在Cortex-M3 內核復位后,會自動從起始地址的下一個32 位空間取出復位中斷入口向量,跳轉執行復位中斷服務程序。對比ARM7/ARM9 內核,Cortex-M3 內核則是固定了中斷向量表的位置而起始地址是可變化的。 總結一下STM32 的啟動文件和啟動過程。 首先對棧和堆的大小進行定義,并在代碼區的起始處建立中斷向量表,其第一個表項是棧頂地址,第二個表項是復位中斷服務入口地址。 然后在復位中斷服務程序中跳轉C/C++標準實時庫的main 函數,完成用戶堆棧等的初始化后,跳轉.c 文件中的main 函數開始執行C 程序。 假設STM32被設置為從內部FLASH 啟動(這也是最常見的一種情況),中斷向量表起始地位為0x8000000,則棧頂地址存放于0x8000000處,而復位中斷服務入口地址存放于0x8000004 處。 當STM32 遇到復位信號后,則從0x80000004 處取出復位中斷服務入口地址,繼而執行復位中斷服務程序,然后跳轉main函數,最后進入mian 函數。 3.2OTA 需求分析 我們將建立兩個工程,分別是Bootloader 還有APP,我們將Bootloader下載到FLASH 空間0x8000000 地址處,那么STM32 啟動后會首先執行我們的Bootloader 程序,然后就可以按照我們意愿實現OTA 了。 ?FLASH區間劃分 根據需求,我們將STM32F103VET6 這個芯片Flash 空間劃分出4 個區域:Bootloader、FLAG、APP、APP_BAK。 四個區間作用描述如下: ? Bootloader: 存儲Bootloader 固件,MCU 上電后首先運行該固件。
? FLAG: 存儲有關升級的相關標志位,Bootloader 和APP 都需要操作該區域。
升級標志位(2B)
固件大小(4B)
MD5加密數據(16B)
? APP:存儲用戶程序固件。
? APPBAK: 臨時存儲云端下發的新固件,升級固件的一個過渡存儲區。 STM32F103VET6分區方案如下圖所示:
3.3 BOOTLOADER分區部分
3.3.1 Bootloader程序流程
Bootloader 的主要職能是在有升級任務的時候將 APPBAK 分區里面的固件拷貝到 APP 區域。當然,這期間需要做很多的工作,比如升級失敗的容錯等等。具體的流程可以參考圖示。需要注意的是,在校驗 MD5 正確后開始搬運固件數據期間,MCU 出現故障(包括突然斷電),MCU 應發生復位操作(FLAG 區域數據未破壞),復位后重新開始執行 Bootloader,從而避免 MCU 刷成板磚。
3.3.2Bootloader程序配置
為了方便構架,此處我采用cubemx構建項目,生成keil工程。
創建STM32F103VE項目 配置外部時鐘 配置時鐘72M
配置debug為serisl wire 配置串口4為BootLoader的日志打印口。 生成keil代碼添加驅動flash.c,gagent_md5.c和app.c以及對應的組,如何添加此處不過多介紹(基礎的軟件操作),只提供文件路徑。 ? ? ? ?
驅動文件的編寫以及函數介紹我此處不過多介紹,可以在原文地址的附件進行下載源文件,也可以在文章末尾復制代碼。 重點代碼講解 Main.c添加頭文件#include "app.h" 主函數添加APP_Process(); 根據自己分區大小設置區域,我的是18K,2k,54k,54k
3.3.3Bootloader編譯設置
按照 Bootloader 流程編寫好代碼,需要我們對 KEIL 工程做相應配置,需要注意的是編譯的 Bootloader 固件大小不超過最大可允許的 18KB。Keil 編譯器需要設置如下: Flash 燒寫地址設置有效 設置ST-LINK按塊擦除 FLASH 區間和燒寫程序 編譯燒錄程序,到此BootLoader編寫燒錄完成。
3.3.4APP程序分區部分
固件接收流程 做好 BOOTLOADER 工作后,我們開始寫 APP 分區的代碼。APP 分區固件的編寫要注意硬件版本號和軟件版本號,軟件版號作為升級迭代很重要的標志。 需要注意的是,中斷向量地址偏移的定義,這個地方需要我們尤其注意,我在開發過程中在這個地方排查了好長時間。STM32 標準庫默認中斷向量地址偏移為0x0,但是我們APP 實際的偏移是0x5000。如果不修改,APP 也可以正常加載運行,但是不會相應中斷。所以,我們需要根據實際APP 下載的起始地址,對中斷向量地址偏移做定義。
3.4 CUBEMX部署
解壓云端生成的代碼,由于生成的代碼是STM32F103c8的,我們需要通過CUBEMX轉換成STM32F103VET6的代碼來適應我們的秉火開發板,創建一個新的cubeMX項目,導入自動代碼的CUBEMX工程. 目錄保存在解壓代碼所在的路徑。 修改時鐘樹為72M,注意需要同BootLoader時鐘。 根據項目需求以及我們自己創建的數據點,我們需要控制RGB燈,蜂鳴器,DHT11,在此處我們需要對引腳進行初始化。 配置RGB燈,采用定時器輸出PWM控制。 有源蜂鳴器,和默認代碼按鍵2沖突,修改按鍵2的GPIO為PB15
3.5 配置溫濕度傳感器DHT11
為每個單獨的文件生成.C.H文件,方便調用頭文件 生成KEIL的代碼 到此我們就完成了項目的構建。 3.6 編譯器設置 因為硬件FLASH 空間限定,我們需要對APP 的固件大小做嚴格的限制。本方案,
針對秉火開發板 我們可允許的最大固件為54KB。需要升級的新固件同樣最大可支持54KB。
1、設置FLASH 固件下載地址 2、配置中斷向量偏移地址設置 3.重新構建工程,添加相關頭文件。 4.添加flash.h,flash.h, gagent_md5.c, gagent_md5.h, app.c文件到項目 5. 在mian.c里面添加一下頭文件 在main.c里面添加如下代碼 后續涉及部分代碼修改和相關源碼,字數比較多,所以建議參考原帖: https://club.gizwits.com/thread-166001-1-1.html?
-
mcu
+關注
關注
146文章
17321瀏覽量
352651 -
程序
+關注
關注
117文章
3795瀏覽量
81414 -
OTA
+關注
關注
7文章
587瀏覽量
35392 -
機智云
+關注
關注
2文章
591瀏覽量
26460
原文標題:開發者案例|GC211實現MCU開發和OTA升級
文章出處:【微信號:IoTMaker,微信公眾號:機智云開發者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論