单片机的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"= {
前文已经将应用程序的起始地址修改为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,这样对于上位机的开发、维护干啥的都简化了。
相关问答
单片机 下载器是干什么用的?单片机程序下载有三种途径,最基本的是编程器烧录,其次是ISP也就是在线下载,这要求单片机有BOOTLOADER引导,借助于串口从电脑下载程序到单片机,还有就是IAP也...
单片机 技术是一门即将被淘汰的技术吗?感谢邀请答题!目前来说,这十几年内是不可能淘汰的,即使面临着人工AI、大数据和云计算等技术的多方面竞争,单片机也可以说是立于不败之地!毕竟需求放在那里。...
嵌入式 单片机 有前途吗?非常有前途。嵌入式单片机,即嵌入式微控制器,指以微控制器为核心控制单元的嵌入到对象体系中的专用计算机系统,是应用十分广泛的一种嵌入式系统结构。无论是...
单片机 系统开发如何入门?单片机是一门更偏重于动手的技术,需要涉及的基础知识比较多,学了这么多年的理论知识突然要应用起来发现难度很大无从下手。所谓万事开头难,所以学习单片机要趁...
16位 单片机 与ARM嵌入式系统的问题如何解决?[回答]如果有单片机基础或感觉自己实力强就选后者,否则就从前者学起,然后自学后者.后者是前者的深入学习.ARM也是单片机的一种,属于32位的了,不过可以实...
麻烦诸位朋友 你能回答!甘肃烧颗粒的蒸汽发生器型号参数及...[回答]有三种方式:1.把单片机当做一个ROM芯片,早期的单片机都是如此。将单片机放在通用编程上编程时,就像给28C256这样的ROM中写程序的过程一样。只是不同...
arduino哪个板子好用?有什么优点?现在一般使用的都是UNO,UNO是328的升级版(2011年升级,2012年初出的R3版)主要升级就是USB转串口模块,采用了ATMEL16U2或者是8U2的单片机来模拟转换芯片,...
单片机 上ROM RAM EEPROM FLASH 有什么关系和不同?-ZOL问答区别主要是他们的用途不同:现在的单片机,RAM主要是做运行时数据存储器,FLASH主...用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。现在...
arduino uno r3的优点?现在一般使用的都是UNO,UNO是328的升级版(2011年升级,2012年初出的R3版)主要升级就是USB转串口模块,采用了ATMEL16U2或者是8U2的单片机来模拟转换芯片,...
arm技术需要学什么专业?4)底层开发人员大都要学:微机原理、计算机体系结构,嵌入式开发人员必学!5)单片机可以让一个从事软件开发的人了解和如何操作硬件,有必要学,...5)单片机...