注解目录
1、烧录方式的更新迭代
1.1 古老的烧录方式
(怀旧一下,单片机高压烧录器。)
1.2 ISP 与ICP 烧录方式
(还记得当年我们玩过的 AT89S51?)
1.3 更方便的 ISP 烧录方式
1.3.1串口 ISP
(是 STC 单片机成就了我们,还是我们成就了 STC?)
1.3.2 各种 USB ISP
1)AVR
2) C8051F
3) MSP430
(在当前 STM32 一统天下的时代,上面这些单片机你还在用吗? )
2、关于 Bootloader
2.1 Bootloader 的基本形态
(Bootloader 先行,APP 在后。)
2.2 Bootloader 的两个设计实例
1)带 Shell 命行的口 BL
2)插 SD 卡即烧录的 BL
(上面这两种 BL 在实际应用中最常见,还讲了一下 Linux 的 Uboot。)
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(以下简称 BL)以及构建一个 Shell框架。可能有人会觉得它们很高深,实则不难,正所谓“会者不难,难者不会”本章就针对 BL 进行详细的讲解,希望让大家可以体会到它的重要性。
1
烧录方式的更新迭代
1.1 古老的烧录方式
单片机诞生于20 世纪 80 年代,以 51 为代表开始广泛应用于工业控制、家电等很多行业中。起初对于单片机的烧录,也就是将可执行的程序写人到其内部的 ROM 中,这不是一件容易的事情,而且成本不低,因为需要依赖于专门的烧录设备。而且受到半导体技术与工艺的限制,对于 ROM 的烧写大多需要高压。这种境况一直持续到 2000 年左右(我上大学的时候还曾用过这种专门的烧录器),如图 7.1 所示。
图7.1 单片机烧录器
1.2 ISP与ICP烧录方式
随着低压电可擦写 ROM 的成熟,单片机开始集成可通过数字电平直接读写的存储介质。其最大的优势在于可实现在系统或在电路直接烧录程序,而无须像以前一样把单片机芯片从电路中拿出来,放到编程器上,这种烧录方式就是 ISP(In System Programming)或 ICP(InCircuit Programming),如图 7.2 所示。
有人问过这样一个问题:“ISP 和ICP 我都听说过,都说是可以在电路板上直接烧录程序而无须拿下芯片,那 ISP 和ICP 有什么区别?”从广义上来说,两者没有区别,平时我们把其意义混淆也毫无问题。非要创根问底的话,那可以这样来理解:ISP 要求单片机中驻留有专门的程序,用以与上位机进行通信,接收固件数据并烧录到自身的 ROM 中,很显然 ISP 的单片机是需要可运行的,即要具备基本的最小系统电路(时钟和复位);而ICP 可以理解为 MCU 就是一块可供外部读写的存储电路.它不需要预置任何程序,也不需要单片机芯片处于可运行的状态。
支持ISP或ICP 的芯片,以 AT89S51 最为经典,当时从 AT89C51 换成 S51,多少人曾因此不再依赖烧录器而大呼爽哉。这种并口下载线非常流行,如图 7.3 所示,网上还有各种 ISF小软件,可以说它降低了很多人人门单片机的门槛,让单片机变得喜闻乐见。一台电脑、一个S51 最小系统板、一条并口 ISP 下载线,齐了!
图7.2 单片机的ISP烧录
图7.3 用于 AT89S51的并口ISP下载线
1.3 更方便的ISP烧录方式
1.串口ISP
但是后来我们发现带有并口的电脑越来越少。那是在 2005 年前后,STC 单片机开始大量出现,在功能上其实与 S51 相差无几,甚至比同期的一些高端 51 单片机还要逊色。但是它凭借一个优势让人们对它爱不释手,进一步降低了单片机的学习门槛。这个优势就是一一串口 ISP,这是真正意义上的 ISP,如图 7.4 和图 7.5 所示。
再后来,9 针串口都很少见了,只有 USB。这促使一个烧录和调试神器炙手可热--USB
图7.4 STC单片机的串口ISP线路示意
图7.5 STC单片机的串口ISP原理示意
TTL 串口。这下 232 转换芯片省掉了,直接通过 USB 进行烧录。这种方式造福了无数的单片机学习者和工程师。我本人虽然已经搞了近 20 年单片机和嵌入式,USB 串口依然是不可或缺的调试工具。
多年来,在串口与单片机的交互上,我动了很多脑筋,这也是我乐于开发 Bootloader 的一个原因。我希望“USB 串口在手,一切全有!”
STC 并不是第一个使用串口 ISP 烧录程序的,但它是最成功和最深入人心的。与之同期的很多单片机,包括时至今日仍然应用最广泛的 STM32 全系列也都支持了串口 ISP,它成了种标配的、非常普遍的程序烧录手段。
2,各种 USB ISP
串口 ISP 固然方便,但是下载速度是它的硬伤,当固件体积比较大的时候,比如一些大型嵌入式项目的固件动辄几百 KB,甚至几 MB,再用串口 ISP 就未免太慢了。所以一些单片机配有专门的 USB ISP 下载器。以下列举几种比较主流的单片机及其 USB ISP 下载器
(1) AVR
AVR单片机曾经盛极一时,但经历了 2016 年的缺芯风波之后,加之 STM32 的冲击,开始变得一蹶不振,鲜有人用了。与之配套的 USB ISP 下载器非常多样,有些是官方发布的,更多的是爱好者开源项目的成果,如图 7.6 所示。
图7.6 AVR多样的 USB ISP下载工具(AVRISP MKII与 USBASP)
(2)C8051F(见图7.7)
图7.7 C8051F的 USB ISP下载器(EC6)
(3)MSP430(见图7.8)
图7.8 MSP430的 USB ISP下载器
我们会发现,一个具有良好生态的主流单片机,一定有配套的高效便捷的烧录下载工具。可见一种好的烧录方式,对单片机开发是多么重要。
不论是串口 ISP 还是各种专用的 ISP 下载器,都有一些共同的弊端。
(1) 依赖于专门的上位机或不载器硬件,不能做到统型;
(2)下载器价格仍然比较高,尤其是原厂的,这也是为什么有些单片机催生出很多第三方的下载器,比如 AVR;
(3) 下载的时候通常需要附加额外的操作,比如 STC 要重新上电、STM32 需要设置BOOT引脚电平等。
这些额外的操作都增加了烧录的复杂性。尤其是在产品形态下要去重新烧录程序,比如嵌人式升级,就要打开外壳,或将附加信号引出到壳外。这都是非常不高效,不友好的做法。
如果有一种烧录方法,对于任何一种单片机:
(1) 通信方式统一(比如一律都用串口):
(2) 提供一个友好的操作界面(比如命令行方式):
(3) 高效快速,没有附加操作,最好一键自动化烧录;
(4) 另外再增加一些嵌人式固件管理的功能(比如固件版本管理).
这一定会让我们事半功倍。
Bootloader 就能实现上述的这一切!