STM32学习笔记之简易Bootloader串口升级设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xinghuanmeiying/article/details/79573065

概念简介

在学习制作串口升级 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 偏移地址的设置.

没有更多推荐了,返回首页