跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
晶圆电阻捷比信 · 专业器件主题站

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

这次商务旅行的目的是升级程序以解决该错误。用户已经包装好产品,无法打开盖子。只有CAN总线才能用于更新程序,该程序是通过Bootloader实现的。实际上,.bin / hex文件通过主机的CAN通信发送到单片机,并存储在指定的Flash中。此过程类似于在手机上更新APP。以STM8单片机为例,如何实现Bootloader?立即与您分享。 01什么是Bootloader Bootloader是一段代码,用于更新其自己的应用程序软件并独立运行。它通常用于升级产品和修复产品错误。如果要下载STM8微控制器的十六进制文件,则需要通过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,0x8200841c,0x82008420,0x820084424,0x820088440,0x820084444,0x820084444,0x820084444,0x8200844 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,0x82009024,0x82009024,0x82009028,0x8200902c,0x820092009030,0x8200908,0x8200908,0x8200908,0x8200908,0x8200908,0x82009030,0x8200908,0x82009030,0x8200908,0x8200908,0x8200908,0x820090,0x8200908,0x8200908,0x820090,0x8200908,0x8200908,0x8200908,0x8200908,0x820090,0x820090,0x820090 0x8200902c,0x82009030,0x82009034,0x82009038,0x8200903c,0x82009040c,0x82009044,0x82009048,0x8200904c,0x82009070,0x82009054,0x82009070,0x82009074,0200920020098c8,0x8200988000980809800098080980009808098000980800098809800098080009808098000980800098080009808000980800098080009808090存储在编程环境的安装目录中。每个型号/系列的单片机将对应一个ICF文件。您需要修改ICF文件。在这里,您需要根据闪存空间的划分对其进行修改。将Bootloader的终止地址设置为0x9FFF。 ,因此修改如下:defineregionNearFuncCode = [from0x8 000to0x8FFF]; defineblockINTVECwithsize = 0x80 {rosection.intvec}; placeatstartofNearFuncCode {blockINTVEC}; 05所谓的跳转命令是跳转到应用程序中的Boot进行升级;升级完成后,您需要跳转到应用程序,因此跳转的起点是起始地址。引导加载程序如下跳转到应用程序代码:asm(“ LDWX,SP”)​​; asm(“ LDA,$ FF”); asm(“ LDXL,A”); asm(“ LDWSP,X”) ; asm(“ JPF $ 9000”);应用程序跳转到Bootloader的代码如下sm(“ LDWX,SP”)​​; asm(“ LDA,$ FF”); asm(“ LDXL, A”); asm(“ LDWSP,X”); asm(“ JPF $ 8000”); 06编写交互代码设置完上述设置后,您就可以编写交互代码,因此交互代码实际上是一组协议,规定了应用程序如何跳转到Boot以及如何在Boot中处理它以及存储数据,这需要主机的支持。如果仅用于您自己的产品,则可以自己定义协议。也可以使用标准协议,例如汽车行业中的UDS(统一诊断服务)。实现Bootloader后,可以使用CAN / UART升级产品固件。这是Bootloader的关键内容,您是否了解本文?发表评论并进行讨论。