温馨提示:本篇文章用于入门教程,略显废话,敬请谅解。
Arduino作为一个开源的电子平台,因拥有灵活、易用的硬件和软件因素,深受大家的喜欢,尤其是有硬件基础的朋友们,想必一定自己动手制作过Arduino uno最小系统板,或因操作不当烧坏芯片时更换过ARM芯片,但是从淘宝或其它渠道购买的芯片不同于我们购买的成品开发板,芯片缺少bootloader,无法直接烧录程序进行使用,需要我们自己先烧录bootloader才能使用,Arduino uno烧录bootloader的教程,网上很多,但是发现一个通病,就是他们写教程的时候往往使用的都是购买的成品开发板(或者无实物编写),使用烧录工具时,一次就成功,往往忽略了新的芯片不兼容板子时带来的问题,导致很多新手在烧录bootloader时一直失败,又找不到问题,怀疑自己做的板子有问题,或者芯片不行,今天这篇文章来给大家说一下关于自制的改进版Arduino uno或更换ATmega328p芯片后的开发板如何烧录bootloader。
下面这张图(左)就是我自制的uno开发板,在网上成品开发板(右)的基础上加入更多的5V、3V3、GND接口,省去使用面包板,接线更方便。
首先我们先看一下自制或更换芯片后的板子直接烧录程序时,会出现的错误(如下图),这个错误就是通信失败,出现这个其实分为2种情况:第一种情况是购买的成品板或有bootloader的板子,做功能调试的时候出现这种报错,那是因为在上传程序的时候,我们开发的IO0、IO1接口接了蓝牙或其它通信设备,IO0、IO1接口Arduino uno的硬件串口,在上传程序时会使用,如果被占用,就会出现这个报错,处理方法就是上传程序的时候把IO0、IO1的外设先拔掉,程序上传完成后,再把外设接上;第二种就是我们这种自制或更换芯片,没有bootloader,会通信失败。
其次,我们来了解一下烧录bootloader的方法,我验证了2种可行方案:第一种使用AVR USB烧录器进行烧录,第二种使用其它成品开发板作为烧录器进行烧录(这个今天不做教程分析了,其实两种方案操作都一样,对比着进行即可)。
我们今天只说第一种:使用AVR USB烧录器通过开发板的ISCP接口进行烧录,ICSP接口为在线程序烧录接口,一个2*3的排针端子,分别对应RESET、SCK、MISO、GND、MOSI、5V,具体顺序如下图所示。
如果说你自制板子时没有预留这个接口,那也没关系,因为这6根排针与单片机相连接,分别对应RESET、IO13、IO12、GND、IO11、5V接口,使用杜邦线连接即可,再如果说你画板子的时候,只把用的IO口画出来了,其他的没预留,那也没关系,2种终极方案:1看芯片引脚,找出这6个芯片引脚,飞线烧录,2把芯片焊接到成品板上,烧录后再焊接回来。
接下来我们说烧录器,在淘宝购买即可,10~20元不等,我买的13元,但是需要必坑,我先买了一款(左),但是我的电脑识别不到这个设备,换了三四个电脑都不行,一直报未知USB设备(设备描述符请求失败),所以又买了另外一款(右),可以正常使用。
接下来说烧录软件,可以直接使用Arduino ide进行烧录,方便快捷,也可以使用商家提供的软件(基本都是PROGISP,但比较繁琐),我们先来说使用PROGISP软件烧录:使用AVR USB烧录器连接开发板ICSP接口(开发板不需要USB再供电,ICSP接口有供电),插入电脑,打开软件,按照下图进行设置:
先确认软件能够识别到我们的烧录器(识别成功为1),然后在2中选择芯片类型ATmega 328P,接下来点击3,选择flash文件,这个商家没有提供,我们电脑中有,路径如下(但咱们电脑名称不同,替换14090):C:\Users\14090\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\bootloaders\optiboot,打开之后按照步骤4,选择328.hex文件,然后选择5中的选项,点击6编程熔丝,按7中进行熔丝设置,然后关闭弹窗,执行8进行烧录即可(我看网上教程都是到这一步,说等成功即可),但是,对于烧录结果,无疑是失败的(指的是全新的芯片,而不是买的成品板进行二次烧录),会出现下边这种无法识别的情况。
这个时候,先不用怀疑你的板子或者烧录器有问题,之所以出现购买的成品板可以烧录成功,自制或更换芯片后不成功的现象,是因为成品板上的芯片出厂前已经提前烧录过16MHz外部晶振熔丝和引导程序,适用于板子上的16MHz晶振,所以二次烧录会成功,但是新买的空白芯片是默认熔丝(内部为8MHz RC时钟),通信速率低于USBasp烧录器,所以烧录时会失败,原因知道了,那办法就是降低USBasp烧录器的通信速率,与空白芯片一致即可,怎么降低速度,我们后边再说,先说使用Arduino ide进行烧录。
使用Arduino ide烧录就比较简单了,步骤如下:使用AVR USB烧录器连接开发板ICSP接口(开发板不需要USB再供电,ICSP接口有供电),插入电脑,打开ide软件,设置如下:
点击工具,开发板选择Arduino uno,编程器选择USBasp,然后点击烧录引导程序,当然结果也是失败的(指的是全新的芯片,而不是买的成品板进行二次烧录),报错结果如下图,原因也是上述通信速率的问题。
这里多说一句,ide中的端口为灰色,这个不用管,因为USBasp不是串口通信,所以不显示,只要我们能在电脑中看到识别USBasp即可。
到此为止,两种烧录方式讲解完毕,接下来我们来讲如何降低USBasp通信速率,保证我们能够正常烧录bootloader,步骤如下:
1.按住WIN+R,输入cmd命令,然后再输入cd+我们Arduino引导程序的位置(路径即上边说的328.hex文件存储的位置,复制路径,在这个界面右键一下,自动粘贴,防止手动输入错误,cd和路径之间有一个空格),回车之后便进入到该目录,输入dir看到328.hex文件,说明目录正确。
2.然后输入下边这条命令,修改速率(14090为安装位置,需修改):C:\Users\14090\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\bin\avrdude.exe -C C:\Users\14090\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\etc\avrdude.conf -c usbasp -p m328p -B 10 -U lfuse:w:0xFF:m -U hfuse:w:0xDE:m -U efuse:w:0x05:m -U flash:w:optiboot_atmega328.hex:i
执行命令后,可以看到修改参数、烧录进程,等待结束即可,看到下图提示,代表bootloader烧写成功,此时,我们的烧录就结束了,开发板可以正常使用了,按一下开发板复位键,可以看到IO13接口的指示灯快闪三次,如果没有这个指示灯,也没有关系,回到Arduino ide中再次进行引导程序烧录,就可以成功二次烧录了。
然后烧录一个我们写的测试程序,接入OLED显示屏,确认功能没问题。
下边我们来对这条修改速率、能够匹配通信的指令进行解析:
C:\Users\14090\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\bin\avrdude.exe指AVR单片机官方烧录工具,默认放在我们这个路径下,用来读写ATmega系列芯片闪存、熔丝位;
-C C:\Users\14090\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\etc\avrdude.conf指定配置文件 avrdude.conf;
-c指编程器类型usbasp;
-p指目标单片机型号m328p;
-B指设置ISP通信时钟周期,默认USBasp速度快,全新芯片出厂内部8MHz时钟,高速容易通信失败,-B 10降低通信速率,提升空白芯片烧录成功率,数值越大,速度越慢、稳定性越强;
-U lfuse:w:0xFF:m中U指读写指令格式,lfuse低位熔丝位,w写入,0xFF为UNO标准低位熔丝,启用外部16MHz晶振,m 从内存写入熔丝;
-U hfuse:w:0xDE:m中U指读写指令格式,hfuse高位熔丝位,w写入,0xDE为UNO标准高位熔丝,启用外部16MHz晶振,m 从内存写入熔丝;
-U efuse:w:0x05:m中U指读写指令格式,efuse扩展熔丝位(配置BOD掉电检测电压等辅助功能),w写入,0x05适配UNO电路参数,m从内存写入熔丝;
-U flash:w:optiboot_atmega328.hex:i中U指读写指令格式,flash是程序闪存区,w写入optiboot_atmega328.hex(UNO引导程序Bootloader),i 代表输入文件为Intel Hex格式固件。
今天的教程就到此结束了,如果有疑问或不同见解,可在评论区留言讨论,感谢大家。