一、什么是Bootloader?
大家都知道,Arduino的本质就是“ATmega单片机最小系统板+USB转串口芯片”。所有单片机的应用开发中,均涉及到将编译好的程序上传(烧录)到单片机的程序存储器(一种ROM)中的过程。当前主流的单片机都支持ISP(In System Programing,在系统编程),即无需将单片机芯片从电路板(系统)上取下,即可对其上传(烧录)程序,其基本原理主要是通过串行通信端口或SPI(Serial Peripheral Interface,串行外设接口)端口来将程序从电脑传输到单片机的。为了在通用的通信接口上实现这种专用目的的数据传输,需要在单片机的ROM中事先烧录一段代码,这段代码在每次加电时自动运行,主要用于检测来自电脑端的程序传输信号,如果检测到特定信号,则启动程序上传(烧录)过程,否则就转去执行常规程序。这段代码就叫做Bootloader。
总之,Bootloader本质上与单片机程序存储器里存储的常规程序并无二致,可以将其理解为一种专用功能的程序,因而Bootloader本身也是可以向上传(烧录)程序一样进行修改的。
Arduino为配合IDE实现一键上传(烧录)程序,为各型号的Arduino板定制了专用的Bootloader,IDE会根据工具-处理器
和工具-开发板
中的设置配合特定型号Arduino板的Bootloader来进行程序上传(烧录)。如果上述菜单中的设置与目标Arduino板中的Bootloader不匹配,则会出现长时间停留在上传中……
最后提示上传失败的情况。一个具体的例子可参见:Arduino IDE的安装、测试与相关设置。
二、如何让Arduino变身编程器(烧录器)
由于Arduino所采用的单片机支持SPI通信协议以及通过该协议上传(烧录)程序,因而Arduino本身通过编程即可变身基于SPI协议的编程器。
操作过程非常简单,打开文件-示例-11.ArduinoISP
,将其上传到Arduino板,此时的Arduino板就成为了一个编程器。使用这个编程器,通过Arduino板上的6针ICSP( in-circuit serial programming)接口(各型号Arduino板均提供的基于SPI协议的编程接口),就可以对目标Arduino板进行更新Bootloader和上传(烧录)程序的操作了。
三、用NANO更新NANO Bootloader
- 如图连接两个NANO;
- 将作为编程器的NANO(左)用USB线连接到电脑;
- 在
工具-开发板
中选择目标板的型号,此处为Arduino NANO
; - 在
工具-处理器
中选择ATmega328P
,这就是2018年1月后新官方NANO的Bootloader; - 在
工具-端口
中选择作为编程器的NANO所连接的端口(作为目标的NANO无需接USB线,由作为编程器的NANO为其供电); - 在
工具-编程器
中选择Arduino as ISP
; - 单击
工具-烧录引导程序
,将Bootloader烧录至目标NANO。
如果使用UNO作为目标板或编程器,操作过程与连接方式完全同上。可参考文后参考资料。
四、将NANO用作编程器(烧录器)
利用上面的连接方式,除了向目标板烧录Bootloader外,也可以向目标板烧录用户编写的程序,这一点佐证了Bootloader与用户程序没有本质区别。具体操作过程是:
- 如上图连接两个NANO;
- 将作为编程器的NANO(左)用USB线连接到电脑;
- 在
工具-开发板
中选择目标板的型号,此处为Arduino NANO
; - 在
工具-处理器
中选择ATmega328P
,这就是2018年1月后新官方NANO的Bootloader,若没有更新,则需要选择ATmega328P (Old Bootloader)
,总之3、4两项要与目标板相匹配; - 在
工具-端口
中选择作为编程器的NANO所连接的端口(作为目标的NANO无需接USB线,由作为编程器的NANO为其供电); - 在
工具-编程器
中选择Arduino as ISP
; - **使用
项目-使用编程器上传
菜单项启动“编译+上传”的过程,这一步须注意,不能使用工具栏中的右向箭头(上传)
图标。
五、在面包板上搭建自己的Arduino
通过上述原理可知,对于一个ATmega328P的最小系统,只要烧录进相应Arduino型号的Bootloader,即可将其“变成”一个Arduino板,即能够使用Arduino IDE为之编写并上传程序。
因此,我们可以参照Arduino NANO或UNO的电路图搭建ATmega328P的最小系统,然后利用另外一块作为编程器的NANO为之烧录Bootloader,烧录完成之后,即可利用第四节介绍的方法,在Arduino IDE中向其上传我们编写的程序了。
ATmega328P最小系统的参考电路图如上图所示。所需原件如下:
- 晶振 16MHz 1个
- 瓷片电容 22pF 2个
- 瓷片电容 100nF 2个
- 电解电容 47uF 1个
- 电阻 10K 1个
- 电阻 1M 1个
- 集成电路 ATmega328PU(DIP28封装) 1个
ATmega328P引脚与作为编程器的NANO或UNO端口连接的对应关系如下:
ATmega328P引脚序号 | Arduino GPIO序号 |
---|---|
1 | D10 |
17 | D11 |
18 | D12 |
19 | D13 |
需要注意的是:这个DIYduino可以通过作为编程器的NANO下载程序,但是无法像标准Arduino那样直接与电脑进行串口通信, 因为这里上传程序使用的是SPI通信方式而非串口通信方式,若要使用串口与电脑通信,仍需外接USB到串口(TTL)的转接器。
参考资料:
Arduino - ArduinoISP https://www.arduino.cc/en/tutorial/arduinoISP