什么是bootloader
一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader。这样每次复位时MCU就不是从程序存储器起始位置开始读取命令,而是先加载bootloader,实现一些设置和功能,再开始执行代码。
arduino通过预先写入的bootloader,每次通过串口给arduino板下载程序时,首先会令arduino板复位一次,这样就先进入了bootloader,接着向arduino板发送特定的下载指令,bootloader识别到这些指令后就会紧接着开始接收剩下的新的程序代码写入到内部flash中,如果没有进行下载,bootloader没有识别到下载指令,那么它就会跳转到程序区正常工作。
简而言之,Arduino上的bootloader就是能让你用一根usb线就可以愉快下载程序的原因所在
为什么要自己烧写bootloader
有同学可能要问了,既然bootloader已经这么写好在Arduino板里了,那为什么我们还要自己烧写呢,这不是我们喜欢折腾,而是因为:
- 自己搭建一块Arduino板,如果想自己做一块arduino板或者想将其嵌入到PCB项目里,而新出厂的单片机里是没有bootloader的,这时就需要自己烧写。
- 某些罕见情况下旧的bootloader会导致一些bug,如我遇到过旧版本bootloader无法使用watchdog的问题,这个时候写入新版本bootloader可能会解决问题(至少watchdog冲突的问题验证过是可以这样解决的)
硬件接口
烧写bootloader本质上只是使用编程器烧写一段特殊的程序到单片机中,因此其方法与使用编程器烧写程序是一样的,这个方法在不同厂商、不同种类的单片机上都是不同的。而对于arduino一般的开发板使用的avr芯片来说,烧写程序是通过ICSP(in-circuit serial programmming)硬件接口来实现的
如上图所示,arduino uno上有两个ICSP接口,分别对应其中atmega32u4(左上用于usb转串口)和atmega328(右侧用于正常执行指令),一般来说我们只需要对右侧的主处理器烧写bootloader即可。对于如pro mini等来说,片上则只有一个单片机需要烧写。
MISO | VCC |
SCK | MOSI |
Reset | GND |
ICSP接口有6个引脚,其定义如上表所示,其数字顺序从左到右,从上到下,左上为1。其中可以分为三个部分:
- SPI接口
MISO
MOSI
SCK
- 电源
VCC
GND
- 复位
Reset
有些arduino板中不仅引出了ICSP接口,同时其中的SPI接口部分的引脚也可以复用作为普通IO使用,包含在了普通的IO口排座中,而像pro mini等则没有专门设置ICSP接口排针,但所有引脚均引出。
arduino board | MOSI | MISO | SCK |
---|---|---|---|
uno\pro mini | 11 | 12 | 13 |
mega1280\mega2560 | 51 | 50 | 52 |
arduino 101 | 11 | 12 | 13 |
上表是部分arduino板上IO口与ICSP引脚的对应关系。
烧写过程
烧写bootloader可以使用多种编程器,打开arduino IDE的Tools -> Programmer
下显示了所有支持的编程器列表,这里推荐使用Arduino as ISP
方式,较为简单而且成功率高。
Arduino as ISP
简单来说就是用另一块arduino板,给它用普通方式下载一段专门的程序,将其变为一个ISP下载器,再将其相应引脚与待烧写bootloader的板子相连,再通过arduino IDE来控制进行bootloader烧写。这里斜体字显示了分为三个步骤。
-
专门的程序
打开IDE,Files -> Examples -> ArduinoISP -> ArduinoISP
,使用这个程序下载到一块arduino板中,我们暂且称这块板为ISP板。 -
ISP板与目标板连接
由前面介绍可知,这里应该是将ISP板的引脚连接到目标板上的ICSP接口上去,连接对应表如下(以使用UNO作为ISP板为例)
ISP板 | 目标板 |
---|---|
MISO / 12 | MISO / ICSP-1 |
Vcc / 5V | Vcc / ICSP-2 |
SCK / 13 | SCK / ICSP-3 |
MOSI / 11 | MOSI / ICSP-4 |
10 | Reset / ICSP-5 |
GND | GND / ICSP-6 |
实际连接电路如下所示,其中左边是ISP板,连接到电脑上,右边是等待下载bootloader的目标板
-
使用arduino IDE进行bootloader烧写
按照前面的方式连接好ISP板和目标板后,将ISP板连接到电脑上,打开IDE,首先按住ctrl + shirft + M
打开串口调试窗口,然后点击Tools -> Boards
选择目标板的类型。然后在Tools -> Programmer
中选择Arduino as ISP
,最后点击Tools -> Burn Bootloader
,此时会开始进行烧写,同时串口调试窗口里会有相关提示和确认,按照其说明输入相应按键即可完成。