振南技术干货集:深入浅出的Bootloader(3)

注解目录

1、烧录方式的更新迭代

1.1 古老的烧录方式

(怀旧一下,单片机高压烧录器。)

1.2 ISP 与ICP 烧录方式

(还记得当年我们玩过的 AT89S51?)

1.3 更方便的 ISP 烧录方式

1.3.1串口 ISP

(是 STC 单片机成就了我们,还是我们成就了 STC?)

1.3.2 各种 USB ISP

1)AVR

  1. C8051F

  2. MSP430

(在当前 STM32 一统天下的时代,上面这些单片机你还在用吗? )

2、关于 Bootloader

2.1 Bootloader 的基本形态

(Bootloader 先行,APP 在后。)

2.2 Bootloader 的两个设计实例

1)带 Shell 命行的口 BL

2)插 SD 卡即烧录的 BL

(上面这两种 BL 在实际应用中最常见,还讲了一下 Linux 的 Uboot。)

2.3 BL实现的要点

3、花百出的 BL

3.1 BL(串口传输)的现与延伸

(告诉你一个秘密: STM32F103C8T6 的后64K ROM 也能用,不信你试。)

3.2 10 米之内隔空烧录的实现

(一部安卓手机在手,空中升级调试全有。)

3.3 BL的分散烧录

(你以为 BL 只能给自己烧序? )

4、不走寻常路的BL

4.1 Bootpatcher

(反其道而行之,APP 先行,BL 在后。)

4.2 APP 反烧 BL

(你以为只能 BL 烧录 APP? )

关于 Bootloader

2.3 BL实现的要点

首先要说,并不是任何一个单片机都可以实现 BL的,要满足几个要点。

1.芯片体系架构要支持

来看图 7.13。

我们知道单片机程序的最开头是中断向量表,包含了程序栈顶地址以及 Reset 程序人口.通过它才能把程序运行起来。很显然在从 BL 向 APP 跳转的时候,APP 程序必须有自己的中断向量表。而且单片机体系架构上要允许中断向量表的重定向。

传统 51 单片机的中断向量表只允许放到 ROM 开头,而不能有偏移量,所以传统 51 单片

图 7.13 BL的实现需要单片机支持中断向量表偏移(重定向)

机是不能支持 BL 的。有人要问"你这不是自相矛盾吗?你前面说 STC的 51 单片机是支持串口ISP 的,那它应该内置有 ISP 程序,我理解它应该和 BL 是一个道理。"没错,它内置的ISP程序就是一种 BL。STC 之所以可以实现 BL 功能,是因为宏晶半导体公司对它的硬件架构进行了改进,请看图 7.14。

图7.14 STC对传统51单片机硬件架构上的改进

可以看到,STC51 单片机多出了一块专门存放 BL的 ROM,称为 BOOTROM。网上有一位叫 shaoziyang 的网友为 AVR 单片机写了一个 BL,还配套开发了一款叫AVRUBD 的上位机,如图 7.15 (AVRUBD 是很有用的,本章后面会介绍,它可以让我们实现隔空烧录)所示,实现了 AVR 单片机的串口烧录,让很多人摆脱了对 USBISP 之类 ISP 下载器的依赖(虽然 ISP 下载器已经很方便了,但它毕竟还需要银子嘛)。

AVR 在硬件架构上与 STC51 是一个套路,如图 7.16 所示。

通过配置 AVR 的熔丝位可以控制复位入口地址以及 BOOT 区的大小和开始地址,如图 7.17 所示。

讲到这里,有人会说:"那有没有一种单片机,程序放在 ROM 的任何位置都可以运行起来,也就是中断向量表可以重定位?"当然有,这种单片机还很多,其中最典型的就是 STM32.它的程序之所以可以放之各地皆可运行,是因为在它的 NVIC 控制器中提供了中断向量表偏移量的相关配置.这个后面我们再详细说。

2.ROM 要支持 IAP

这也是需要单片机硬件支持的。很好理解,在 BL 获取到固件数据之后,需要将它写人到ROM的 APP 区中,所以说单片机需要支持 IAP 操作,所谓 IAP 就是 I Application Programming,即在应用烧录。也就是在程序运行过程中,可以对自身 ROM 进行擦除和编程操作。

大家仔细想想是不是这样?似乎支持串口 ISP 的单片机都支持 IAP 能。STC 还把这

图 7.15shaoziyang 的 AVR BL配套上位机软件 AVRUBD

图 7.16 AVR 单片机硬件架构上对 BL的支持

图 7.17AVR 单片机硬件架构上对 BL的支持

功能包装成了它的一大特色,可以用内部 ROM 来充当 EEPROM 的功能,可以在运行时记录一些掉电不丢失的参数信息。

STM32 的 ROM 擦写在配套的固件库(标准库或 HAL 库)中已经有实现,大家可以参考或直接使用。

3.APP 程序的配套修改

为了让 BL 可以顺利地将 APP 程序引导运行起来,APP 程序在开发的时候需要配合 BI做出相应的修改。最重要的就是 APP 程序的开始地址(即中断向量表的开始地址)以及对中断控制器的相应配置。

对于 51、AVR 这类单片机 APP 程序不用修改,具体原因大家应该明白。这里主要对STM32 APP 程序如何修改进行详细讲解。

我们依然是结合实例,如图 7.18 所示。

图 7.18 STM32 ROM 划分实例

假设我们所使用的 STM32小为128KB;BL程序的体积是 16KB,APP 程序紧邻BL,那么 APP 区的开始地址为0X08004000,也就是程序的中断向量表偏移地址为 0X4000。

如果我们使用 MDK 作为开发环境的话,需要修改这里,如图 7.19 所示。

图 7.19 MDK 开发环境中对程序存储器开始地址与大小进行配置

而如果我们使用的是 gcc 的话,则需要对 link.ld 链接文件进行修改,如图 7.20 所示。

然后我们还需要对 NVIC 的中断向量表相关参数进行配置,主要是中断向量表的偏移量,

图 7.20gcc 编译环境下对 link,ld 文件的修改

如下代码:

define VECT TAB OFFSET 0x4000

OK,经过修改后的程序,我们把它放到 ROM 的 0X08004000 开始地址上,然后再让 BI跳转到这个地址,我们的程序就能运行起来了。

有人又会问:"BL 中的跳转代码怎么写?"别急,这是我们要讲的下一个要点

4.BL 中的跳转代码

跳转代码是 BL 要点中的关建,直接关系到 APP程序能否正常运行,如图 7.21 所示。

图 7.21 BL向 APP 的跳转示意

这段代码大家自行研究,如果展开讲就属于赘述了。

到这里 BL 相关的要点就介绍完了,大家应该有能力去完成一个简单的 BL了。我基于STM32 设计了一个小实验.大家有兴趣可以小试牛刀一下,如图 7.22 所示。

图 7.22 BL功能验证实验

我们将 BL 程序用Jlink 烧录到 0X08000000 位置,而把 APP 程序烧录到 0X08002000 开始位置,然后复位,如果串口打印了 hello world 或流水灯亮起来了,就说明我们的 BL 成功了

相关推荐
Ocean☾40 分钟前
C语言-详细讲解-P1217 [USACO1.5] 回文质数 Prime Palindromes
c语言·数据结构·算法
Non importa44 分钟前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
搬砖的小码农_Sky2 小时前
C语言:字符串
c语言·开发语言
qiaoqiaohonghu4 小时前
c/c++ 用easyx图形库写一个射击游戏
c语言·c++·游戏
2401_858286115 小时前
L13.【LeetCode笔记】合并两个有序数组
c语言·开发语言·数据结构·笔记·算法·leetcode
Legendary_0087 小时前
LDR6020驱动的Type-C接口显示器解决方案
c语言·开发语言·计算机外设
苏言の狗7 小时前
CCF认证202406-01 | 矩阵重塑(其一)
c语言·数据结构·c++·算法·矩阵
java 乐山8 小时前
ThinkPad t61p 作SMB服务器,打印服务器,pc ,android ,ipad利用此服务器互传文件
c语言
Littlehero_1219 小时前
C语言中const char *字符进行切割实现
linux·c语言
鲨鱼吃橘子10 小时前
【C++融会贯通】哈希表的使用
c语言·开发语言·数据结构·c++·链表·哈希算法·散列表