事情起源
从网上买了一个arduino pro mini,接上串口之后发现无法烧录程序,扔了半年,中秋有时间拿出来搞一波。
首先怀疑买来的Arduino没有BootLoader,上网上搜了一下表现,确实是这个样子,那么问题就变成了如何给arduino烧录BootLoader
网上普遍有两种解法
- 买个烧录器烧录
- 用已有的arduino烧录ArduinoISP固件,然后给另一个Arduino烧录BootLoader
前者要花钱,后者的话需要另外一个Arduino,手头没有,但是手头有树莓派。考虑到之前用树莓派给路由器spi flash烧录过一次,觉得这次没准还是可以,网上大概查了一下,有工具,avrdude可以做这个事情,于是开搞。
烧录方法
-
下载代码
下载avrdude这个开源软件的代码,下载地址:http://download.savannah.gnu.org/releases/avrdude/
注意要下载 avrdude-6.1.tar.gz 这个文件,目前(2021年中秋)已经有6.3版本的新文件了,但是存在bug,会报错误
Cant't export GPIO 12, alread exported/busy?: Invalid arguemnt”
所以还是老老实实用6.1版本的代码吧 -
编译avrdude文件。之所以要编译是因为apt install的那个avrdude不支持linuxgpio
sudo apt install bison flex libusb-dev ./configure --prefix=/opt/avrdude --enable-linuxgpio make sudo make install
中间可能会报错,config.guess无法判定机器类型之类的,这份文件太老了,还是2003年的,无法用在树莓派上属实正常
解决方法是去找文件的最新版git clone git://git.savannah.gnu.org/config.git
找到config.guess和config.sub两个文件,替换就行了
-
配置avrdude
找到/opt/avrdude/etc下面的conf文件,打开,搜索linuxgpio,会发现一段被注释了的配置,取消注释,并做如下配置programmer id = "linuxgpio"; desc = "Use the Linux sysfs interface to bitbang GPIO lines"; type = "linuxgpio"; reset = 12; sck = 24; mosi = 23; miso = 18; ;
-
连杜邦线
实际上烧录固件时树莓派和Arduino是通过SPI接口通信的,所以要连的是两根电源线,一根reset线,外加SPI接口三根线。需要注意的一点是,reset这条线接入的并不是SPI的SS,接入的是arduino板子的reset口。下面这个图的arduino那边,请根据实际需要被刷bootloader的设备自己更改。
-
烧录bootloader文件
bootloader文件没有单独下载的链接,需要安装arduino 官方ide,然后去安装目录下hardware文件夹里面找一下hex文件,一般有多个,不确定自己要刷入那个的话,看一下boards.txt文件,里面有描述说明最后就是烧录了,一行命令搞定
sudo /opt/avrdude-6.1/bin/avrdude -p atmega328p -c linuxgpio -U flash:w:YOUR_BOOTLOADER_FILE_NAME.hex