先说一下ATmege328p这个芯片,它是被Arduino搞红的,举个例子,硬件方面,如果你想做一块Arduino板子,或者把ATmege328p嵌入到其他PCB项目中,直接使用Arduino IDE肯定是一个不错的选择,有很多开源库。那么问题来了,你不能用Arduino IDE直接把Arduino的程序烧录到刚买的ATmege328p最小系统中,怎么烧录呢?这就是本教程要解决的问题。
什么是 Arduino Bootloader?
一般在给微处理器写程序时,都是通过专门的编程器来烧写Bootloader的。不过一些基本的功能也可以通过在MCU中预先写一些程序来实现,这些预先写好的程序代码就是Bootloader。这样每次MCU复位的时候,它并不是从程序内存的开头读命令,而是先加载Bootloader,实现一些设置和功能,然后才开始执行代码。Arduino用的就是预先写好的Bootloader,每次通过串口给Arduino板下载程序的时候,都会先复位一次Arduino板,这样它就会先进入Bootloader,然后给Arduino板发送具体的下载指令,Bootloader识别到这些指令之后,就会立刻开始接收剩余的新程序代码,并写入内部Flash中。如果没有下载,Bootloader识别不到下载指令,那么就会跳转到程序区正常工作。总之,Arduino上的Bootloader就是你只用一根USB线就能开心地下载程序的原因。
准备在 Arduino 上进行 ICSP
烧写Bootloader本质上就是用编程器把专门的程序烧写到单片机里,所以方法和用编程器烧写程序是一样的。对于AVR芯片来说,烧写程序是通过ICSP(在线串行编程)硬件接口实现的。
ICSP接口有6个引脚,分别是:
对于Arduino来说,引脚的对应关系如下:
硬件连接
为了描述方便,我们将Arduino板称为ISP板,将ATmege328p最小系统板称为目标板。
软件烧录步骤
这里我们直接使用Arduino IDE来烧写。
按照上述步骤连接好ISP板和目标板后,将ISP板连接到计算机。
1. 打开 Arduino IDE,选择 Tools -> Programmer,查看所有支持的编程器列表。这里我们使用 Arduino 作为 ISP。
Arduino 作为 ISP 简单的说就是使用另一块 Arduino 板,按照常规方式下载专门的程序到上面,让它变成一个 ISP 下载器,然后把它对应的引脚连接到需要烧写 bootloader 的板上,然后通过 Arduino IDE 来控制 bootloader 的烧写。
2.打开IDE,Files -> Examples -> ArduinoISP -> ArduinoISP,使用此程序下载到ISP板。
3.打开IDE,然后点击Tools->Boards选择目标板类型,然后在Tools->Programmer中选择ISP为Arduino,最后点击Tools->Burn Bootloader,此时会开始烧写过程,需要耐心等待一段时间才能成功。
测试bootloader是否成功烧写到目标板
使用Arduino IDE直接烧录任意Arduino程序到目标板。烧录成功,并将bootloader成功烧录到目标板。
这个方法应该是最简单的,但是对于AVR单片机还有很多其他的方法,后面会介绍如何使用USPASP或者USBISP直接配置fuse位自己烧写特定的bootloader,通用性更强。