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

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

3天内不再提示

单片机的Bootloader可以实现用户轻松升级程序

工程师 来源:玩转嵌入式 作者: 刘小舒 2020-10-23 16:57 次阅读

这次出差是为了升级程序解决Bug,用户已经将产品封装起来,无法开盖,只能使用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 section .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的关键内容,本文你学会了吗?留言讨论一下吧。

-END-

来源 | 玩转嵌入式

作者 | 刘小舒

责任编辑:haq

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

    关注

    5998

    文章

    43958

    浏览量

    620677
  • CAN
    CAN
    +关注

    关注

    56

    文章

    2464

    浏览量

    459136
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66720
收藏 人收藏

    评论

    相关推荐

    做一个TC23X单片机Bootloader程序需要准备哪些方面的知识?

    各位,问一下,上位用现成的,做一个TC23X单片机Bootloader程序需要准备哪些方面的知识?需要看数据手册的哪些章节?还有能否给一个具体的步骤,感谢。
    发表于 02-18 08:33

    请问IMC101T-038是否支持bootloader下载程序

    想请问一下,038这款MCU是否支持bootloader下载程序呢?现在用这款芯片作为内置的风机驱动板,但用户后期想升级程序,请问一下
    发表于 01-23 07:07

    STM32单片机实现固件在线升级(IAP)

    1,固件升级方案综述单片机的固件升级方式有很多种。1、ICP:简单说就是在单片机开发时使用烧录器升级程序
    的头像 发表于 12-16 08:00 832次阅读
    STM32<b class='flag-5'>单片机</b><b class='flag-5'>实现</b>固件在线<b class='flag-5'>升级</b>(IAP)

    GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具

    GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机
    发表于 11-10 15:03

    如何使用vc++制作51单片机的上位

    我想实现用VC++程序来控制51单片机的各个接口,同时也能读取单片机的中断。目前市面上单片机都是使用CH340来连接电脑,通过相应
    发表于 11-10 06:51

    GD32单片机STM32远程下载手机程序升级固件下载局域网网页升级工具

    GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。使用该方法可以完成手机网
    的头像 发表于 11-09 12:31 1084次阅读
    GD32<b class='flag-5'>单片机</b>STM32远程下载手机<b class='flag-5'>程序</b><b class='flag-5'>升级</b>固件下载局域网网页<b class='flag-5'>升级</b>工具

    stc51单片机程序存储区不够用,可否在程序存储区写一个bootloader用户程序放入自身的EEPROM?

    stc51单片机程序存储区不够用,可否在程序存储区写一个bootloader用户程序放入自身的
    发表于 11-09 07:09

    怎样给单片机编写bootloader?

    怎样给单片机编写bootloader
    发表于 10-30 07:45

    单片机BootLoader与APP如何合并?

    单片机BootLoader与APP如何合并?
    的头像 发表于 10-25 17:17 621次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>BootLoader</b>与APP如何合并?

    stm32单片机如何实现一个按键切换两个程序

    stm32单片机如何实现一个按键切换两个程序? 作为一款功能强大的微控制器,STM32单片机可以支持多种应用场景,其中一个实用的功能是按键切
    的头像 发表于 09-14 14:22 4388次阅读

    远程升级单片机的设计思路

    上周给大家分享了《 Bootloader程序安全机制设计 》,今天为大家分享一下远程升级单片机的设计思路。
    发表于 09-05 10:34 568次阅读
    远程<b class='flag-5'>升级</b><b class='flag-5'>单片机</b>的设计思路

    单片机BootLoader与APP如何合并

    嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址
    的头像 发表于 07-25 11:29 958次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>BootLoader</b>与APP如何合并

    聊聊一些常用的Bootloader安全机制的设计

    不管是玩单片机还是嵌入式linux,基本上都会接触到bootloader,所以bootloader程序也是一个关键的组件,进行硬件初始化,应用程序
    的头像 发表于 06-11 09:51 391次阅读

    mm32-2nd-bootloader技术进阶设计:实现Ymodem更新代码

    了?从本章开始,将会讲解几种 2nd Bootloader 进阶设计,实现类似 ISP 更新固件的功能,以及在 OTA 升级时避免变“砖”等设计,以及讲解一些 2nd Bootloader
    的头像 发表于 06-09 09:28 848次阅读
    mm32-2nd-<b class='flag-5'>bootloader</b>技术进阶设计:<b class='flag-5'>实现</b>Ymodem更新代码

    适合单片机的几款开源Bootloader

    如果日常工作中经常使用linux,那么对U-Boot,LILO,GRUB等常用Bootloader一定不陌生。但是这些Bootloader主要用于引导linux启动,不太适合单片机产品。
    发表于 05-25 15:42 4578次阅读
    适合<b class='flag-5'>单片机</b>的几款开源<b class='flag-5'>Bootloader</b>