Arduino板子上集成了USB虚拟串口,由此在PC和AVR之间建立起了串口通讯的渠道。Arduino出厂默认在Flash内置了一个bootloader程序,在Arduino启动的头几秒内,bootloader会检查从串口来的数据,如果这些数据能解析成特定协议的消息格式,bootloader进入ISP模式,从串口接收数据对Flash编程。这里所说的“特定协议”,是Arduino在Atmel 的STK v2协议的基础上略微修改而来的,Arduino bootloader实现了这一被修改的STK v2协议,以实现ISP。这就是Arduino下载程序的大概机制。虚拟串口和bootloader,是Arduino的便利性之一。
Arduino板子上预留了6 Pin的ICSP接口,以支持用“硬件编程器”下载程序,如下图。USBasp就是一种硬件编程器,并且是被Arduino软件直接支持的。
USBasp上的10 Pin接口定义如下:
显然,USBasp与Arduino接口数量和次序都不一致。可以自制转接线,也可购买到现成的。另外需注意,ICSP接口已向Arduino供电,不需要再从USB供电,使用USBasp时,不要连接Arduino虚拟串口。首次将USBasp插到PC,Windows自动安装USBasp驱动,如下图:
要在Arduino软件中使用USBasp下载程序,需要通过菜单Tools->Programmer选择USBasp,如下图:
USBasp是德国一家公司开发的,默认Arduino支持的是“官方”的USBasp,而买到的很可能是“非官方”的模块。要使用非官当USBasp,需要修改一下AVRDude配置文件。打开hardware\tools\avr\etc\avrdude.conf,找到USBasp配置区域,将如下所示的2行注释掉,这样就能使用“任何”版本的USBasp了:
programmer id = "usbasp"; desc = "USBasp, http://www.fischl.de/usbasp/"; type = "usbasp"; connection_type = usb; usbvid = 0x16C0; # VOTI usbpid = 0x05DC; # Obdev's free shared PID #usbvendor = "www.fischl.de"; #usbproduct = "USBasp";
在Arduino软件中选择菜单Sketch->Upload Using Programmer,会调用AVRDude使用 usbasp 协议下载程序,命令行如下:
avrdude -CC:\Arduino\arduino-1.8.5\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -cusbasp -Pusb -Uflash:w:C:\Users\user1\AppData\Local\Temp\arduino_build_578298/Blink.ino.hex:i
小结一下,使用USBasp下载程序的选项主要是:
- 协议:usbasp(-c usbasp)
- 端口:usb(-P usb)
- 另外注意,与arduino协议相比,使用USBasp时不指定 -D 选项
简单地提一下,我曾经遇到过USBasp下载失败的情况。在Arduino官方论坛中找到了解决方案,这是Windows默认安装的USBAsp驱动程序引起的。需要卸载libusb-win32驱动,下载一个叫做zadig的工具,使用此工具为USBasp安装 libusbK 驱动。
如果使用Eclipse AVR Plugin,可以创建一个如下的编程器配置。另外在下载程序时,留意取消掉-D选项:
使用USBasp下载过程序后,MCU中的bootloader会被覆盖,无法再通过USB虚拟串口下载程序。如果需要恢复,在Arduino软件中选择菜单 Tools->Burn Bootloader,Arduino即会重新下载bootloader到MCU中: