0%

Arduino烧录Boot Loader

Boot Loader,或「引导程序」,是微控制器中烧录的固件。对于Arduino而言,每次按下复位键,或者编译上传新的程序时,都会先加载Boot Loader;随后Boot Loader再来执行程序,或者根据电脑的指令,将新程序的代码写入闪存中。
在正常情况下,Boot Loader是预置好的,用户只需要写程序然后上传,而不用关心其它的问题。但在有些情况下,还是需要用户自己来烧录Boot Loader。例如,根据Arduino开源的电路图制造和焊接的开发版,使用前需要烧录Boot Loader才能正常工作。而一些国产的寨版,可能出现各种奇怪的问题,这时也可以尝试通过刷Boot Loader来解决。
烧录Boot Loader的方式有很多种。在Arduino IDE的菜单中,选择「工具」 → 「编程器」,即可查看官方支持的方法:

本文将介绍其中的一种方法:使用另一块Arduino开发版,作为ISP(即in-system programmer),来进行烧录。为了避免歧义,我们将功能正常的版称为「ISP板」,而需要烧录Boot Loader的版称为「坏板」。在具体的例子中,将一块「Arduino Leonardo」作为「ISP板」,一块「Arduino Mega 2560」作为「坏板」。

上传程序

将「ISP板」连接到电脑,并移除其它所有线缆。打开Arduino IDE,在菜单中选择「文件」 → 「示例」 → 「11.ArduinoISP」 → 「ArduinoISP」。这是一个将Arduino变为AVRISP的程序,将其编译上传到「ISP板」即可。

连接线缆

接下来需要连接「ISP板」和「坏板」,这需要用到六根杜邦线。为了避免出现问题,务必在断电(拔掉「ISP板」上的USB线缆等任何电源)的情况下操作。
首先,我们来确定要连接的引脚——ICSP接口。ICSP即In Circuit Serial Programming,它的针脚定义如下图所示

在每块Arduino板靠近微处理器的地方,都能找到这个2x3的ICSP接口(一般会直接在电路板上注明ICSP)

对于Mega 2560和UNO这些使用了ATmega8u2或ATmega16u2芯片的Arduino板,在靠近USB接口处还有另一个2x3的接口,这是用来给USB芯片烧录固件的,不要弄错了。

随后,将「ISP板」和「坏板」上的ICSP接口一一对应地连接起来,除了5号引脚,即RST引脚。将「ISP板」上的数字I/O 10连接到「坏板」上ICSP的5号引脚,如下图所示

完成前面的步骤后,就可以来进行烧录了。

进行烧录

再次将「ISP板」连接到电脑,这时「坏板」将通过「ISP板」获得供电,电源指示灯应当亮起。在Arduino IDE的菜单中,点击「工具」,设置「开发板」和「处理器」为「坏板」的型号,下方的「编程器」选择「Arduino as ISP」(如果「ISP板」的处理器是ATmega32U4,例如Arduino Leonardo,则选择「Arduino as ISP (ATmega32U4)」)。
设置完成后,点击最下方的「烧录引导程序」,Arduino IDE会调用avrdude自动完成烧录过程,耐心等待就行了。

报错

如果在烧录过程中,Arduino IDE提示「烧录引导程序出错」,并且控制台显示

1
avrdude: Yikes! Invalid device signature.

这时可以开启详细报错来debug。打开Arduino IDE的首选项,勾选「显示详细输出」后的两个选项。

随后,再次进行烧录,控制台中会显示报错信息,例如

1
avrdude: Device signature = 0x000000

或者

1
avrdude: Device signature = 0xffffff (probably .avr8x_mega) (retrying)

这可能是接线错误导致,也有可能是芯片损坏了。具体的错误原因本文无法解答,如果确实出现了这种情况,可以求助于国内外的Arduino社区。


参考文章:
https://www.arduino.cc/en/Hacking/Bootloader
https://www.arduino.cc/en/tutorial/arduinoISP

🍭支持一根棒棒糖!