基于USBASP给AVR单片机烧写Arduino bootloader和application固件

基于USBASP给AVR单片机烧写Arduino bootloader和application固件

Arduino 微控制器的数字端口和模拟端口与 ATMEGA 328 芯片引脚的对应关系图如下。其中,标有 0~13 标号的引脚对应的是数字端口;在 0~13 前面有符号“~”的引脚对应的端口具有 PWM 输出功能;标有 A0~A5 标号的是模拟端口。

Arduino板由于操作不当导致固件损坏,或者想把自己开发的板子用到Arduino生态中去,这里介绍一下基于外购的USBASP烧录器通过USB转SPI接口将Arduino的bootloader烧写进目标MCU的FLASH,就之后就可以用Arduino IDE通过UART下载APP到目标MCU了。首先确保手上有一个USBASP下载器,淘宝上一搜一大堆。

一、准备工作:

1)给USBASP板子装驱动程序

注意选择好驱动程序所在目录之后,win10可能会弹窗报错,说INF不包含数字签名所以拒绝安装驱动程序,此刻请参考《解决Win10安装驱动时,INF不包含数字签名信息》一文,设置windows系统有条件重启,需选择“禁用驱动程序强制签名”,然后再尝试安装驱动程序。注意USBasp的驱动程序也讲究版本,我图便宜是在“优信电子”淘宝店买的下载板,但店家提供的驱动程序libusb0.dll的版本是V0.1.10.1,着实太老了,结果智峰固件下载软件PROGISP V1.72运行时会报错说没有找到下载板或下载板到目标板连线错误,我只得将驱动程序换成其他店家提供的V1.2.4.0的版本:USBasp-win-driver-x86-x64-ia64-v1.2.4,这之后才能成功下载bootloader的hex文件到目标MCU。下图是安装好驱动程序之后的“设备管理器”截屏:

2)连接USBASP到Arduino UNO

注意USBASP下载接口是10PIN插针,而Arduino UNO板载的下载接口是6PIN插针,需要按下图的管脚定义用杜邦线飞线连接。下图是连接好杜邦线之后的照片:

其中: MOSI连MOSI,SCK连SCK,MISO连MISO,RESET连RSET,最后把VCC和GND连好,USBASP能对arduino提供5V供电,因此无需再给Arduino UNO供电。

二、下载bootloader

线连好之后就可以下载bootloader了,需运行淘宝店提供的配套软件PROGISP V1.72,操作步骤如下:

以Arduino UNO为例,它板载了一颗ATmega328P芯片,因此在第一步栏选择ATmega328P,然后第二步点击按钮。如果下面的文本框提示"读出ID成功",说明你的目标MCU已经被下载器识别到了。

第三步熔丝位配置部分如下,★★注意熔丝位配置好后一定要点写入,检验熔丝位有没有正确写入,可以在点写入之后再点读出,看是否与写入相同!

第四步选择一个bootloader的hex文件,点击<调入FLASH>,我电脑的hex文件所在的目录是C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot

这之后还有关键一步,即设置编程参数!千万不能省,严禁勾选“加密芯片”选项!否则你的芯片可能跪了。这里只勾选三个选项:<校验falsh>,<芯片擦除>,<编程FLASH>,如下图所示。

第五步点击自动,等待程序下载完成,这样我们就完成了bootloader的烧写。此后,拔掉UNO板和下载器相连的6-PIN连接线(不拔线也行),然后用arduino IDE上传BLINK程序看看,应该完全OK。如果arduino IDE报错“avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x10”,我尝试在上一步多勾选一项“编程熔丝”,再在点击“自动”,这之后就arduino IDE再上传BLINK就不报错了。

鸣谢:

1,《使用USBASP给Arduino烧写bootloader教程》,

https://blog.csdn.net/armcsdn/article/details/103682010

2,《解决Win10安装驱动时,INF不包含数字签名信息》,

https://jingyan.baidu.com/article/375c8e19c2b25b25f2a229a3.html

当然,我们也可以只把arduino IDE只当编译器用,固件下载和串口通信都不依靠arduino IDE,就像开发传统mcu那样。欲在Arduino IDE中编译源码得到可烧录hex文件,需要执行如下的步骤:

点击Arduino IDE的菜单<文件>–<首选项>,弹出<首选项>页面:

首先勾选上图画圈位置的默认未勾选项即<显示详细输出:>的<编译>和<上传>,然后点击上图方框的xxx\preference.txt链接,会弹出该preference.txt所在的目录。注意Arduino IDE已经明确告知用户“(只能在 Arduino未运行时进行编辑)”,所以在编辑该preference.txt文件之前请先关闭Arduino IDE,再编辑preference.tx在第一行插入一段文字“build.path=d:\arduino_hex”

上图新增的红框文字“build.path=d:\arduino_hex”,就是这之后每次在Arduino IDE点击编译之后hex文件的输出文件夹,所以用户需要如文字所述新建一个名为“d:\arduino_hex”的文件夹。下图展示了PHY.ino源码经过编译之后,在d:\arduino_hex文件夹中生成的系列可烧录文件,注意除了《PHY.ino.hex》,还有《PHY.ino.with_bootloader.hex》。注意Arduino IDE每次编译,都会先清空d:\arduino_hex文件夹,再创建编译输出文件。

下面用Beyond Compare来对比下两个hex文件,开端处《PHY.ino.hex》比《PHY.ino.with_bootloader.hex》少了一段话“:020000040000FA”,主要区别在后端,疑似《PHY.ino.with_bootloader.hex》多了一截bootloader代码,而且为了配合bootloader的跳转其APP固件数据的结尾7段内容也略有不同。

下面用Beyond Compare来对比下另两个hex文件,《optiboot_atmega328.hex》明显就是《PHY.ino.with_bootloader.hex》中比《PHY.ino.hex》多出来的那截bootloader代码。

所以,用下载bootloader代码的智峰固件下载软件PROGISP,打开我们编译出来的hex文件,再基于USBASP板子,就可以把hex文件的固件数据通过USBASP板子的USB转SPI接口,烧录到ATMega328的FLASH。实践证明,无论是烧录不带bootloader的《PHY.ino.hex》,还是烧录带bootloader的《PHY.ino.with_bootloader.hex》,MCU都能实现源码既定的目标。当然如果烧录的固件是不带bootloader的《PHY.ino.hex》,那么在Arduino IDE里面就无法再上传(通过UART下载)代码到MCU了。

十多年前我曾经编程过Mega88用做ONU光模块的MCU,固件下载是基于CH341A的USB转SPI总线发命令来实现的。PC上位机界面如下红框所示,好久有时间了可以试试自己开发一个USB转SPI主机程序,来替代智峰固件下载软件PROGISP,实现对ATMega328的固件下载。遗憾的是,据ATMEGA328的原厂Microchip公司的本地FAE说,Microchip已经和Arduino解约,不再提供技术支持。所以我获取不到ATMega328的固件下载协议,只有试试原先ATMega88的固件下载源码看得行不了。

另外,Microchip公司的本地FAE还说,只有在+5V供电情况下,给ATMEGA328外置了最高16MHz的晶体,ATMEGA328才能在Arduino IDE中通过UART口下载application固件。如果改用+3.3V供电,主频将降至8MHz(ATMEGA328的时钟源可以是0~20MHz的外置晶体External Crystal Oscillator,熔丝位CKSEL[3…0]=0000b;可以是8MHz的内置的已校准振荡器Internal Calibrated RC Oscillator,熔丝位CKSEL[3…0]=0010b;可以是128KHz的内置的已校准振荡器Internal Calibrated RC Oscillator熔丝位CKSEL[3…0]=0011b)。我还看到有帖子说,如果硬件更改了主频,还需要找到makefile一并更改clock的编译条件,不简单不简单,固件开发是一门永无止境的学问,只求乐在其中,优哉游哉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值