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

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

3天内不再提示

STM8单片机为例,如何实现Bootloader?

GReq_mcu168 ? 来源:玩转嵌入式 ? 作者:玩转嵌入式 ? 2021-04-12 09:48 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

238b6f94-9ab6-11eb-8b86-12bb97331649.jpg

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 };

23b4c448-9ab6-11eb-8b86-12bb97331649.jpg

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的关键内容,本文你学会了吗?留言讨论一下吧。

原文标题:单片机的Bootloader,可以实现用户轻松升级程序

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    6068

    文章

    45037

    浏览量

    652439
  • bootloader
    +关注

    关注

    2

    文章

    239

    浏览量

    46811

原文标题:单片机的Bootloader,可以实现用户轻松升级程序

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机怎么驱动电机?

    在各类自动化设备和智能装置中,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,才能实现稳定
    的头像 发表于 07-25 09:31 ?71次阅读

    STM8 C语言精品编程100

    今天来分享一下关于STM8单片机的相关资料文档,感兴趣的网友可以自行下载。单片机是芯片开发的基础,相信从中会获得您意想不到的知识。 获取完整文档资料可下载附件哦!!!! 如果内容有帮助可以关注、点赞、评论支持一下哦~
    发表于 07-17 16:08

    你们还在用8单片机吗?

    最近在公司接手了个挺让人挠头的活儿 —— 给一块老板子换 MCU。说起来这板子还是近五年的产品,用的 STM8 单片机,功能掰着手指头都能数过来,估摸着稍微加点复杂度这 8就扛不
    的头像 发表于 05-15 11:04 ?351次阅读
    你们还在用<b class='flag-5'>8</b>位<b class='flag-5'>单片机</b>吗?

    瑞萨RA8D1单片机IO中断配置实现方法

    本文结合瑞萨e2 studio工具,以及CPKCOR_RA8D1B评估板,给大家讲述瑞萨RA8D1单片机IO中断配置实现的方法。
    的头像 发表于 04-09 15:05 ?1062次阅读
    瑞萨RA<b class='flag-5'>8</b>D1<b class='flag-5'>单片机</b>IO中断配置<b class='flag-5'>实现</b>方法

    瑞萨Cortext-M85内核RA8系列单片机的串口输出实现方法

    串口是最常见的通信方式之一,也是单片机调试最常见的通信接口,也是现在的单片机必备的通信接口,目前(2024-05)最新、最强的Cortext-M85内核的RA8系列单片机也不例外。
    的头像 发表于 03-21 09:58 ?1123次阅读
    瑞萨Cortext-M85内核RA<b class='flag-5'>8</b>系列<b class='flag-5'>单片机</b>的串口输出<b class='flag-5'>实现</b>方法

    STM8S003F的作用是什么,如何编写单片机程序去控制?

    下STM8S003F的作用是什么,软件控制那几个部分,哪些是不需要软件控制的,该如何编写单片机程序去控制? 如何实现STM8 单片机与其他芯
    发表于 11-05 07:46

    基于51单片机的手动数字时钟

    具体实现功能由51单片机+8位共阴数码管+独立按键构成。具体功能:(1)利用数码管显示时分秒,显示格式“时-分-秒”;(2)利用6个按键控制时、分、秒,设定好后自动开始时钟显示;(3
    的头像 发表于 10-22 14:12 ?673次阅读
    基于51<b class='flag-5'>单片机</b>的手动数字时钟

    如何实现51单片机与PC的串行通信

    51单片机与PC的串行通信是一种常见的通信方式,它允许单片机通过串行接口与PC进行数据交换。这种通信方式在嵌入式系统、工业控制、物联网等领域有着广泛的应用。以下是
    的头像 发表于 10-21 11:35 ?2741次阅读

    性价比高的8单片机有哪些?

    ,尤其适用于需要Motorola MC68HC11兼容性的场合。此外,华芯微还提供了NuMicro系列单片机,其中包含一些基于8051内核的8位产品,用户提供了更多选择。 5. 其他高性价比选择
    发表于 09-27 14:27

    低功耗8单片机:技术特性与应用前景!

    不必要的能耗。 优化指令集:通过高效的指令集设计,减少执行任务所需的时钟周期,从而降低能耗。 2. 8位数据总线 8单片机的数据总线宽度8
    发表于 09-26 14:09

    8单片机,32位单片机编程和应用优势

    的微型计算机系统,英锐恩科技的电子工程师小编老唐将从灵活性、成本效益、开发效率、应用广泛性等方面进行详细阐述8单片机,32位单片机编程和应用优势。 一、灵活性高: 单片机编程的最大
    发表于 09-26 11:45

    MCU前沿市场趋势:8单片机和32位单片机

    尽管32位单片机(MCU)在单片机开发中的普及度持续上升,但最近的MCU市场趋势显示8单片机的复合增长率接近其32位单片机的复合增长率。
    发表于 09-24 17:47

    8单片机为何不会被高端单片机取代?

    )应用:8单片机应用广泛,包括汽车电子、家用电器、医疗设备、工业自动化和消费电子产品。它们通常是低成本、低功耗和实时控制应用的首选。 8单片机为何不会被高端
    发表于 09-24 16:51

    8单片机,32位单片机就找英锐恩!

    深圳市英锐恩科技有限公司创立于 2008 年,是一家从事单片机及模拟器件电路芯片应用、设计研发、销售一体的国家高新技术半导体企业。 英锐恩科技公司凭着自身在半导体电子行业MCU(8单片机、32位
    的头像 发表于 09-23 10:32 ?775次阅读

    单片机SPI通信实现

    在深入探讨单片机(如基于STM32、AVR、PIC等)如何通过SPI(Serial Peripheral Interface)进行通信之前,我们先概述SPI通信的基本原理,随后以STM32微控制器,详细解释如何配置SPI接口
    的头像 发表于 09-09 17:00 ?1791次阅读