综述
你有一个输入不了任何代码的Arduino板子吗?或者你已经写了自己的固件,想要上传到你的Arduino上?还是你只是想了解更多Arduino,AVR和单片机的内部运作。很巧!这篇指导会告诉你什么是引导程序,为什么你需要安装/重装它,并且重复做这个步骤。
导读
在开始往下看引导程序部分前,你可能要复习一下以下指导
- 集成电路(Integrated Circuits)
- PCB基础(PCB Basics)
- 什么是Arduino(What is an Arduino)
- 安装Arduino环境(Installing the Arduino IDE)
- 串行外设接口(Serial Peripheral Interface(SPI))
什么是引导程序?
Atmel AVRs是非常小的IC,但是他们会让程序觉得棘手。你需要一个特别的编译器和一些奇特的.hex文件,并且这并不适合初学者。Arduino已经基本解决了这些问题。它们有内置的.hex文件在它们的AVR芯片上以便你通过串口对板子进行编译,这意味着你只需要一条USB线来对你的Arduino进行编译。
引导程序是一个你打开板子就会运行的.hex文件。就类似于你PC里的 BIOS。它负责两件事。一,它监测电脑是否在尝试编译它,如果是,就把电脑上的程序上传到IC内存上(在一个特殊的位置以防覆盖引导程序)。这也是为什么当你尝试上传代码时,ArduinoIDE会重置芯片,这会关掉IC并且重启以便引导程序可以再一次开始运行。如果电脑并没有试着把上传代码,它会让芯片运行储存在芯片的代码。一旦它找到并运行程序,只要有电源,Arduino就会不断重复运行。
为什么要安装引导程序
如果你在组建自己的Arduino或者需要充值IC,你就需要安装引导程序。你可能有一个坏的引导程序(尽管它不常见)并需要重新安装。这可能是你把你的板子设置到奇怪的状态了,重装引导程序和让它恢复出厂设置是最简单的解决办法。我们有见过把串行端口关掉的板子,这意味着我们没有办法把代码上传到板子上,这可能有其他办法解决的,不过最简单的办法就是重装引导程序了。像我所说的,引导程序坏了的几率是很低的。如果你的新板子有99.9%的时间不接受代码不是因为引导程序,但1%的时间是,这篇知道将能解决你的问题。
选择一个编译器
我们讲解两个不同类型的编译器来安装或者重装引导程序。
选择1:专用编译器
为了推荐一个简便的编译器,我们看一下AVR Pocket Programmer(window专用)
或者你可以用官方的 Atmel AVR MKII programmer(已停产)或者 Atmel JTAG ICE3 programmer
AVR MKII
JTAG ICE3
AVR Pocket Programmer或者最便宜的选择也可以适用于大部分的应用了,但是它们可能无法操作一些板,尤其是像ATMega2560基础板这样大内存的。
选择2:把Arduino当成编译器
另外一种选择是用Arduino Uno(或者Duemilanove)当你运行ArduinoIDE时你会看到一个范例叫作‘Arduino as ISP.’如果你上传这个代码到你的Arduino,它就基本成为一个AVR编译器了。对于生产的板子和大内存的板子并不推荐这样做,但是,在紧要关头,这还是很凑效的。也因为这种代码仅仅适用于ATMega328板子。也许有一天它能在Leonardo 或者Due上运行,但至少不是现在。
连接编译器
在线串行编译
在把IC焊接到PCB前进行编译是非常罕见的。相对的,大部分单片机有一个在系统可编程((ISP)头。尤其是例如Atmel和Microchip这些IC制造商,他们有专门的ISP方法来编译他们的IC。这涉及到在线串行编译((ICSP)。大部分Arduino和Arduino兼容板会有2×3个ICSP头引脚有一些甚至可能不止一个,这取决于它们的PCB上有多少个IC。这打破了三个SPI引脚(MISO,MOSI,SCK),和电源,地以及重置。这些引脚需要你连接你的编译器来把你的固件写入板子上。
这个是ArduinoUnoR3。它有两个ICSP头:一个控制ATmega16U2另一个控制ATmega328。你只需要用控制ATmega328的ICSP头就可以把引导程序重写到板子上了。
在一些更小的板子上你可能看不懂这个连接口,但是引脚应该是在某处被剪掉了。无论你是用SMDIC还是DIPIC, ISP 引脚应该用一个方式或另一种方式可见。一些板子可能只有SPI头的测试点。如果遇到这种情况,你可能要考虑用一个 ISP Pogo Adapter。这个套件能让你暂时很好的连接上测试点,来重新运行你的IC。
ISP Pogo Adapter Kit套件组装完成(的样子)。你可以连接前文所说的任一款编译器到你的板子上。
如果你在找Arduino板子上的ICPS头引脚上遇到了问题,你可以查询本站来找大部分Arduino涉及IC的引脚的详细资料。
一旦你确定了你板子上的6个ICSP引脚,是时候把你的程序上传到你的板子上了。你可以用编程电缆来连接二者,或者如果你没有电缆,你可以用一些公转母跳线。
如果你用类似MKII或者Pocket Programmer的编译器,你的设置应该类似这样:
或者,如果你用Arduino作为你的编译器它应该像这样:
这里是一个关于引脚连接的表格
Arduino as ISP | AVR Programmer | ISP Header | ATmega328 | ATmega32U4 |
Vcc/5V | 5V | Pin 2 | Vcc | Vcc |
GND | GND | Pin 6 | GND | GND |
MOSI/D11 | MOSI | Pin 4 | D11 | D16 |
MISO/D12 | MISO | Pin 1 | D12 | D14 |
SCK/D13 | SCK | Pin 3 | D13 | D15 |
D10 | Reset | Pin 5 | Reset | Reset |
上传代码——简单方法
简单的上传引导程序的办法是用ArduinoIDE。打开你的IDE选择你想要编译的板,然后选择编译器(如果你是用Arduino as ISP,你还需要选择一个连接了Arduino as ISP的COM端口)然后选择BurnBootloader,它会在你的板上寻找引导程序的相关.txt文件。之后,它会在引导程序的文件夹里找到引导程序并安装它。这只有在你有正确的引导程序而且当你的板在IDE正确安装了才适用。
如果因为某些原因你想用没安装在ArduinoIDE的引导程序,可以阅读下一部分。但是,仅从ArduinoIDE安装引导程序可能更简单。对于那些对设置熔丝位好奇的人,不需要害怕,当你烧写了引导程序进去时,arduino已经为你照顾了大量的细节问题。
上传代码——困难方法
困难方法是给想要使用命令行的人提供的。当你在修改和重新编译并且不想更新IDE,这办法更适合,否则它也没什么必要性。再者,你需要用编译器把所有东西上传。在这个例子里,我们使用的是avrdude。
这个方法需要两个步骤,第一步包括设置熔丝位。熔丝位是AVR芯片的用来做类似检测的东西,像检测你是否在使用外部的晶体或者是否要掉电检测。下面的指令是提供给ArduinoUno使用ATMega328的,它们也可能在其他类似的板上运行如Duemilanove,但是要先确定你是在有熔丝位的状态下进行(笔记:这个熔丝位在3.3v/MHz的板上无效)。不同板的熔丝位要求都列举在板子的txt文件里,但是如果你有安装了txt文件就用简单的方法吧
Arduino as ISP:avrdude -P comport -b 19200 -c avrisp -p m328p -v -e -U efuse:w:0x05:m -U hfuse:w:0xD6:m -U lfuse:w:0xFF:m
AVR Pocket Programmer:avrdude -b 19200 -c usbtiny -p m328p -v -e -U efuse:w:0x05:m -U hfuse:w:0xD6:m -U lfuse:w:0xFF:m
第二部就是把程序上传
Arduino as ISP:avrdude -P comport -b 19200 -c avrisp -p m328p -v -e -U flash:w:hexfilename.hex -U lock:w:0x0F:m AVR Pocket Programmer: avrdude -b19200 -c usbtiny -p m328p -v -e -U flash:w:hexfilename.hex -U lock:w:0x0F:m
最后一点,正如我们之前所讲,引导程序实质上是一个hex文件。因此你可以用这个方法上传你的代码到你的IC上。