1.1 mcu设备远程升级程序的应用场景
在远程无线监控设备中,IAP程序远程升级功能起着重要作用。比如安装在监控区域的设备需要进行功能升级或者Bug修改,远程监控端可以通过WIFI、蓝牙、lora、以太网等模块将工程编译的bin文件远程发送给现场监控设备,从而避免人工拆除再重新烧录程序,节约大量人工、时间成本。本文主要介绍如何基于GD32mcu实现IAP(程序远程升级)设计思路。
1.2 MCU IAP实现基本原理
IAP程序远程升级的本质原理是将现场监控设备mcu的flash地址空间划分为两部分,一部分作为接收远程监控端的bin文件的bootloader区域,一部分作为应用层功能user app区域。bootloader区主要是通过无线设备将接收到bin文件的内容从user app区域的起始flash地址按顺序写入,接收完成后,修改SP、PC指针为user app区域,然后再跳转到user app区域执行应用层程序。本质就是通过bootloader区域对user app 的flash code区进行改写,从而实现远程设备功能升级或bug修改。mcu设备flash区域划分框图如下所示。

1.3 IAP keil工程设置
本文IAP实现是基于GD32F350芯片,通过查阅GD32用户手册可知F350芯片flash大小为128k,ram大小为16k,故我们将flash前28k、ram前6k作为bootloader区域,flash后面的100k、ram的10k作为userapp区域。如果mcu内部的flash空间足够大,可以将user区分为两部分,其中一部分作为备份区域。这样做的目的可以防止远程设备在接收监控端功能升级时出现断电情况,从而再次上电PC跳转到user区会导致程序跑飞,故每次都更新user备份区的代码,备份区的地址范围不是固定的,在user两个区域之间互换。远程mcu设备每次上电后,从bootloader区域开始执行,usb、usart、以太网、lora、wifi等设备检测是否有远程监控端更新user区域代码要求,有则接收监控端bin文件更新user code区,无则关闭所有中断跳转到user区执行程序。通过对bootloader区域flash某一地址写1或者0,判断是更新user区或者user备份区代码。按照首次user区划分的地址范围,第一次更新user备份区域,则将程序跳转到user 备份区域执行,首次的user备份区变为user app区域,原user app区域变为备份区。每次跳转到bootloader区,在跳转到user区时,读取flash某地址的值,决定跳转的user区。本文实现无user备份区,仅提供一个实现思想。bootloader区keil工程设置如下图:

bootloader 区域主函数代码如下:

#include "gd32f3x0.h"
#include <stdio.h>
#include "gd32f350r_eval.h"
#include "main.h"
#include "systick.h"void (*user_code)();//声明一个函数指针
#define user_start  0x8007000 //user code区起始地址
/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{uint8_t num=0;/*configure EVAL_COM1*/gd_eval_com_init(EVAL_COM);/*------------------------* 1、usb/usart/lora/wifi 等端口初始化* 2、判断是否接收更新user code代码请求,是则接收更新*//* 判断user_start地址内容是否为user code区域的SP指针*/if(((*(uint32_t*)user_start) & 0x2ffe0000)==0x20000000){/*起始地址加4的内容则为PC指针起始地址,将0x8007004转换为uint32*指针再取地址内容,则PC指针地址,再将PC指针地址强制转换为函数指针并赋值给user_code。*/user_code=(void(*)())*(uint32_t*)(user_start+4);/*设置栈顶指针为user 区栈顶  */__set_MSP(*(uint32_t*)user_start);/*跳转前关闭所有中断*/__disable_irq();/*-----跳转到用户代码区执行程序*/user_code();}while(1){}
}

user区 keil工程设置为如下图:

需要注意的是在user code keil工程中需要修改中断向量的偏移地址为0x7000,代码如下:

   #define NVIC_VECTTAB_FLASH 0x08000000#define VECT_TAB_OFFSET    0x7000nvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET);//该函数为GD 库函数,不同的芯片不一样,属于ARM cortex内核相关操作

user main函数代码如下所示:

#include "gd32f3x0.h"
#include <stdio.h>
#include "gd32f350r_eval.h"
#include "main.h"
#include "systick.h"void (*bootloader_code)();//声明一个函数指针
#define bootloader_start  0x8000000 //bootloader 区起始地址
/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{uint8_t num=0;/*configure EVAL_COM1*/gd_eval_com_init(EVAL_COM);printf("skip user code success!!");/*------------------------* user app 代码*//*----------再次跳转到bootloader区是否有更新user code 请求----------*//* 判断bootloader地址内容是否为bootloader code区域的SP指针*/if(((*(uint32_t*)bootloader_start) & 0x2ffe0000)==0x20000000){/*起始地址加4的内容则为PC指针起始地址,将0x8000004转换为uint32*指针再取地址内容,则PC指针地址,再将PC指针地址强制转换为函数指针并赋值给user_code。*/bootloader_code=(void(*)())*(uint32_t*)(bootloader_start+4);/*设置栈顶指针为user 区栈顶  */__set_MSP(*(uint32_t*)bootloader_start);/*跳转前关闭所有中断*/__disable_irq();/*-----跳转到bootloader代码区执行程序*/bootloader_code();}while(1){}
}

本文是通过user code区代码轮询来检测远程监控端是否有更新需求,实际项目中代码更新不会这么频繁,可以通过定时器设定每隔一定时间 跳转到bootloader区执行。基于GD32 mcu IAP程序远程升级实现大体框架就这些,具体项目应用还要结合项目需求,比如现场监控设备与远程监控端更新代码的通信协议需要自己定,用那种校验方式等等。

基于GD32MCU程序远程升级IAP设计思路相关推荐

  1. DSP 程序远程升级 / Bootloader设计指南(三)—— CMD文件与DSP存储空间

    技术交流 & 最新设计指南获取方法 步骤1) 扫描下方二维码,进入微信公众号 步骤2) 获取最新指南,在公众号后台回复以下关键字:[bootloader] 步骤3) 有疑问,在公众号后台回复以 ...

  2. DSP 程序远程升级 / Bootloader设计指南(二)—— 详解c_int00

    技术交流 & 最新设计指南获取方法 步骤1) 扫描下方二维码,进入微信公众号 步骤2) 获取最新指南,在公众号后台回复以下关键字:[bootloader] 步骤3) 有疑问,在公众号后台回复以 ...

  3. linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)

    基于Linux的远程管理系统的设计与实现(PHP) 来源:2BYSJ.cn 资料编号:2SJ260700 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5%A3%BA2SJ260 ...

  4. Pinterest 3.0 for iOS设计过程——升级iOS7设计思路详解

    Pinterest 3.0 for iOS设计过程--升级iOS7设计思路详解 时间2013-12-11 11:39:31  苹果开发中文站 原文  http://www.cocoachina.com ...

  5. 剖析MCU的IAP升级软件设计思路

    关注.星标公众号,不错过精彩内容 转自公号:最后一个bug 二次整理:strongerHuang 做软件开发的人,都知道程序升级.升级的方式有很多,今天就来讲讲升级的软件的设计思路. 一.ISP/IC ...

  6. 基于STM32F407 TFTP远程升级(局域网)

    技术大纲摘要 基于TFTP文件传输协议,实现STM32F407局域网内远程网络升级.单片机与网络IC均采用正点原子的STM32F407探索者,采用RAW LWIP例程进行移植,采用lwip1.4.1版 ...

  7. 基于FPGA的远程升级系统概述

    目录 一.理论基础 二.核心程序 三.仿真测试结果 作者ID :fpga和matlab CSDN主页:https://blog.csdn.net/ccsss22?type=blog 擅长技术: 1.无 ...

  8. STM32远程升级IAP功能+备份功能实现。(flash读写操作)

    远程升级加备份一共需要4个扇区,要确保flash可以被分成四个扇区(F4的扇区好大,4个16k,1个64k,剩下都是128k,对于小容量芯片非常不友好). 第一个存放出厂程序,也叫启动程序boot l ...

  9. 优质微信小程序的体验与设计思路

    体验和设计评估 在小程序的设计和开发阶段,我们希望开发者始终将优秀的用户体验作为产品目标之一,通过积极的用户体验和设计评估,在不断的迭代中完善用户体验,用心打磨小程序,从而更好实现产品价值,激发用户正 ...

  10. android 远程控制服务,基于Android的远程控制系统

    摘 要 远程控制可以实现远程操作服务端设备,达到远距离完成计算机作业的目的.本文所描述的系统便是一种远控系统,该系统在点对点模式的基础上,利用局域网建立手机和电脑端的连接,让手机模拟鼠标功能,远程操作 ...

最新文章

  1. oracle怎么查看一个表或一个索引占用多少空间
  2. jQuery控制表格垂直滚动条
  3. [poj]poj1860(SPFA)
  4. C#验证 中国 身份证 代码
  5. ubuntu路由器联网_路由器及其协议简介| 联网
  6. [基础篇]ESP32-RTOS-SDK教程(一)之Windows环境搭建
  7. php ASCII 字符转换 (汉字及特殊字符) 宽字符 (uft8/unicode)
  8. docker 1.8+之后ubuntu安装指定版本docker-engine
  9. [iOS] 响应式编程开发-ReactiveCocoa(二)
  10. Java实现Oracle数据库导入
  11. linux管理员基础知识
  12. 依赖注入:语法糖胜于功能组合
  13. 【BC260Y】 AT指令接入移动oneNet平台流程
  14. 爬取DMP_ISV版(达摩盘服务商版)画像数据
  15. 淘宝商品详情页API接口、淘宝商品销量API接口、淘宝商品列表API接口、淘宝APP详情API接口、淘宝详情API接口
  16. (Note)神经网络中的特征融合方式(add/concate)
  17. 2022-2028年全球与中国LED舞台照明行业市场前瞻与投资战略规划分析
  18. 人工智能技术会代替人类的工作吗
  19. 高防服务器和普通服务器之区别
  20. 根据先序和中序求后序,注意递归终止条件

热门文章

  1. jvm内存模型、jvm内存结构、Java内存结构、Java内存模型(JMM)、Java对象模型的区别(吐血研究整理)
  2. ubuntu大小写切换键的使用
  3. 项目管理手记(七)--DRP系统的文化输出与营销
  4. 在ESP32/ESP8266上使用MicroPython利用MQTT发布BME280传感器数据(温度,湿度和压力)
  5. 接入华为webpush webpush总结
  6. python程序员自我评价_程序员节,用一句话证明你是一个程序员
  7. 代数拓扑----视频推荐b站地址2022,可能会发布一些相关文章【重要】
  8. Android设备:外接扫码枪与系统软键盘问题
  9. Java空格算不算字符串长度_计算字符串尾部空格长度
  10. k均值算法——python实现