Arduino 作为 ISP 和 Arduino 引导加载程序

Arduino ISP 将您的 Arduino 变成一个在线编程器,以重新编程 AtMega 芯片。

Arduino 为何如此?事情有很多,但最重要的事情之一是每个 Arduino 板都可以使用 Arduino 软件 (IDE) 轻松编程。将其连接到计算机 USB 端口并按“上传”图标即可启动将草图传输到微控制器闪存的过程。

引导加载程序

上述行为的发生归功于一段特殊的代码,该代码在微控制器每次重置时执行,并使用特定的协议和速度查找要从串行/USB 端口上传的草图。如果未检测到连接,执行将传递到草图的代码。

这段小代码(通常为 512 字节)称为“引导加载程序”,它位于微控制器内存的一个区域中(位于地址空间的末尾),无法将其重新编程为常规草图,并且已被为此目的而设计。

内存映射

ATmega328P 的内存映射

要对引导加载程序进行编程并为微控制器提供与 Arduino 软件 (IDE) 的兼容性,您需要使用在线串行编程器 (ISP),该设备连接到微控制器的一组特定引脚来执行编程微控制器的整个闪存,包括引导加载程序。ISP 编程过程还包括熔丝的写入:一组特殊的位,定义微控制器在特定情况下如何工作。

使用Arduino作为ISP

加载引导加载程序代码并正确烧毁保险丝以使 ATmega 微控制器成为“Arduino”的整个过程由 Arduino 软件 (IDE) 管理:它提供特定的菜单项并允许您使用各种编程设备。在程序员中,“Arduino as ISP”是使用 ATmega、32U4 或 ATtiny 在另一块 Arduino 板上烧录引导加载程序的最便宜、最实用的解决方案。

ISP 程序员

编程过程使用VCC、GND 和四个数据引脚。三个引脚连接编程微控制器和目标微控制器之间的 MISO、MOSI 和 SCK,编程微控制器的第四个引脚连接到目标微控制器的复位引脚。

如何给你的板子接线

下表显示了不同 Arduino 板上 MOSI、MISO 和 SCK 在哪些引脚上断开:

Arduino BoardMOSIMISOSCKLevel
UNO or Duemilanove11 or ICSP-412 or ICSP-113 or ICSP-35V
Mega1280 or Mega256051 or ICSP-450 or ICSP-152 or ICSP-35V
LeonardoICSP-4ICSP-1ICSP-35V
DueICSP-4ICSP-1ICSP-33.3V
ZeroICSP-4ICSP-1ICSP-33.3V
10111 or ICSP-412 or ICSP-113 or ICSP-33.3V

SPI 接口(以及这些引脚)是用于对 AVR 微控制器进行编程的接口。请注意,MISO、MOSI 和 SCK 在 ICSP 标头上的一致物理位置中可用;该连接器也可用于依赖 SPI 接口的屏蔽,从而允许设计适用于每个电路板的屏蔽。

ICSP标头

在下图中的 Arduino UNO 上,我们用红色突出显示了母排上的连接;黄色的是连接到 ATmega328P 的 ICSP 连接器。请注意,Rev.3 板具有管理 USB 连接的 ATMega 16U2 芯片,并且该芯片可以通过 ATMega 16U2 本身上方标记为 ICSP2 的专用连接器重新编程。

乌诺连接

在某些 Arduino 板上(见上表),引脚 MOSI、MISO 和 SCK 分别与数字引脚 11、12 和 13 相同。这就是为什么许多教程指导您将目标连接到这些引脚。如果您发现这种接线更实用,请定义 USE_OLD_STYLE_WIRING。即使不使用 UNO,这也能工作。(对于 UNO 板,则不需要)。

ArduinoUNOtoUNO ISP2

在上图中,我们使用“旧式”连接连接两个用于引导加载程序烧录的 UNO 板:顶板是目标,底板是编程器。注意从编程器的 D10 到目标的 RESET 的黄色连接。在MKR系列主板上,不能使用D10进行复位;我们建议使用 D6,并且您必须记住更改 ArduinoISP 草图的第 73 行 -

<span style="color:#393a34"><span style="background-color:#f6f8fa"><em><code><span style="color:#393a34"><span style="color:#36acaa">#</span><span style="color:#00009f">define</span> <span style="color:#36acaa">RESET</span> <span style="color:#36acaa">10</span></span></code></em></span></span>

- 用“6”代替 10。

Arduino ISP 线

该 Arduino NANO 通过其 ICSP 连接器进行编程,电线来自编程器 UNO 板的 D10-D13。

超级图乌诺

上面的 Arduino MEGA 正在对 Arduino UNO 进行编程,将 D51-D11、D50-D12、D52-D13、GND-GND、5V-5V 和 D10 连接到 RESET。这种类型的板需要一个连接到 RESET 和 GND 的 10 µF电解电容器,正极(长腿)连接到 RESET。必须在编程器板加载 ISP 草图后放置电容器。

仅当微控制器和计算机 USB 之间有接口的开发板(例如 Mega、UNO、Mini、Nano)才需要连接到编程板 RESET 和 GND 的 10 µF 电解电容。Leonardo、Esplora 和 Micro 等主板的 USB 直接由微控制器管理,不需要电容器。

关于电压

Arduino 系列板包括 5V 和 3.3V 设备。当使用不支持 5V 的 Arduino(Due、Zero、...)作为编程器时,请确保不要将编程器的任何引脚暴露在 5V 电压下。实现此目的的一个简单方法是以 3V3 为整个系统(编程器和目标)供电。

MKR1000 ISP UNO 2

在上图中,您可以看到 MKR1000 和 UNO 之间的接线。如上所述,一切都在 3.3V 上运行,取自 MKR1000 的 VCC 和 GND,并发送到 UNO 的 5V 和 GND。按照页面中说明的引脚排列,可以对 UNO 的 ICSP 进行相同的连接。我们对电线使用了与其他图片中相同的颜色,以帮助您轻松从“旧接线”切换到 ICSP 连接器。请注意,MKR 系列板共享相同的引脚排列,因此您可以使用任何 MKR 板作为 ISP 编程器。如果您使用 MKR 板作为 ISP 编程器,请记住更改 ArduinoISP 的第 73 行,该行定义了 MKR 板上使用的实际引脚以重置目标(上图中的 6)。

注意:在设置连接和电线时,请勿连接 USB 或给开发板供电。我们还建议您首先对用作 ISP 编程器的 Arduino 进行编程,然后再继续连接到目标板。

加载草图

您作为程序员使用的 Arduino 需要特定的草图。您可以在示例 > 11. ArduinoISP > ArduinoISP 下找到它。

加载草图

浏览草图的线条,您会发现许多需要根据目标板进行设置的参数。然而,这些参数是由 Arduino 软件 (IDE) 支持的每个引导加载程序/板可用的特定文件设置的。其他参数已在注释中清楚地解释,只有在您知道自己在做什么的情况下才应更改。该草图还支持三个 LED,为您提供有关编程过程的视觉反馈。

Arduino ISP LEDSOK

要将草图上传到您将用作编程器的 Arduino 板,您需要选择板类型和端口,然后就可以照常进行。

对引导加载程序进行编程

如果所有电线均已设置,您需要切换到要使用引导加载程序进行编程的板类型。为了选择正确的引导加载程序代码和保险丝配置,必须执行此步骤。编程过程在执行任何写入操作之前都会检查微控制器的签名,但许多板共享相同的微控制器,并且每个板都有自己的引导加载程序。该端口仍然是 ArduinoISP 的端口。

选择工具下的“Burn bootloader”,等待Arduino Software(IDE)界面下方的确认消息。如果您连接了 LED,您可以直观地跟踪该过程。

烧伤

串行编程模式

编程过程根据标准 SPI 编程协议管理 3 条 SPI 线(MISO、MOSI 和 SCK),这与读写 SD 存储卡相同。与存储卡的唯一区别是缺少 CS(片选)引脚。在我们的 AVR 微控制器上,我们使用 RESET 引脚来停止任何草图或引导加载程序的执行,并将微控制器置于特定状态,在该状态下侦听来自 SPI 接口的命令。该协议所需的第一个命令是以串行编程模式进入微控制器的命令。

一旦此特定模式处于活动状态,我们就可以写入和读取所有微控制器可编程区域:闪存、EEPROM 和保险丝。在闪存的末尾,我们有引导加载程序代码区域,如本文开头的图像中突出显示的那样。“烧录引导加载程序”程序还根据电路板的设计正确设置微控制器的保险丝。这就是为什么您必须在列表中选择确切的板型号来刻录引导加载程序的原因之一。

编程的技术方面

用于对微控制器进行编程的开源软件工具是avrdude。该过程经历四个步骤:解锁芯片的引导加载程序部分、设置芯片上的熔丝、将引导加载程序代码上传到芯片、锁定芯片的引导加载程序部分。

保险丝根据存储在与电路板关联的每个参数文件中的首选项进行管理,避免潜在的错误。

熔丝的管理通常是一组三个字节(低字节、高字节和扩展字节),是引导加载程序编程中最微妙的方面:错误的熔丝设置可能会损坏微控制器和电路板。熔丝定义了微控制器功能的许多方面,例如:选择不同的时钟源并更改芯片的运行速度、设置芯片工作前所需的最低电压(掉电)、设置是否使用引导加载程序、设置分配多少内存到引导加载程序(从 256 到 2048 个字 - 512 到 4096 个字节),禁用复位或串行编程,并在上传新草图时停止擦除 EEPROM 数据。

保险丝的详细说明可以在每个微控制器的数据表中找到。

每个设置都有其自己的用途,允许开发人员锁定芯片并保护其免受 ISP 编程是合乎逻辑的,但可能会错误地以错误的方式设置保险丝,从而将您锁定在通过 ISP 接口的编程过程之外。要恢复微控制器,您必须依靠使用 12V 的高压串行编程器来重置保险丝。

回顾:8步烧录Bootloader

  • 打开 ArduinoISP 固件(在示例中)到您的 Arduino 板。

  • Arduino 1.0 注意:您需要对 ArduinoISP 代码进行一点小改动。找到 heartbeat() 函数中显示“delay(40);”的行 并将其更改为“延迟(20);”。

  • 在工具 > 板和串行端口菜单中选择与您用作编程器的板(而不是正在编程的板)相对应的项目。

  • 上传 ArduinoISP 草图。

  • 连接你的 Arduino 板..

  • 在“工具”>“开发板”菜单中选择与要在其上刻录引导加载程序的开发板(而不是您用作编程器的开发板)相对应的项目。有关详细信息,请参阅环境页面上的板描述。

  • 在 Tools>Programmer 菜单中选择 Arduino 作为 ISP。

  • 使用刻录引导加载程序命令。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值