0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现MCU开发和OTA升级

9GxC_IoTMaker 来源:机智云开发者 作者:机智云开发者 2022-10-28 09:31 次阅读

本文以依托 GC211 和秉火开发板,讲述如何实现MCU开发和OTA升级。 用户如果将开发了的产品发布上线销售,后期需要更新固件和程序,就需要用到远程OTA固件升级,就能对已发布的产品进行远程升级。 01 硬件材料 1.机智云4G模组GC211,此模组采用中移模组ML302,支持网络,移动,联通,电信4G网络,可前往机智云官方和淘宝店铺购买。https://shop159680395.taobao.com/ 30a94f9a-5656-11ed-a3b6-dac502259ad0.png 2.秉火【F103开发板-指南者】 30e75696-5656-11ed-a3b6-dac502259ad0.jpg

02 云端开发

2.1、云端部署
创建新产品,可根据自己需求选择。 3102fbb2-5656-11ed-a3b6-dac502259ad0.png

添加如下数据点,可根据自己需求
313fd1c2-5656-11ed-a3b6-dac502259ad0.png
生成STM32F103代码下载备用 315fa006-5656-11ed-a3b6-dac502259ad0.png03 硬件部分说明 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分区方案如下图所示: 317e8b92-5656-11ed-a3b6-dac502259ad0.png
3.3 BOOTLOADER分区部分
3.3.1 Bootloader程序流程

Bootloader 的主要职能是在有升级任务的时候将 APPBAK 分区里面的固件拷贝到 APP 区域。当然,这期间需要做很多的工作,比如升级失败的容错等等。具体的流程可以参考图示。需要注意的是,在校验 MD5 正确后开始搬运固件数据期间,MCU 出现故障(包括突然断电),MCU 应发生复位操作(FLAG 区域数据未破坏),复位后重新开始执行 Bootloader,从而避免 MCU 刷成板砖。 31982cdc-5656-11ed-a3b6-dac502259ad0.png
3.3.2Bootloader程序配置
为了方便构架,此处我采用cubemx构建项目,生成keil工程。
创建STM32F103VE项目 321376b2-5656-11ed-a3b6-dac502259ad0.png 配置外部时钟 3233d024-5656-11ed-a3b6-dac502259ad0.png 配置时钟72M 32716e7a-5656-11ed-a3b6-dac502259ad0.png
配置debug为serisl wire 329537ce-5656-11ed-a3b6-dac502259ad0.png 配置串口4为BootLoader的日志打印口。 32c42d2c-5656-11ed-a3b6-dac502259ad0.png 生成keil代码添加驱动flash.c,gagent_md5.c和app.c以及对应的组,如何添加此处不过多介绍(基础的软件操作),只提供文件路径。 32e60884-5656-11ed-a3b6-dac502259ad0.png   32fc8ba4-5656-11ed-a3b6-dac502259ad0.png   3319e5e6-5656-11ed-a3b6-dac502259ad0.png   33546bc6-5656-11ed-a3b6-dac502259ad0.png   33609540-5656-11ed-a3b6-dac502259ad0.png
驱动文件的编写以及函数介绍我此处不过多介绍,可以在原文地址的附件进行下载源文件,也可以在文章末尾复制代码。 重点代码讲解 Main.c添加头文件#include "app.h" 33846c7c-5656-11ed-a3b6-dac502259ad0.png 主函数添加APP_Process(); 33a3f66e-5656-11ed-a3b6-dac502259ad0.png 根据自己分区大小设置区域,我的是18K,2k,54k,54k 33d2de2a-5656-11ed-a3b6-dac502259ad0.png
3.3.3Bootloader编译设置
按照 Bootloader 流程编写好代码,需要我们对 KEIL 工程做相应配置,需要注意的是编译的 Bootloader 固件大小不超过最大可允许的 18KB。Keil 编译器需要设置如下: 3411a074-5656-11ed-a3b6-dac502259ad0.png Flash 烧写地址设置有效 3439d724-5656-11ed-a3b6-dac502259ad0.png 设置ST-LINK按块擦除 FLASH 区间和烧写程序 3458fe1a-5656-11ed-a3b6-dac502259ad0.png347bf2bc-5656-11ed-a3b6-dac502259ad0.png34a932a4-5656-11ed-a3b6-dac502259ad0.png 编译烧录程序,到此BootLoader编写烧录完成。 34da8da4-5656-11ed-a3b6-dac502259ad0.png
3.3.4APP程序分区部分
固件接收流程
做好 BOOTLOADER 工作后,我们开始写 APP 分区的代码。APP 分区固件的编写要注意硬件版本号和软件版本号,软件版号作为升级迭代很重要的标志。 需要注意的是,中断向量地址偏移的定义,这个地方需要我们尤其注意,我在开发过程中在这个地方排查了好长时间。STM32 标准库默认中断向量地址偏移为0x0,但是我们APP 实际的偏移是0x5000。如果不修改,APP 也可以正常加载运行,但是不会相应中断。所以,我们需要根据实际APP 下载的起始地址,对中断向量地址偏移做定义。 34fabf8e-5656-11ed-a3b6-dac502259ad0.png
3.4 CUBEMX部署
解压云端生成的代码,由于生成的代码是STM32F103c8的,我们需要通过CUBEMX转换成STM32F103VET6的代码来适应我们的秉火开发板,创建一个新的cubeMX项目,导入自动代码的CUBEMX工程. 35265554-5656-11ed-a3b6-dac502259ad0.png 目录保存在解压代码所在的路径。 35416100-5656-11ed-a3b6-dac502259ad0.png 修改时钟树为72M,注意需要同BootLoader时钟。 357f20ee-5656-11ed-a3b6-dac502259ad0.png 根据项目需求以及我们自己创建的数据点,我们需要控制RGB灯,蜂鸣器,DHT11,在此处我们需要对引脚进行初始化。 359be4ae-5656-11ed-a3b6-dac502259ad0.png 配置RGB灯,采用定时器输出PWM控制。 35b9d338-5656-11ed-a3b6-dac502259ad0.png 有源蜂鸣器,和默认代码按键2冲突,修改按键2的GPIO为PB15 35dc5156-5656-11ed-a3b6-dac502259ad0.png
3.5 配置温湿度传感器DHT11
为每个单独的文件生成.C.H文件,方便调用头文件 36116cec-5656-11ed-a3b6-dac502259ad0.png 生成KEIL的代码 362e9e5c-5656-11ed-a3b6-dac502259ad0.png 到此我们就完成了项目的构建。 3.6 编译器设置 因为硬件FLASH 空间限定,我们需要对APP 的固件大小做严格的限制。本方案,
针对秉火开发板 我们可允许的最大固件为54KB。需要升级的新固件同样最大可支持54KB。
1、设置FLASH 固件下载地址 364f8b1c-5656-11ed-a3b6-dac502259ad0.png 2、配置中断向量偏移地址设置 36793926-5656-11ed-a3b6-dac502259ad0.png 3.重新构建工程,添加相关头文件。 36a245be-5656-11ed-a3b6-dac502259ad0.png 4.添加flash.h,flash.h, gagent_md5.c, gagent_md5.h, app.c文件到项目 36c3e05c-5656-11ed-a3b6-dac502259ad0.png 5. 在mian.c里面添加一下头文件 36d9d812-5656-11ed-a3b6-dac502259ad0.png 在main.c里面添加如下代码 371b4068-5656-11ed-a3b6-dac502259ad0.png 后续涉及部分代码修改和相关源码,字数比较多,所以建议参考原帖: https://club.gizwits.com/thread-166001-1-1.html 

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350972
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81000
  • OTA
    OTA
    +关注

    关注

    7

    文章

    578

    浏览量

    35193
  • 机智云
    +关注

    关注

    2

    文章

    587

    浏览量

    26392

原文标题:开发者案例|GC211实现MCU开发和OTA升级

文章出处:【微信号:IoTMaker,微信公众号:机智云开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OTA固件升级教程

    设备端。支持一个产品同时有多个推送支持wifi/mcu升级支持定向升级。可指定设备mac地址、区域、旧固件版本进行推送。支持定时推送。可自定义推送周期及推送时段。OTA进度统计分析
    发表于 03-01 18:31

    浅析单片机MCU OTA升级技术

    云端OTA通知推送云端只会给当时在线设备推送;对于当时不在线,或者没升级成功的设备,云端会每天推送一次。MCU OTA:包括下载、存储、校验、传输4个过程。下载、存储、校验同GAgen
    发表于 07-15 08:37

    STM32 OTA升级如何实现

    上次谈到OTA,有小伙伴私信我表示对升级的原理感兴趣。回想当初入职看到MCU在线升级的代码流程时,同样感到很神奇,毕竟学生时代我们在MCU
    发表于 11-10 07:30

    嵌入式OTA升级实现原理是什么

    目录一、简介1.1 概念1.2 优点1.3 实现原理二、MCU OTA升级2.1 制作升级包2.2 下载
    发表于 12-14 07:24

    如何实现OpenHarmony的OTA升级

    的能力。升级子系统对用户屏蔽了底层芯片的差异,对外提供了统一的升级接口。基于接口进行二次开发后,可以让厂商的设备(如IP摄像头等)轻松支持远程升级能力。
    发表于 02-07 10:29

    手把手教你OTA升级开发

    。具体升级的动作由升级脚本控制。本文将介绍如何针对OpenHarmony L2场景适配updater模式。主要内容包括: *1.OTA升级实现
    发表于 08-22 09:13

    基于MCU,如何零代码无开发实现OTA差分升级

    / 模块开发的方案,用户升级的主要目标是通讯芯片 / 模块。艾拉比在设备端有基于 UA+UC 的方式提供端云一体化的 OTA 解决方案。 2. 通过 MCU/DSP/MPU
    的头像 发表于 10-14 17:23 4841次阅读
    基于<b class='flag-5'>MCU</b>,如何零代码无<b class='flag-5'>开发</b><b class='flag-5'>实现</b><b class='flag-5'>OTA</b>差分<b class='flag-5'>升级</b>?

    基于MCU,如何零代码无开发实现OTA差分升级

    随着物联网设备智能化的发展,OTA 升级已经成为了业界公认的基础能力,而 OTA 在设计和实现过程中需要依赖于物联网设备的硬件方案。物联网设备主流的硬件方案为: 1. 直接基于通讯芯片
    的头像 发表于 10-30 10:03 575次阅读

    单片机MCU OTA升级技术

    云端OTA通知推送云端只会给当时在线设备推送;对于当时不在线,或者没升级成功的设备,云端会每天推送一次。MCU OTA:包括下载、存储、校验、传输4个过程。下载、存储、校验同GAgen
    发表于 10-23 13:06 16次下载
    单片机<b class='flag-5'>MCU</b> <b class='flag-5'>OTA</b><b class='flag-5'>升级</b>技术

    【笔记】MCU OTA升级流程

    OTA升级流程本文档以 STM32F103C8 为例。此 MCU 的 flash 共 64k,分为 64 页,每页 1k ,flash 的擦除需要以页为单位进行。OTA
    发表于 11-29 18:21 33次下载
    【笔记】<b class='flag-5'>MCU</b> <b class='flag-5'>OTA</b><b class='flag-5'>升级</b>流程

    如何实现OpenHarmony的OTA升级

    如何及时获取系统的更新,体验新版本带来的新的体验,以及提升系统的稳定性和安全性成为了每个厂商都面临的严峻问题。OTA(Over the Air)提供对设备远程升级的能力。升级子系统对用户屏蔽了底层芯片的差异,对外提供了统一的
    的头像 发表于 02-08 22:00 1620次阅读

    开发者案例|GC211实现MCU开发OTA升级

    本文以依托GC211和秉火开发板,讲述如何实现MCU开发OTA升级。用户如果将
    的头像 发表于 10-31 16:18 1192次阅读
    <b class='flag-5'>开发</b>者案例|GC211<b class='flag-5'>实现</b><b class='flag-5'>MCU</b><b class='flag-5'>开发</b>和<b class='flag-5'>OTA</b><b class='flag-5'>升级</b>

    在线升级 | 物联网中的OTA升级原理

    从最新的固件方式来看,可以分成以下几类01OTA升级1.1概念OTA:Over-the-AirTechnology,即空中下载技术。OTA升级
    的头像 发表于 02-02 09:59 1517次阅读
    在线<b class='flag-5'>升级</b> | 物联网中的<b class='flag-5'>OTA</b><b class='flag-5'>升级</b>原理

    RX系列帮您实现二级MCU OTA升级:FreeRTOS篇

    RX系列帮您实现二级MCU OTA升级:FreeRTOS篇
    的头像 发表于 10-26 18:04 914次阅读
    RX系列帮您<b class='flag-5'>实现</b>二级<b class='flag-5'>MCU</b> <b class='flag-5'>OTA</b><b class='flag-5'>升级</b>:FreeRTOS篇

    AT32 MCU如何使用OTA通过USART实现对固件的在线升级更新

    AT32 MCU如何使用OTA通过USART实现对固件的在线升级更新
    的头像 发表于 10-26 17:09 2548次阅读
    AT32 <b class='flag-5'>MCU</b>如何使用<b class='flag-5'>OTA</b>通过USART<b class='flag-5'>实现</b>对固件的在线<b class='flag-5'>升级</b>更新