去某新能源大厂出了一次差,这次出差是为了升级程序解决Bug,需要给单片机重新烧录.hex文件,用户已经将产品封装起来,无法开盖,只能使用CAN总线来更新程序,用Bootloader实现。其实就是通过上位机把.bin/hex文件以CAN通讯的方式发送给单片机并存储在规定的Flash中。这个过程与手机端更新APP类似。

以STM8单片机为例,该如何实现Bootloader呢?今天和大家分享一下。

01

什么是Bootloader

Bootloader是一段用于更新自身应用软件并独立运行的代码,常被用于升级产品和修复产品bug。STM8单片机如果要下载hex文件的话需要通过STVP和STLINK来实现,单片机的引脚SWIM就是下载接口。如果产品在用户端被封装好了,无法通过SWIM来下载该怎么办呢?就使用Bootloader,STM支持CAN和UART实现Bootloader。就是通过CAN通信或者UART通信将数据存放在STM8的Flash上。

02

划分Flash区间

STM8的中断向量跳转地址是固定的,会跳转到0x8000对应中断的偏移地址,所以会把Bootloader存放在0x8000开始的空间内,比如给Bootloader代码所划分的空间为4k,那么空间起始地址为:0x8000-0x8FFF;那么应用代码的起始地址就可以从0x9000开始。

03

修改中断向量表

STM8的中断向量表通过一段特定的代码来实现,并需要根据前文提到的空间划分来修改。STM8的应用程序起始地址是0x8400,默认的向量表如下代码所示:

__root const long reintvec[]@".intvec"=
{
0x82008080,0x82008404,0x82008408,0x8200840c,
0x82008410,0x82008414,0x82008418,0x8200841c,
0x82008420,0x82008424,0x82008428,0x8200842c,
0x82008430,0x82008434,0x82008438,0x8200843c,
0x82008440,0x82008444,0x82008448,0x8200844c,
0x82008450,0x82008454,0x82008458,0x8200845c,
0x82008460,0x82008464,0x82008468,0x8200846c,
0x82008470,0x82008474,0x82008478,0x8200847c,
};

前文已经将应用程序的起始地址修改为0x9000,所以,向量表的的修改方法为:除了第一个元素为,其余的元素将8改为9,修改完后代码如下:

__root const long reintvec[]@".intvec"=
{
0x82008080,0x82009404,0x82009408,0x8200940c,
0x82009010,0x82009014,0x82009018,0x8200901c,
0x82009020,0x82009024,0x82009028,0x8200902c,
0x82009030,0x82009034,0x82009038,0x8200903c,
0x82009040,0x82009044,0x82009048,0x8200904c,
0x82009050,0x82009054,0x82009058,0x8200905c,
0x82009060,0x82009064,0x82009068,0x8200906c,
0x82009070,0x82009074,0x82009078,0x8200907c,
};

04

修改ICF文件

ICF文件存放在编程环境的安装目录下,每个型号/系列的单片机都会对应一个ICF

文件,需要修改一下ICF文件,这里需要根据flash空间的划分来修改,前面将Bootloader的终止地址设置为0x9FFF,所以修改如下:

define region NearFuncCode = [from 0x8000 to 0x8FFF];
define block INTVEC with size = 0x80 { ro p .intvec };
place at start of NearFuncCode  { block INTVEC };

05

跳转命令

所谓跳转,就是在应用程序中跳转到Boot中去升级;升级完成后需要跳转到应用程序中,所跳转的起始就是起始地址。Bootloader跳转到应用程序的代码如下:

asm("LDW X,  SP ");
asm("LD  A,  $FF");
asm("LD  XL, A  ");
asm("LDW SP, X  ");
asm("JPF $9000");

应用程序跳转到Bootloader中的代码如下

sm("LDW X,  SP ");
asm("LD  A,  $FF");
asm("LD  XL, A  ");
asm("LDW SP, X  ");
asm("JPF $8000");

06

编写交互代码

以上设置好之后,就可以编写交互代码了,所以交互代码其实就是一套协议,规定了应用程序如何跳转到Boot,在Boot中如何处理和存储数据,这需要上位机的支持。如果只是用于自家的产品,就可以自己定义协议。也可以使用标准的协议,比如汽车行业中的UDS(统一诊断服务)

Bootloader实现之后,就可以使用CAN/UART来实现产品固件的升级了。这就是Bootloader的关键内容,本文你学会了吗?留言讨论一下吧。

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

单片机的Bootloader,可以实现用户轻松升级程序相关推荐

  1. 单片机利用bootloader阶段对app进行升级的方案

    使用单片机平台:MT031, 32位处理器,最高运行频率72Mhz, 32kb FLASH, 4kb sram. 目标:在该平台上实现bootloader+app的软件结构,bootloader和ap ...

  2. PIC单片机的BootLoader实现

    转载自:http://blog.sina.com.cn/s/blog_77b8b43b0102v9ut.html 引 言 PIC单片机的BootLoader属于需要自己写程序的那种,可以根据自己的需要 ...

  3. STM32生态系统 第三期(一)STM32WB无线协议栈和用户应用升级的准备工作

    STM32生态系统 第三期(一)STM32WB无线协议栈和用户应用升级的准备工作 STM32_STM8_MCU2019-10-31 阅读数:2032 以往普通的一颗STM32,拿到芯片空片后,我们可以 ...

  4. 博睿数据赋能数字化转型,用户体验升级需要有“温度”的技术

    2021年9月16日,服务可达的"数据链DNA"--博睿数据2021年战略升级发布巡展广州站活动,在广州四季酒店圆满落幕.本次发布会汇集了华南地区近150位来自金融.交通.能源.互 ...

  5. yum命令轻松升级到高版本gcc

    轻松升级gcc: 背景:         直接通过yum install gcc安装的版本4.8.5太老了,很多新的库的用不起,没办法,只能升级.手动编译安装太过于麻烦,于是乎网上找到了这个方法. 方 ...

  6. TMG标准版轻松升级到企业版---TMG 2010 系列之四

    微软一向注重同系列产品间的纵向升级,ISA Server 也不例外. ISA Server 2006 支持从 ISA Server 2004 的无缝升级.但却不支持同版本的标准版直接升级到企业版.对于 ...

  7. linux mint 18.3 内核,Linux Mint Linux用户可以升级到18.2 18.3”

    Linux Mint Linux用户可以升级到18.2 18.3"现在应该在造币厂"的技术 Linux Mint的升级路径--从"索尼娅".现在的操作系统是一个 ...

  8. 老旧计算机升级云桌面,哇哦!PC机房轻松升级云课堂 ,PC利旧方案看我的!

    原标题:哇哦!PC机房轻松升级云课堂 ,PC利旧方案看我的! 保定市第二十六中学是保定市竞秀区内一所知名中学,学校秉承着"让每一名学生健康.智慧.快乐的成长,让每一名教师健康.智慧.高效地工 ...

  9. 升级 ubuntu_Ubuntu 19.04 已经到期!现有用户必须升级到 Ubuntu 19.10

    Ubuntu 19.04 已在 2020 年 1 月 23 日到期,这意味着运行 Ubuntu 19.04 的系统将不再会接收到安全和维护更新,因此将使其容易受到攻击.-- Abhishek Prak ...

最新文章

  1. 藏在XP中的一个可以完整清除垃圾文件
  2. SqlParameter
  3. CSP认证201512-2 消除类游戏[C++题解]:模拟
  4. CANopen | 对象字典OD 03 - 启动CANopen节点的服务数据对象SDO
  5. 高级软件工程第一次团队作业
  6. 如何开发一款高大上的android应用的必备知识
  7. paip.提升效率---模块化设计方法V2012.9.15
  8. 多个Activity之间的跳转(1)
  9. 你真的懂网络安全行业吗?
  10. ABB机器人常用指令
  11. Android 开源项目分类汇总
  12. 监控数据恢复取证-盘点进水监控硬盘的数据恢复
  13. python123月份名称缩写_月份及其缩写
  14. CSS浏览器兼容性的4个解决方案
  15. 基于MATLAB的三重积分与曲线积分
  16. Pytorch实现CT图像正投影(FP)与反投影(FBP)的模块
  17. python第一行代码_“少年py”001:下载Python软件,写第一行代码
  18. c++之多态性,什么是多态?如何实现?
  19. 配置华为路由器的常用命令
  20. c语言 m个数 取n个数,本题要求编写程序,根据公式Cnm=m!(n−m)!n!算出从n个不同元素中取出m个元素(m≤n)的组合数。...

热门文章

  1. (原)Ubuntu14中安装GraphicsMagick
  2. MemCached的telnet命令行参数
  3. 线程让出实验【RT-Thread学习笔记 4】
  4. VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
  5. Adobe CTO:Android将超预期获50%份额
  6. Fragment Or DialogFragment Can not perform this action after onSaveInstanceState
  7. 机器学习算法之 logistic、Softmax 回归
  8. 【设计模式 04】代理模式
  9. iOS 抓包工具 charles工具
  10. 全国计算机vb考试经典程序设计,全国计算机二级《VB语言程序设计》考试要点...