在面包板上DIY自己的Arduino:Arduino Bootloader探秘

一、什么是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

在面包板上DIY自己的Arduino:Arduino Bootloader探秘_第1张图片
NANO编程器用作编程器
  1. 如图连接两个NANO;
  2. 将作为编程器的NANO(左)用USB线连接到电脑;
  3. 工具-开发板中选择目标板的型号,此处为Arduino NANO
  4. 工具-处理器中选择ATmega328P,这就是2018年1月后新官方NANO的Bootloader;
  5. 工具-端口中选择作为编程器的NANO所连接的端口(作为目标的NANO无需接USB线,由作为编程器的NANO为其供电);
  6. 工具-编程器中选择Arduino as ISP
  7. 单击工具-烧录引导程序,将Bootloader烧录至目标NANO。

如果使用UNO作为目标板或编程器,操作过程与连接方式完全同上。可参考文后参考资料。

四、将NANO用作编程器(烧录器)

利用上面的连接方式,除了向目标板烧录Bootloader外,也可以向目标板烧录用户编写的程序,这一点佐证了Bootloader与用户程序没有本质区别。具体操作过程是:

  1. 如上图连接两个NANO;
  2. 将作为编程器的NANO(左)用USB线连接到电脑;
  3. 工具-开发板中选择目标板的型号,此处为Arduino NANO
  4. 工具-处理器中选择ATmega328P,这就是2018年1月后新官方NANO的Bootloader,若没有更新,则需要选择ATmega328P (Old Bootloader),总之3、4两项要与目标板相匹配;
  5. 工具-端口中选择作为编程器的NANO所连接的端口(作为目标的NANO无需接USB线,由作为编程器的NANO为其供电);
  6. 工具-编程器中选择Arduino as ISP
  7. **使用项目-使用编程器上传菜单项启动“编译+上传”的过程,这一步须注意,不能使用工具栏中的右向箭头(上传)图标。

五、在面包板上搭建自己的Arduino

通过上述原理可知,对于一个ATmega328P的最小系统,只要烧录进相应Arduino型号的Bootloader,即可将其“变成”一个Arduino板,即能够使用Arduino IDE为之编写并上传程序。
因此,我们可以参照Arduino NANO或UNO的电路图搭建ATmega328P的最小系统,然后利用另外一块作为编程器的NANO为之烧录Bootloader,烧录完成之后,即可利用第四节介绍的方法,在Arduino IDE中向其上传我们编写的程序了。

在面包板上DIY自己的Arduino:Arduino Bootloader探秘_第2张图片
DIYduino电路图

ATmega328P最小系统的参考电路图如上图所示。所需原件如下:

  1. 晶振 16MHz 1个
  2. 瓷片电容 22pF 2个
  3. 瓷片电容 100nF 2个
  4. 电解电容 47uF 1个
  5. 电阻 10K 1个
  6. 电阻 1M 1个
  7. 集成电路 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

你可能感兴趣的:(在面包板上DIY自己的Arduino:Arduino Bootloader探秘)