为ATmega328P刷bootloader的三种方法比较

  • 内容
  • ....
  • 相关

RX5808分集接收机制作 的文章中,我参考开源的资料制作了RX5808分集接收机电路板,另外使用USP-ISP编程器通过Arduino IDE给电路板了写程序,详见使用USB-ISP编程器向Mega328p写程序,在实际使用中发现这种写程序的方式存在一些不足,这种方式在擦除Atmega328P的FLASH和EEPROM时感觉不彻底,同时不能修改熔丝位,会导致代码实际运行效率变低,在RX5808分集接收机上反应为菜单的响应时间过长,操作不灵敏。因此催生了今天这篇文章。

使用USBtinyISP编程器通过Arduino IDE写程序

 USBtinyISP编程器接口定义
USBtinyISP编程器接口定义

使用USP-ISP编程器向Mega328p写程序 文中,我用 USBtinyISP 编程器直接通过Arduino IDE写程序 ,这样的好处是便捷,同时可以随时通过IDE对程序进行调整操作比较直观,但奇怪的是程序写入328P后,RX5808分集接收机的菜单响应时间很长,操作起来非常不便,开始以为是源代码延迟时间设置的问题,多次调整收效甚微,于是开始尝试其它的写程序的方式。

AVR USB编程器通过 progisp 写程序

USB ASP编程器
AVR USB编程器

使用AVR USB编程器向ATmega 328P写程序步骤如下:

AVR USB编程器向ATmega 328P写程序
AVR USB编程器向ATmega 328P写程序

progisp程序有一个特点,当AVR USB编程器未连接或连接不成功时,它的“PRG ISP”图标是灰色的,连接成功后它是彩色的,如上图黑色向右箭头所指方向。 AVR USB编程器写程序的步骤,首先在PROGISP程序打开后,在上图1所示位置选择目标芯片,然后点击上图2所示的“RD”按钮测试芯片读取是否成功,状态栏会显示芯片连接状态;然后在上图3所示位置点击进入熔丝位编辑窗口:

Atmega328P熔丝位
Atmega328P熔丝位

根据芯片型号编辑熔丝位;接着在上一张图的4的位置导入HEX文件;最后点击“自动”按钮将程序写入芯片。注意图中的勾选项“芯片擦除”、“编程FLASH”、“编程熔丝”等选项要勾选,否则代码运行效率和“使用USBtinyISP编程器直接通过Arduino IDE写程序”效率一样。

AVR USB编程器的接口定义可查阅:如何制作自己的Arduino开发板ASP编程器与ATtinyX5系列微控制器如何连接 等文章。

使用USBtinyISP编程器通过AVRDUDESS写程序

Avrdudess 是一款类似于Avrdude-GUI的AVR系列单片机下载与烧录工具

USBtinyISP编程器通过AVRDUDESS写程序
USBtinyISP编程器通过AVRDUDESS写程序

本着不断折腾的原则,本次在尝试使用USBtinyISP编程器通过AVRDUDESS向ATmega328P写程序。AVRDUDESS可通过网络下载绿色版的即可。连接USBtinyISP编程器,打开AVRDUDESS软件,如上图选择“USBtiny simple USB programmer,…..”,MCU选择“ATmega328P”,然后点击“自动侦测”,在上图黑色状态框会显示“侦测到 1e950f = ATmega328P”表示编程器与芯片连接成功。然后和AVR USB编程器一样我们也需要设置熔丝位和一些选项。熔丝位设置点击右侧“手动熔丝选择器”弹出窗口如下,可手动设置熔丝位:

 ATmega328P 熔丝位设置
ATmega328P 熔丝位设置

确定后回到主界面,按下图再次确认设置项

AVRDUDESS为ATmega328P写bootloader
AVRDUDESS为ATmega328P写bootloader

通过“Flash”地址栏后“…”按钮选择需要写入的HEX文件,点击“开始编程”,状态栏会对应给出写入状态指示,待完成后写入完成。测试过程中发现,如果不选择“擦除flash和EEPROM”,代码运行效率与直接通过Arduino IDE通过编程器写的方式一致,慢就一个字!

三种编程方式的比较

细心地朋友会发现后两种方式写入的文件是HEX文件,它可以通过Arduino IDE 的菜单“项目”–“导出已编译的二进制文件”的方式得到。曾经怀疑代码的运行效率是否与写入文件格式有关,仔细分析后我认为不管哪种方式写程序写入芯片的都只会是二进制文件,只是通过 Arduino IDE 编程器写入的方式文件转换的过程不可见而已。

因此,正如前面反复提到的,在三种给328P写程序的方式中,直接通过Arduino IDE写程序,无法判断写程序过程中是否对芯片的Flash和EEPROM进行了完全的擦除。后面通过PROGISP和AVRDUDESS写程序的两种方式差异不大,仅是程序设置界面的差异,两种方式如不选择 “擦除flash和EEPROM” ,代码的运行效率与第一种通过Arduino IDE写程序的效率一致。据此判断它是导致代码写入后运行效率不高的主要原因。

专题:制作RX5808双接收机