关闭视频

机智云4G模组 GC211 开发指南

发表于:2021年06月15日 14:47更新于:2024年05月05日 10:04

本文以依托 GC211 和秉火开发板,讲述如何实现MCU开发和OTA升级。用户如果将开发了的产品发布上线销售,后期需要更新固件和程序,就需要用到远程OTA固件升级,就能对已发布的产品进行远程升级。

 

材料准备

 

1.机智云4G模组GC211,此模组采用中移模组ML302,支持网络,移动,联通,电信4G网络,可前往机智云官方和淘宝店铺购买

 

2.秉火【F103开发板-指南者】

 

 

开发内容

 

1、云端部署


创建新产品,可根据自己需求选择。



添加如下数据点,可根据自己需求


生成STM32F103代码下载备用

 

2、关于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 函数。

 

分析下OTA 需求,我们将建立两个工程,分别是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分区方案如下图所示:

 


BOOTLOADER分区部分


Bootloader程序流程
Bootloader 的主要职能是在有升级任务的时候将 APPBAK 分区里面的固件拷贝到 APP 区域。当然,这期间需要做很多的工作,比如升级失败的容错等等。具体的流程可以参考图示。需要注意的是,在校验 MD5 正确后开始搬运固件数据期间,MCU 出现故障(包括突然断电),MCU 应发生复位操作(FLAG 区域数据未破坏),复位后重新开始执行 Bootloader,从而避免 MCU 刷成板砖。


Bootloader程序配置
为了方便构架,此处我采用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


Bootloader编译设置
按照 Bootloader 流程编写好代码,需要我们对 KEIL 工程做相应配置,需要注意的是编译的 Bootloader 固件大小不超过最大可允许的 18KB。Keil 编译器需要设置如下:

 

Flash 烧写地址设置有效

 

设置ST-LINK按块擦除 FLASH 区间和烧写程序

 

 

编译烧录程序,到此BootLoader编写烧录完成。

 


APP程序分区部分


固件接收流程
做好 BOOTLOADER 工作后,我们开始写 APP 分区的代码。APP 分区固件的编写要注意硬件版本号和软件版本号,软件版号作为升级迭代很重要的标志。需要注意的是,中断向量地址偏移的定义,这个地方需要我们尤其注意,我在开发过程中在这个地方排查了好长时间。STM32 标准库默认中断向量地址偏移为0x0,但是我们APP 实际的偏移是0x5000。如果不修改,APP 也可以正常加载运行,但是不会相应中断。所以,我们需要根据实际APP 下载的起始地址,对中断向量地址偏移做定义。


CUBEMX部署
解压云端生成的代码,由于生成的代码是STM32F103c8的,我们需要通过CUBEMX转换成STM32F103VET6的代码来适应我们的秉火开发板,创建一个新的cubeMX项目,导入自动代码的CUBEMX工程.


目录保存在解压代码所在的路径。


修改时钟树为72M,注意需要同BootLoader时钟。


根据项目需求以及我们自己创建的数据点,我们需要控制RGB灯,蜂鸣器,DHT11,在此处我们需要对引脚进行初始化。


配置RGB灯,采用定时器输出PWM控制。


有源蜂鸣器,和默认代码按键2冲突,修改按键2的GPIO为PB15



配置温湿度传感器DHT11

为每个单独的文件生成.C.H文件,方便调用头文件


生成KEIL的代码

到此我们就完成了项目的构建。

 

 

编译器设置


因为硬件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里面添加如下代码

 

  6.在gizwits_protocol.h里面添加如下代码



7. 在gizwits_protocol.c里面添加相应的代码,此处不一一例举,只截图详细,详细代码请看附件代码(注意修改gizwitsHandle函数,此处不做截图)。



8.在gizwits_prduct.h修改这个参数可改变版本号,当前版本需要大于上一个版本。

 

 9.将代码下载到对应的地址,前面已配置好地址。后面需要生成bin文件才能进行推送(机智云最新版本的升级界面支持hex),在配置里面修改生成bin文件。



10.在产品的OTA界面进行固件升级,升级配置如下,手动推送需要主动更新,静默推送自动更新,其余按照要求配置即可。


到此本教程结束,如有疑问联系机智云技术支持,15120205205(QQ,微信,电话同号),后续涉及FLASH驱动编写、APP驱动编写及gagent_md5驱动编写的源码,参考机智云开发者社区原帖