振南技术干货集:深入浅出的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 成功了

相关推荐
DARLING Zero two♡3 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
QAQ小菜鸟4 小时前
一、初识C语言(1)
c语言
何曾参静谧4 小时前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
互联网打工人no14 小时前
每日一题——第一百二十一题
c语言
朱一头zcy5 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋5 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
何曾参静谧6 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
lulu_gh_yu7 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>8 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
EricWang135810 小时前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端