AVRdude
arvdude为一个开源烧录avr单片机工具。
官网:http://www.nongnu.org/avrdude/
下载:http://download.savannah.gnu.org/releases/avrdude/
ISP烧录arduino bootloader
树莓派 2021-05-07-raspios-buster-armhf-full(Linux raspberrypi 5.10.17-v7l+)版本实测 avrdude-6.2.tar.gz 完全兼容,建议使用此版本。
avrdude使用教程:http://www.nongnu.org/avrdude/user-manual/avrdude.html
终端执行安装命令
执行命令前请将安装包下载到树莓派中并解压。
cd /home/pi/Downloads/avrdude-6.2
#sudo apt install bison flex libusb-dev #看情况执行
./configure --prefix=/home/pi/avrdude --enable-linuxgpio=yes
make
sudo make install
–prefix=/home/pi/avrdude:安装路径
–enable-linuxgpio=yes :使能linuxgpio
在执行./configure … 命令时出现缺少文件提示可以忽略,只要确保linuxgpio使能了即可,如下:
Configuration summary:
----------------------
DON'T HAVE libelf
DO HAVE libusb
DON'T HAVE libusb_1_0
DON'T HAVE libftdi1
DON'T HAVE libftdi
DON'T HAVE libhid
DO HAVE pthread
DISABLED doc
DISABLED parport
ENABLED linuxgpio
配置avrdude linuxgpio
找到/home/pi/avrdude/etc下面的avrdude.conf文件,打开搜索linuxgpio,会发现一段被注释了的配置,取消注释,并做如下配置
programmer
id = "linuxgpio";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 17;
sck = 18;
mosi = 22;
miso = 27;
;
上面的配置为目标烧录板连接到树莓派对应的IO口。
UNO烧录固件示例
mega328p
执行指令
#!/bin/sh
# Burn the fuse
sudo ./avrdude/bin/avrdude -p atmega328p -c linuxgpio -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m
# Burn the bootload hex
sudo ./avrdude/bin/avrdude -p atmega328p -c linuxgpio -U flash:w:./bootload/uno/optiboot_atmega328.hex:i -U lock:w:0x0F:m
mega328pb:爱特梅尔最新推出mega328pb用于替换mega328p,需要在avrdude.conf相应配置:
part parent "m328"
id = "m328p";
desc = "ATmega328P";
signature = 0x1e 0x95 0x0F;
ocdrev = 1;
;
# 以下为新增的配置
part parent "m328"
id = "m328pb";
desc = "ATmega328PB";
signature = 0x1e 0x95 0x16;
ocdrev = 1;
;
执行指令
# Burn the fuse
sudo ./avrdude/bin/avrdude -p atmega328pb -c linuxgpio -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xDE:m -U lfuse:w:0xFF:m
# Burn the bootload hex
sudo ./avrdude/bin/avrdude -p atmega328pb -c linuxgpio -U flash:w:./bootload/uno/optiboot_atmega328.hex:i -U lock:w:0x0F:m
树莓派4自启动设定
方法一
树莓派开机后会自动执行rc.local文件下的指令,所以可以将需要开机执行的命令增加到文件内。
sudo nano /etc/rc.local
新增如下命令,要保证exit 0这行代码在最后。
# burn avrchip bootload
cd /home/pi/avrburn
sudo python bootload.py &
如果需要长时间运行(例如死循环)或者运行后不能退出,那么必须确保在命令的最后添加“&”符号让命令运行在其它进程。
注意,这里树莓派开机会自动执行bootload.py文件,因为bootload.py文件调用了其他文件或者bash脚本,所以必须先执行“cd /home/pi/avrburn ”命令,进入到bootload.py的根目录中,否则只会执行bootload.py文件,却执行不了bootload.py中调用的文件。
方法二
在/etc/init.d/中创建一个文件,命名为my_start(任意名称)。
#!/bin/bash
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop vncserver
### END INIT INFO
case "$1" in
start):
echo "Starting app"
nohup python3 /home/pi/share/ip_acquire.py &
;;
stop):
echo "to"
#kill $( ps aux | grep -m 1 'python3 /home/pi/share/ip_acquire.py' | awk '{ print $2 }') ;; *)
echo "Usage: service start_tool start|stop"
exit 1 ;;
esac
exit 0
修改文件权限
sudo chmod 777 /etc/init.d/my_start
这样启动改脚本就可以用service 命令,在使用该指令前,需要重启一下系统,不然会提示没有该服务。
sudo service my_start start #启动
sudo service my_start stop #停止
添加开机启动
sudo update-rc.d my_start defaults
删除开机启动
sudo update-rc.d -f vncserver remove
一个自启动vncserver实例:
#!/bin/sh
### BEGIN INIT INFO
# Provides: vncserver
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop vncserver
### END INIT INFO
# More details see:
# http://www.penguintutor.com/linux/vnc
### Customize this entry
# Set the USER variable to the name of the user to start vncserver under
export USER='pi'
### End customization required
eval cd ~$USER
case "$1" in
start)
# 启动命令行。此处自定义分辨率、控制台号码或其它参数。
su $USER -c '/usr/bin/vncserver -depth 24 -geometry 1024x768 :1'
echo "Starting VNCServer for $USER "
;;
stop)
# 终止命令行。此处控制台号码与启动一致。
su $USER -c '/usr/bin/vncserver -kill :1'
echo "VNCServer stopped"
;;
*)
echo "Usage: /etc/init.d/vncserver {start|stop}"
exit 1
;;
esac
exit 0
方法三
在 /home/pi/.config 下创建一个文件夹,名称为 autostart,并在该文件夹下创建一个xxx.desktop文件(文件名以.desktop结尾,前面可以自定义),文件内容如下:
[Desktop Entry]
Name=example
Comment=My Python Program
Exec=python /home/pi/example.py
Icon=/home/pi/example.png
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true
以上 Name、Comment、Icon 可以自定,分别表示这个启动项目的名称、备注以及显示的图标。Exec 表示调用的指令,和在终端输入运行脚本的指令格式一致。
配置avrdude.conf文件实现USB to serial port 烧录应用hex文件(烧录bootloader后)
…
…
…
…
Arduino IDE中的USB to serial port 烧录应用hex文件(烧录bootloader后)
直接使用官网下载的原生avrdude,ISP烧录时会将bootloader也擦除掉,配置 avrdude.conf 文件避免flash被全部擦除也比较麻烦。使用arduino IDE中的avrdude.exe,可以通过usb端口将代码上传到AVR单片机中,无需复杂的配置,直接一个指令即可。
需要三个文件:
avrdude.conf、avrdude.exe、libusb0.dll在arduino目录下,位置:
avrdude.conf:Arduino\hardware\tools\avr\etc\avrdude.conf
avrdude.exe:Arduino\hardware\tools\avr\bin\avrdude.exe
libusb0.dll:Arduino\hardware\tools\avr\bin\libusb0.dll(linux系统下没有此文件)
单独拷贝这三个文件到一个文件夹下。
执行指令
在windows下执行
.\avrdude.exe -C avrdude.conf -v -v -p atmega328p -c arduino -P COMx -b 115200 -D -U flash:w:xxx.hex:i
-v 越多打印输出的越详细,用两个-v即可
-p <部件号> - AVR处理器型号
-c 使用编程器
-P <端口> - 要烧录的usb端口
-b <波特率>
-D - 禁用闪存的自动擦除
-U <内存类型>:<操作>:<HEX文件的路径>:<格式>
在linux下执行
.\avrdude.exe -C avrdude.conf -v -v -p atmega328p -c arduino -P /dev/ttyxxx -b 115200 -D -U flash:w:xxx.hex:i