所有微控制器(MCU)都需要某种机制来对其进行编程,即使它们仅被编程一次。通常,程序代码是在主机上编写的,然后 编译或翻译,然后使用电缆(通常为USB或RS232)(通常与某些软件一起)从PC(“主机”)将目标(机器可读)代码下载到PC(“主机”)中的MCU(“目标”)。 “程序员。”编程后,MCU将按编码功能运行。
一家非常受欢迎的MCU开发板制造商是 Arduino的 的 ,总部位于意大利。许多Arduino开发板都装有 AVR微控制器,这还要求程序员将在主机上创建的程序保存到目标MCU的内存中,例如AVR微控制器。外部编程器通常用于AVR微控制器,并且价格昂贵。
大多数目标MCU在项目开发过程中必须进行多次编程,因此从电路中移除MCU进行编程是不可行的。可以使用系统内编程器(ISP)对许多MCU(包括AVR处理器)进行编程,因此不必从电路板上卸下它们。 [一世]
默认情况下,Arduino开发板具有MCU驻留代码,称为引导加载程序。 引导程序 是您上电时第一个驻留在MCU上的程序。引导加载程序指示MCU加载什么或下一步做什么。借助集成开发环境(IDE),Arduino使从PC主机到板载MCU(目标)的通信变得易于使用。 IDE是驻留在主机上的,并且包含开发人员可以用来编程,编译和调试目标MCU的工具。
引导加载程序还有助于使用USB通过Arduino IDE与Arduino开发板进行通信。引导加载程序负责在代码从Arduino IDE到达时在芯片上编写代码。
Arduino的 的 开发板的整体设计使其易于使用,包括免费软件工具。 Arduino的 控制器板非常适合启动嵌入式编程,并且经常用于教学环境。 Arduino的 开发板(目标)和主机之间的简单USB连接使Arduino适用于开发嵌入式项目,而无需了解 怎么样 将程序代码放入MCU并从那里运行代码。 (Arduino将程序或代码称为“草图”。)Arduino开发板最适合于小型项目。
但是,如果目标是设计一种经济的产品,然后在定制设计的印刷电路板上使用AVR微控制器创建大批量,生产质量的板,比购买成百上千个装有相同AVR MCU的Arduino板要便宜。不过,如果避免便宜地创建和填充少量PCB,则许多人已经将Arduino(及类似产品)低成本开发板用作已安装的最终产品。
Arduino的 的 开发板具有少量的通用I / O,可用于许多不同目的。例如,Arduino开发板可以用作使用Arduino ISP的其他AVR微控制器的编程器工具,并且是对AVR MCU进行编程的最简单,最便宜的方法之一。 Arduino的 系统内编程器是免费Arduino IDE中提供的内置功能。 ISP允许您使用另一个专用的Arduino板对Arduino板和其他AVR微控制器进行编程。 [ii]
但是,使用全功能的Arduino板(作为程序员Arduino)对新开发的Arduino板进行编程有一些规定。首先,必须将“ programmer-Arduino”(您已配置为程序员的Arduino) 已配置 作为ISP。默认情况下,草图(代码)在Arduino IDE的“文件”菜单中的示例代码中可用。 [iii] Arduino的 ISP 草图 将所需的指令传递给Programmer-Arduino,以将其设置为编程模式。


如图所示,可以通过连接的LED来监视Programmer-Arduino的状态。 Arduino的 ISP 草图已为此功能进行了预编程。

引脚7 =编程(在编程期间打开)
引脚8 =错误(在编程错误时亮起)
针脚9 =心跳(一旦打开编程器电源,它将保持打开状态)
配置Programmer-Arduino之后,Programmer-Arduino与Arduino目标之间的连接建立。的 引脚配置 需要完全按照Arduino ISP草图中所述进行。
Arduino的 ISP 使用 串行外设接口(SPI)协议 用于对AVR微控制器进行编程。 SPI通信使用4个逻辑信号:MOSI,MISO,SCLK和SS。以外 I2CSPI是MCU最常用的通信模式之一。 SPI遵循主从结构,这意味着一个主设备可以使用相同的数据引脚与多个从设备进行通信,并且使用从选择线选择目标从设备。如果有存储卡,则从选择用于从多个芯片中选择特定芯片。但是,当您将Arduino用作编程工具时,从选择信号仅用于重置微控制器。重置微控制器会进入接受来自编程器Arduino的命令的状态。 [iv]
在Programmer-Arduino上,引脚10、11、12和13用作数据引脚。具体配置如下:
引脚10 = RESET
引脚11 = MOSI
针脚12 = MISO
引脚13 = SCK
5v和接地引脚可以从Programmer Arduino的 连接。连接两个Arduino的参考地非常重要,以避免遇到毛刺并保持安全。
在线串行编程(ICSP)是在不断开电路连接的情况下对微控制器进行编程的能力。 ICSP接头可通过6针形式在Arduino板上实际使用。将目标Arduino的引脚11、12和13与编程器Arduino的引脚11、12和13连接。请注意,程序员Arduino的引脚10应该连接到目标Arduino的复位引脚。另外,ICSP插头引脚可用于SPI通信。 (请参见图4)。

完成以上所有内容的接线后,您需要定义您正在使用主机PC上的Programmer模式。转到菜单中的工具,然后在“程序员”选项中选择“ Arduino的 作为ISP”。 (请参见图5)。

接下来,将引导加载程序加载到目标Arduino的内存中,然后定义“保险丝”。在Arduino领域,保险丝是用于定义微控制器中多个功能的一组指令。例如,芯片频率和时钟源在保险丝中定义。微控制器对工作电压敏感,如果电压水平降到定义的水平以下,则微控制器可能会发生故障。保险丝内部也规定了最低工作电压。 [v]
如果要配置Programmer-Arduino,使其与Arduino IDE兼容以直接上传草图,则上述步骤至关重要。 “ burn bootloader”选项也在工具菜单中,并将Bootloader刻录到目标Arduino(请参见图6)。

如果微控制器或Arduino开发板可以与Arduino IDE程序通信,则具有多种优势,例如能够使用Arduino IDE的串行监视器在运行时检查结果。 (“串行监视器”在一个单独的窗口中打开,充当接收和发送串行数据的独立终端。)
如果引导加载程序未加载到微控制器中,则它将无法使用Arduino的功能,也无法与Arduino IDE进行通信。 六 引导加载程序会占用一部分内存。在某些情况下,不需要使用Arduino IDE,因此不需要对引导加载程序进行编程。如果未对引导加载程序进行编程,则可以为主程序草图释放更多的内存。例如,在Arduino UNO中,整体内存大小为32 KB,并且为引导加载程序分配了0.5KB的内存。 七 如果未安装引导加载程序,则可用于主程序草图的总内存更大。
Arduino的 的 非常适合学习和尝试新想法。由于Arduino是开源的,包括硬件设计原理图和Gerber文件,因此任何人都可以复制Arduino,对其进行修改并在需要时在商业环境中使用它。 Arduino的 并非完全是摇钱树,而是爱的劳动,它重新定义了嵌入式硬件的传输方式。
i //ieeexplore.ieee.org/document/8005274
ii //www.arduino.cc/en/Guide/ArduinoISP
ii i //www.arduino.cc/en/Tutorial/ArduinoISP
iv //www.arduino.cc/en/Reference/SPI
v //www.arduino.cc/en/Hacking/MiniBootloader
六 //www.arduino.cc/en/Tutorial/ArduinoISP
七 //en.wikipedia.org/wiki/Arduino_Uno#Technical_specifications
只是想知道是否有一种方法来编程arduino链’s…
先生,非常感谢您的出色解释。
很好的解释。谢谢!继续写更多这样的文章。
一个不错的入门包
我可以将ICSP端口用作SPI(10、11、12和13)引脚吗?