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

注解目录

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? )

2

关于 Bootloader

2.1 Bootloader的基本形态

直接看图7.9。

图7.9 Bootloader的基本形态

可以看到 BL就是一段存储在 ROM 中的程序,它主要实现 4 个功能:

(1) 通过某种途径获取要烧录的固件数据;

(2)将固件数据写入到 ROM的 APP区中;

(3)跳转到 APP 区运行,将烧录进去用户程序引导起来;

(4) 在此过程中,提供必要而友好的人机交互界面。

这么说可能不好理解,我们还是通过实例来进行讲解

2.2 Bootloader的两个设计实例

下面的两个实例,用于说明 BL 的实际应用形态,不涉及具体的实现细节,旨在让大家了解 BL 实际是如何运行的。

1.带Shell命令行的串口BL

基本的操作逻辑如下:

(1) 通过超级终端、SecureCRT 或 Xshell 之类的串口终端输人命令 program;

(2) BL 接收到命令后,开始等待接收固件文件数据;

(3) 串口终端通过某种文件数据传输协议(大家可以参见本书相应章节对 X/Y/Zmodem协议的介绍)将固件数据传给 BL;

(4) BL将固件数据写人到 ROM的 APP 区中;

(5) BL将 APP 区中的程序引导运行起来。

更具体的示意如图 7.10 所示

这里把操作逻辑说得很简单,实际实现起来却并不容易。我们放在后面去细究其具体实现。

图7.10 带Shell命令行的串口 BL逻辑示意

2.插 SD 卡即烧录的 BL

基本的操作逻辑如下:

(1) 将待烧录的固件拷贝到 SD 卡中;

(2) 将 SD 卡插人到卡槽中;

(3) BL 检测到 SD 卡插人,搜索卡中 BIN 文件:

(4)将 BIN 文件数据读出写人到 ROM的 APP 区中:

(5) BL将 APP 区中的程序引导运行起来。

如图 7.11 所示。

通过这两个设计实例,大家应该已经了解 BL 是什么了吧。有没有感受到 BL 是比ISP 烧录器更通用、更灵活、更友好、功能更强大的固件烧录和管理手段呢?

有人可能知道 Linux 下的 Uboot,它就是一个强大的 BL,它提供非常强大的刷机(烧录操作系统镜像)的功能以及完备而灵活的 Shell界面,如图 7.12 所示。其实我们电脑的 BIOS 也是一种广义的 BL。

那如何实现一个 BL 呢?别急,要实现 BL 是需要满足一些基本要求的。

图 7.11 插 SD卡即烧录的 BL 逻辑示意

图 7.12 Uboot Shell 界面

相关推荐
RuoZoe4 天前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
祈安_7 天前
C语言内存函数
c语言·后端
norlan_jame9 天前
C-PHY与D-PHY差异
c语言·开发语言
czy87874759 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
m0_531237179 天前
C语言-数组练习进阶
c语言·开发语言·算法
Z9fish9 天前
sse哈工大C语言编程练习23
c语言·数据结构·算法
代码无bug抓狂人9 天前
C语言之单词方阵——深搜(很好的深搜例题)
c语言·开发语言·算法·深度优先
CodeJourney_J9 天前
从“Hello World“ 开始 C++
c语言·c++·学习
枫叶丹49 天前
【Qt开发】Qt界面优化(七)-> Qt样式表(QSS) 样式属性
c语言·开发语言·c++·qt
with-the-flow9 天前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法