单片机的Bootloader,可以实现用户轻松升级程序
内容提要
本文介绍了如何使用STM8单片机实现Bootloader技术,通过CAN通信或UART通信将程序存储在Flash中。包括划分Flash区间、修改中断向量表、修改ICF文件、编写跳转命令和交互代码等步骤。Bootloader的实现可以实现产品固件的升级。
延伸解读
Bootloader 解决封装产品的升级难题
当产品已经封装、无法通过 SWIM 引脚直接下载程序时,Bootloader 提供了一种通过 CAN 或 UART 通信更新固件的途径。文章以新能源大厂的实际差旅任务为例,说明这种技术能让单片机在不拆封的情况下接收上位机发送的 .bin/.hex 文件并写入 Flash,类似手机 APP 的远程更新方式。
Flash 区间划分与中断向量表调整
STM8 的中断向量跳转地址固定指向 0x8000 开始的区域,因此 Bootloader 必须放在该处。文章示例将 Bootloader 占用 0x8000-0x8FFF 共 4K 空间,应用程序则从 0x9000 开始。相应地,中断向量表中除第一个元素外,其余地址需将 8 改为 9,以匹配新的应用起始地址。
ICF 文件与跳转命令的配合
ICF 文件需根据 Flash 划分修改,例如将 NearFuncCode 区域定义为 0x8000 到 0x8FFF,并放置中断向量块。跳转命令则通过设置堆栈指针后使用 JPF 指令实现:Bootloader 跳转到应用时指向 0x9000,应用跳转到 Bootloader 时指向 0x8000,完成两者之间的切换。
交互协议与上位机支持
Bootloader 还需要一套交互代码,即协议,规定应用如何跳转到 Boot、Boot 如何处理和存储数据。文章指出这需要上位机配合,可以自定义协议,也可以采用汽车行业中的 UDS 等标准协议。实现后即可通过 CAN/UART 进行产品固件升级。
Q&A
Bootloader是什么,它的作用是什么?
Bootloader是一段用于更新自身应用软件并独立运行的代码,主要用于升级产品和修复bug。
如何在STM8单片机上实现Bootloader?
通过CAN或UART通信将程序存储在Flash中,并进行Flash区间划分、修改中断向量表、ICF文件和编写跳转命令等步骤。
STM8单片机的Flash区间如何划分?
Bootloader存放在0x8000开始的空间,应用代码的起始地址从0x9000开始。
修改中断向量表的目的是什么?
修改中断向量表是为了适应新的应用程序起始地址,以确保程序能够正确跳转和执行。
ICF文件在Bootloader实现中有什么作用?
ICF文件用于定义Flash空间的划分,确保Bootloader和应用程序的正确存放和运行。
Bootloader如何与应用程序进行交互?
通过编写交互代码定义应用程序如何跳转到Bootloader,以及Bootloader如何处理和存储数据。