概念简介
在学习制作串口升级 Bootloader 之前,我们先了解一下STM32的 IAP (In Application
Programming)即在应用编程,IAP是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的
是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级.
设计这样的功能需要有两个项目代码:
* Bootloader 程序: 该部分代码用于实现通过某种通信方式(如 USB,USART)接收程序或数据,执行对第二部分代码的更新,通常存储于
Flash 的起始地址(0x08000000);
* App 程序: 该部分代码是产品实现业务逻辑正常运行的代码,该部分代码需要在存储的 Flash 中进行相对的地址偏移.
复位执行流程
当芯片上电或者复位后,首先是Bootloader代码开始运行,它作如下操作:
(1) 检查是否需要对第二部分代码进行更新;
(2) 如果不需要更新则转到(4);
(3) 执行更新操作;
(4) 跳转到第二部分代码执行.
加了 Bootloader 程序后,程序运行流程图:
实现要点
Bootloader程序实现
* (1) 完成 USART 串口数据接收传输功能,并将接收到的数据绝对定位到 SRAM 的设定地址中,地址的设定根据实际情况而定,应保证设定的地址大于
Bootloader 执行需要的 RAM 的空间;
* (2) 需要实现对 STM32 Flash 读写操作相关的驱动,并将绝对定位 SRAM 处的固件数据写入到 Flash 中;
* (3) 完成固件数据接收和写入 Flash 后,需要对 PC 指针进行程序跳转,跳转完成后,即运行固件中的程序.
注: 程序跳转之前需要关闭所有的中断.
App程序实现
* (1) 在 main 函数最开头处设置 VTOR 寄存器,实现固件中断向量表的重定向.例如: SCB->VTOR = FLASH_BASE |
0X10000; /*中断向量表偏移量设置*/
* (2) 设置 App 程序的存储偏移地址,这里以
STM32F103ZE系列的单片机为例,Flash为512k,SRAM为64k.这里设置Flash前64k用于存储 Bootloader
程序,后448k为固件程序空间,SRAM地址不需要设置偏移.
可以用jflash查看生成的HEX文件,查看HEX起始地址是否为设置的偏移地址,如下图所示:
若程序跳转时,发生 HardFault 异常中断,可能是设置的地址偏移量没有生效,应该勾选 MDK 的相关配置.
* (3) 将编译生成的 .axf 文件 (要勾选生成HEX文件) 通过 MDK 安装时自带的 fromelf.exe 程序转成可以通过串口升级的
bin文件.
语法格式为: [MDK安装目录/fromelf.exe] –bin -o [bin文件生成目录] [axf文件目录]
点击编译即可生成可以通过串口升级的 bin 文件.
总结: App 程序在代码上除了需要设置中断向量表偏移和程序存储地址偏移以外,其余和不加 Bootloader 的程序代码并无差别,难点在于理解 Flash
偏移地址的设置.
热门工具 换一换