单片机的Bootloader,可以实现用户轻松升级程序
去某新能源大厂出了一次差,这次出差是为了升级程序解决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 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的关键内容,本文你学会了吗?留言讨论一下吧
什么是Bootloader #单片机
什么是Bootloader?
Bootloader是什么?这里以一个单片机为例给大家讲一下。首先能看到的就是单片机里面的Flash,正常情况直接运行的是APP。如果用了Bootloader,第一个运行的程序就是Bootloader,它会干什么?一共有四点。
·首先加载APP,比如这里有两个APP,可以通过Bootloader来切换,意思就是单片机上电之后第一个运行的程序是Bootloader。根据Bootloader里面的一些设置,它会去选择加载APP1还是APP2。为什么有两个?大家会说。
·第二个是升级,比如要对单片机进行OTA,也就是远程升级,或者通过USB对它进行下载。下载是怎么下?就是把APP进行擦除,擦完之后把新的APP加进来,这就实现了下载。
下载要使用一些通讯手段,比如USB或者是Wifi 4G,在Bootloader里面就会有相应的通讯代码,它会利用通讯代码把要下载的程序加载到Flash的特定位置,并且把原来的APP擦了,这下就会用到APP2。这是什么意思?
如果下载到一半,这个时候设备突然断电了或者突然出现了故障,本来应该要下完的,其实只下了一半,这个时候只要一运行肯定就会出问题。Bootloader会去校验APP一正不正常,如果不正常就会去回滚。一般会存两个APP,一个是当前版本,一个是上一次版本。发现当前升级的用不了,就会自动去运行上一个APP,以最大程度的确保产品是保持能用的状态。
还有一种最坏的结果就是两个APP都运行不起来,它就会停留在Bootloader里面等待下一次的升级。
·下来是安全,一般做一些安全性的产品,比如POS机、那它肯定不期望APP受到篡改。这个时候我们每次商店就会利用Bootloader来对我们的APP进行校验,甚至还会对你后面的密要这些进行校验,并且进行解密,解密完了再执行。
如果有一个黑客修改了你的APP,他想让你的Bootloader去加载这个有问题的APP,那你的Bootloader每次上电会把APP进行计算,算出来一个值和第一次下载的值进行对比,如果不相等,那就说明APP遭到了篡改,这就是安全。
·然后是故障恢复,比如说你的APP出了问题,运行的时候受到了损坏,那这个时候我们的布特loader也能检查出来,它和我们升级失败是一样的,它就会去运行另外一个APP,或者就停在布特loader里面等待用户升级。
就比如你的手机有时候操作系统坏了,它就会进入个所谓的DFU式BL,你就可以理解为这个就是Bootloader。而这里有一个推荐的Bootloaderopen BLT,你可以去研究一下,这个项目很好,它从单片机的代码一直到上位机都有提供。一般Bootloader升级是需要上微机的,它这些都给你提供了。
还有一个就是你可以去ST恩智浦这些大厂家,他们都有提供开源的Bootloader_,你也可以根据你用的单片机去厂家找,这样就避免了一个移植。如果你想做到通用,就比如你有多款单片机,那你就可以把它们都移植上一个openBLT,这样对于上位机的开发、维护干啥的都简化了。
相关问答
单片机bootloader 启动过程?分为以下几个步骤:1.开机复位:单片机初始状态下处于复位状态,所有寄存器、引脚和内存的值会被清零,程序从复位地址开始执行。2.初始化系统时钟:正常情况下...
单片机 下载器是干什么用的?单片机程序下载有三种途径,最基本的是编程器烧录,其次是ISP也就是在线下载,这要求单片机有BOOTLOADER引导,借助于串口从电脑下载程序到单片机,还有就是IAP也...
单片机 开发,嵌入式开发有什么区别啊?单片机开发和嵌入式开发之间的关系密切,但两者侧重点有所不同。下面分别介绍单片机开发和嵌入式开发的概念及区别。1.单片机开发:单片机开发主要是针对单片...
单片机 系统开发如何入门?单片机是一门更偏重于动手的技术,需要涉及的基础知识比较多,学了这么多年的理论知识突然要应用起来发现难度很大无从下手。所谓万事开头难,所以学习单片机要趁...
如何学习嵌入式linux?stm32确实是一个瓶颈。而且现在毕业的相关专业的学生越来越多,stm32的技术门槛和知识点确实相对容易掌握。那么在主流的电子行业对嵌入式的需求是比较大的。主要...
请问学习ARM嵌入式开发应该准备些什么开发工具和要求?感谢邀请。这个问题相信是困扰所有嵌入式初学者的难题,下面课内容是嵌入式学习必学的:C语言;C++;操作系统;计算机组成原理;linux编程;51单片机;arm;硬件...
单片机 上ROM RAM EEPROM FLASH 有什么关系和不同?-ZOL问答区别主要是他们的用途不同:现在的单片机,RAM主要是做运行时数据存储器,FLASH主...用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。现在...
278的芯片和328的芯片能相互代用吗?这要看具体情况。278和328都是Atmel的AVR系列单片机,它们有相似的体系结构和指令集,因此在某些应用场景下是可以相互代用的。但是,由于它们的规格参数不完全相...
细说ISP和IAP的区别?ISP(In-SystemProgramming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或...
麻烦哪位行家,请回答!建筑模块式雨水收集系统厂商报价,模...[回答]嵌入式系统(Embeddedsystem),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电气工程师协会(U.K.InstitutionofElectr...