项目场景:

使用GD32C103硬件平台和自己创建的软件空工程模板;

通过CAN总线进行固件的升级;编写bootloader程序进行固件的升级和引导。


基础知识

下面的基础知识是像我一个从未了解过bootloader的小白所要知道的

1、bootloader就是在上电后首先运行的一段程序,根据一些条件可以用来决定执行程序A或者程序B(说的简单了些,但我也只理解到这)。

2、MCU的存储:[1]
  GD32C103有128KB的片上Flash(起始地址为0x8000000),可用于存储指令或数据;32KB片上SRAM(起始地址为0x2000 0000)存储程序运行中的暂存数据。
  我们平常烧写程序一般就是从0x8000000开始烧写到片上Flash,程序一般也是从这个地址开始运行的

3、MCU的ISP下载、IAP下载、ICP下载:[2]
  ISP下载是通过配置boot引脚进入MCU出厂固定的bootloader程序执行区引导固件进行下载。例如:32的HAX文件串口烧写;
  ICP下载就是有电路可以直接下载程序,不需要bootloader来引导;我们常用的SWD、JLINK等都是MCU内部有专用的电路来下载程序(具体是什么原理不清楚);
  IAP下载,In applicating Programing ,在程序运行中烧写代码;原理是将MCU中用户可编程的FLASH(ROM)分区(一些有bootloader可编程的ROM的MCU不用自己分区)一部分存放bootloader引导程序,另一部分存放APP程序;上电先执行编写的bootloader引导程序来决定是运行APP还是等待传输固件数据;

实现的简单功能:

第一次写的bootloader;一些代码是直接复制,详细解释参看参考资料(个人第一次写,代码仅供参考):

我自己写的bootloader将MCU的内部Flash分为了bootloader程序存储区和APP程序存储区;
通过CAN总线来发送APP程序,CAN上位机用的周立功的上位机软件,可以发送bin文件;
具体流程:
  开机进入bootloader程序,5秒之内在没有接收到程序升级指令跳转到APP也可以发送升级结束指令;
  升级APP程序的话,需要重新上电5秒内发送程序升级指令,然后发送bin文件,bin文件发送完成后发送程序升级完成指令,APP程序即可运行;
  流程图如下所示:

我总共写了两个方案,这里我使用的第二个流程图方案;
接收数据到RAM是bootloader创建了一个很大的数组来存放上位机一股脑发过来的bin文件数据,没有进行校验;


代码实现:

提示:本人没有学过32,都是不会啥查啥,代码有些乱,多担待

实现上面的bootloader需要:
1、CAN配置和CAN接收发送,代码在user文件夹can.c和gd32c10x_it.c中;
2、Flash的基础,写入和擦除,代码在user文件夹Flash.c中;
3、将接收到的APP的bin文件数据加载到Flash函数,main.c的loading_flash ()函数;
4、程序跳转函数(网上copy的),main.c的jump_APP (uint32_t appxaddr)函数;
5、APP代码生成bin文件和MDK配置;(看下面的参考资料)
6、APP程序的主函数要添加一行中断向量表重定向代码;

代码工程链接:阿里云盘
提取码: s50l

参考资料:
[1]CM3架构和STM32 MCU——从存储系统开始
[2]单片机ISP、IAP和ICP几种烧录方式的区别
keil mdk生成文件.hex和.bin文件分析
GD32 STM32 bootload IAP程序跳转实现
GD32IAP升级(BootLoader)
GD32 IAP固件升级跳转 (Bootloader --> APP)踩坑解答
IAP跳转APP段代码理解
【GD32F310开发板试用】IAP升级实验
[3]GD32F103C8T6入门教程-IAP升级教程
STM32 IAP在线升级详解
IAP升级日记(STM32芯片)
STM32是如何软硬件结合,编译后怎么样一步步运行起来的
单片机的Bootloader,可以实现用户轻松升级程序
STM32单片机如何实现在线IAP升级

使用bootloader进行远程固件升级(32MCU)相关推荐

  1. Stm32F4以太网远程固件升级BootLoader踩过官方的坑

    历时5个工作日,总算把以太网远程远程固件升级功能完成,期间踩了不少的坑.最初设计的时候参照stm32官方1.26.1标准固件HAL库,新建一个工程,把官方对应的驱动移植到新的工程底下. 因为使用以太网 ...

  2. linux 嵌入式 远程升级,嵌入式设备远程固件升级方法与流程

    本发明属于远程固件更新 技术领域: ,特别是一种基于STM32F407单片机的靶场测试数据采集设备的远程固件升级方法. 背景技术: :固件(firmware)一般存储于设备中的电可擦除只读存储器EEP ...

  3. ESP32-C3入门教程 网络篇⑨——基于esp_https_ota实现史上最简单的ESP32 OTA远程固件升级功能

    文章目录 一.前言 二.软件流程 三.全部源码 四.运行演示 一.前言 本文基于VS Code IDE进行编程.编译.下载.运行等操作 基础入门章节请查阅:ESP32-C3入门教程 基础篇①--基于V ...

  4. nRF52832 bootloader DFU固件升级源码详解(结合RTT日志打印)

    文章目录 一.前文 二.init 三.nrf_dfu_command_req 四.dfu_handle_prevalidate 五.nrf_dfu_find_cache 六.nrf_dfu_data_ ...

  5. 基于SPI flash的 Multiboot远程更新

    基于SPI flash的 Multiboot远程更新 前言 Xilixn FPGA提供了一种在线升级的方式(本文使用的是A7和K7系列fpga,以下所讲述和涉及的都是与此2系列fpga相关)可以通过I ...

  6. RS485接口的IAP固件升级工具

    RS485接口的IAP固件升级工具 文章目录 RS485接口的IAP固件升级工具 前言 一.概述 二.IAP技术原理 三.IAP编程实现 1.bootloader程序 2.APP程序 四.上位机的编写 ...

  7. 工控物联网案例-如何利用LTE-658 4G DTU实现水文水利远程物联网监控

    前言 关于LTE-658如何实现水文水资源监控远程监控方案前言该系统能实现从水资源与水环境监测管理业务出发,融合传感.采集.M2M平台.信息汇集处理.水资源调度模型等技术,实现自动化计量.管理以及水质 ...

  8. GD32F303 使用 STM32Cubmex 开发应用 使用GD32官方例程 开发Bootloader 修正错误 见评论

    GD32F303 使用 STM32Cubmex 开发应用程序 使用GD32官方例程 开发Bootloader程序 最近使用GD32F303开发项目,为了偷懒使用 STM32Cubmex CPU选STM ...

  9. 工业设备远程运维系统平台

    远程操控设备就目前来说不是新的技术,物联网和通讯技术的发展,生活中通过APP等移动端智能产品数不胜数,随着互联网技术的发展,物联网不仅仅在生活中占据越来越多的份额,通过远程监控结合远程运维的技术在工业 ...

  10. HC32F460开发之bootloader实现

    文章目录 前言 一.Bootloader是什么? 二.FLASH分区 三.BootLoader的实现 1.如何实现应用程序的跳转 2.应用程序中断向量表的处理 总结 前言 在嵌入式开发的过程中,我们经 ...

最新文章

  1. 动态语言的灵活性是把双刃剑 -- 以Python语言为例
  2. ICCV2021旷视研究院入选9篇paper介绍(检测+点云+图像配准等)
  3. mooc python_MOOC python笔记(一):python语言概述
  4. 项目描述_单元测试技巧:创建描述性测试
  5. 《JAVA与模式》之责任链模式
  6. react ui框架_顶级React组件库推荐
  7. VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(三)
  8. java 回滚异常_Spring事务管理只对出现运行期异常进行回滚
  9. 学PyTorch还是TensorFlow?
  10. 以张鸿蒙系统的手机,搭载鸿蒙系统的手机真的要来了?因为别无选择,所以唯有向前!...
  11. 包裹遭联邦快递不正常“转运” 华为:将重新审视双方合作关系
  12. android4.0闪光灯亮度控制代码,android 应用开发如何调节闪光灯亮度?
  13. Leetcode 刷题笔记(十八) —— 二叉树篇之二叉搜索树的修改与构造
  14. scrapy框架之spider
  15. 三个字组成的字:鑫、淼、焱、众 …………
  16. 老鱼Python数据分析——篇八:项目重构(思路)
  17. 楪祈机器人_饥荒 Inori楪祈人物MOD V20161211
  18. 解决C/C++报错error: cannot pass objects of non-trivially-copyable type ‘std::string’问题
  19. vpb输出范围地形命令
  20. iview render函数(vue render函数)

热门文章

  1. Sqlmap使用教程【超全】
  2. 拉格朗日插值法及代码
  3. matlab中一个显示根号的技巧
  4. IO、NIO和AIO的区别
  5. android系统修改字体,安卓手机修改系统字体教程
  6. H3C交换机配置简单教程
  7. 基于海康威视IP摄像头和虹软的MFC人脸识别系统开发教程
  8. (node:3872) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issue
  9. 空间解析几何 | 空间曲线的切向量与曲面的法向量
  10. 临近空间大气环境特性