历史上的今天
返回首页

历史上的今天

今天是:2024年09月08日(星期日)

2021年09月08日 | 以STM8单片机为例,该如何实现Bootloader呢?

2021-09-08 来源:elecfans

这次出差是为了升级程序解决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,默认的向量表如下代码所示。


__rootconstlongreintvec[]@".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,修改完后代码如下:

__rootconstlongreintvec[]@".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,所以修改如下:

defineregionNearFuncCode=[from0x8000to0x8FFF];defineblockINTVECwithsize=0x80{rosection.intvec};place at start of NearFuncCode { block INTVEC };

05

跳转命令

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

asm("LDW X, SP ");asm("LDA,$FF");asm("LDXL,A");asm("LDWSP,X");asm("JPF$9000");应用程序跳转到Bootloader中的代码如下

sm("LDW X, SP ");asm("LDA,$FF");asm("LDXL,A");asm("LDWSP,X");asm("JPF$8000");


06

编写交互代码

以上设置好之后,就可以编写交互代码了,所以交互代码其实就是一套协议,规定了应用程序如何跳转到Boot,在Boot中如何处理和存储数据,这需要上位机的支持。如果只是用于自家的产品,就可以自己定义协议。也可以使用标准的协议,比如汽车行业中的UDS(统一诊断服务)。 Bootloader实现之后,就可以使用CAN/UART来实现产品固件的升级了。这就是Bootloader的关键内容,本文你学会了吗?

推荐阅读

史海拾趣

CML Microcircuits公司的发展小趣事

在1968年,电子行业正迎来一场技术革新。在这个充满机遇的时代,CML Microcircuits公司应运而生。初创时期的CML专注于研发单芯片解决方案,而不是传统的标准组件组合。这一创新理念使CML在行业中脱颖而出。公司的第一个产品——频率敏感开关,凭借其卓越的性能和可靠性,迅速赢得了市场的认可。这款产品不仅销售了30多年,而且至今仍在某些应用中发挥着关键作用。

Crocus Technology公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

FSP [FSP TECHNOLOGY INC.]公司的发展小趣事

随着技术的不断成熟和市场需求的变化,Crocus Technology开始拓展其产品线。2015年,公司成功推出了首款磁开关产品,这标志着公司在磁传感器领域迈出了重要的一步。随后,公司又陆续推出了位置传感和2D传感器产品,进一步巩固了其在磁传感器市场的地位。

Fastron公司的发展小趣事

在电感器领域取得成功后,Fastron并没有止步不前。相反,公司积极拓展业务领域,实现了多元化发展。除了电感器业务外,Fastron还成功运营了大型钣金生产业务,专门生产精密金属外壳和机电组件。此外,Fastron集团还拥有位于德国的Rapid Biomedical公司,为MRI扫描仪定制MR线圈,进一步拓宽了公司的业务范围。

Atmel (Microchip)公司的发展小趣事

随着产品的不断完善和技术的不断进步,Atmel开始积极拓展全球市场。公司通过建立遍布全球的办事处和销售网络,将产品销往世界各地。同时,Atmel还注重品牌建设,通过优质的产品和服务,赢得了客户的信任和好评。这使得Atmel在全球微控制器市场中逐渐崭露头角。

GISMA Steckverbinder GmbH公司的发展小趣事

随着技术的不断进步,GISMA持续加大研发投入,不断推出新产品以满足市场需求。其产品线从最初的几个系列扩展到如今的16个系列,涵盖了超过15000种不同类型的连接器。这些连接器不仅具有高电气性能和出色的防水性能,还能够在恶劣的水下环境中保持稳定的工作状态。GISMA的技术创新能力和产品线拓展策略,为其在电子行业中的持续发展奠定了坚实基础。

问答坊 | AI 解惑

流程序开发指南(英)希望这个东西对大家有用。

这是一般讨论流设备程序开发的书籍,希望对兄弟姐妹们的工作有所帮助。…

查看全部问答>

数控电流源资料论文

本帖最后由 paulhyde 于 2014-9-15 09:05 编辑 如果感兴趣,就看看吧,大家互相帮助。word 文档 [ 本帖最后由 ceolach 于 2009-6-4 14:35 编辑 ]  …

查看全部问答>

求指导

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 有人知道ad811芯片怎么搭建才能实现功能吗,datasheet上的电路好像不行  …

查看全部问答>

菜鸟也谈各单片机的特点

在网上看到许多有关MCU的问题和评论 也许其中有很多是枪手写的 其实我没有真正的用过任何的MCU 说以有错的地方请高手指正 STC 最国产 频率打五折用 AVR 最老龄死 就他没样片 超级孤寒 PIC 卖广告最多 超常在教材上花心思 MSP430功耗最大 说 ...…

查看全部问答>

生成NK.nb0的大小(CE6.0)

能否让Nk.Nb0的大小自动变化? 现在我的NK.NB0大小都一定会等于config.bib文件中定义的大小。 里边的ROMSIZE等于多大,NK.NB0就一定是多大。 请教…

查看全部问答>

wince系统在线播放youtube的问题

我们在为客户开发一款机器,使用pxa270的cpu,客户要求可以在线播放youtube视频。 使用IE上Youtube的网站,总是自动转到youtube的mobile版,视频是3gp格式的,点击播放自动弹出mediaplay,但是提示连接不上服务器。如果上youtube的桌面版,则提示f ...…

查看全部问答>

wince 图形绘制问题

不知道wince 支持 DirectX么? 支持 gdi+么? 各位大虾:不知道wince上,你们是怎么绘制图形?…

查看全部问答>

LPC2142开发板如何运用串口ISP下载程序?

我想用flash magic下载提供的例程hex文件到板子中。我有个串口线&USB通讯电源线。串口线连接到COM1,然后将P0.14所在的JP2短接,电源部分JP7短接。不知为什么始终连接不成功。期间看到板子介绍说,可以全自动ISP下载,于是将JP2,JP1,JP3都短接(R ...…

查看全部问答>

基于单片机的PPM调制解调

用at89c52 led1602制作一个基于单片机的PPM调制解调。有懂的指导下小弟,求原理图和程序…

查看全部问答>