第三十三课--Microduino制作烧写器/zh

来自Microduino Wikipedia
Bdharduino@126.com讨论 | 贡献2014年10月25日 (六) 15:09的版本
跳转至: 导航搜索

用Microduino制作烧写器

目的

本教程讲解了Microduino-Core作为烧写器的软硬件环境,实现了AVR烧写器的功能(烧写app区,烧写bootloader区,烧写熔丝等),同时介绍了AVRDUDE烧写工具、Intel 的.hex文件的组成结构。

设备

Microduino-Core 是以 Atmel ATmega328P为核心的8位单片机开发核心板,是一个开源的、与 Arduino UNO 兼容的控制器模块。

下载程序模块,可直接与 Microduino-Core 或者Microduino-Core+ 相连,让他们与计算机通讯。它的下载接口用的是MicUSB,这也是Microduino小巧的一部分。Microduino大小与一枚一元硬币差不多大。下载线与绝大多数智能手机usb数据线是一样的,方便实用。

  • 其他硬件设备
相关硬件 数量 功能
10uf 16V电容 1个 连接于Microduino-Core 的RESET与GND。
UNO板 1个 模拟被烧写芯片,另一片Microduino-Core也可以。
USB数据连接线 1条 连通Microduino模块与计算机。
面包板 1块 各个元器件汇聚于此。
面包板跳线 1盒 电气连接线。


实验原理图

Microduino (烧写器) Uno兼容板(被烧写板) D13 D13 D12 D12 D11 D11 D10 Reset 5V 5V GND GND Reset接10uf 电容到GND 接线就是这样的。这与Arduino官网提到的把Arduino 作为avr ISP 烧写器是一样的。 链接:http://arduino.cc/en/Tutorial/ArduinoISP

实验准备

在按照实验原理图接线前,首先把Microduino-Core与Micoduino-USBTTL叠加,再把Microduino-Core烧入ArduinoISP的程序,这个很轻松吧。打开Arudino程序的File—Examples--ArduinoISP 见下图:

烧写完该程序后,Microduino-Core已经具备了作为烧录器的硬件能力。作为烧写器的Microduino-Core在烧写过程中自然不应该有重启动作,所以用到了一个10uF电容。好,按照实验原理图接好线。 实物见下图:

相关实验

  • 按照官网的说法来实现。

选择Tools—Programmer—ArduinoISP,这是在选择编程器。然后再点击Tools—Burn Bootloader。这时可以看到uno兼容板13脚的led闪烁,证明开始烧写了。uno的13脚与Microduino-Core 的13脚连在一起,所以uno上的小灯会闪烁。为什么arduino’板会选择13脚放led呢,可能是因为它的英文是SCK,也就是说烧写时钟到来时,它可兼作指示。只是我们用bootloader引导串口烧写时,它失去了闪烁的机会。

烧写成功图如下:

烧写成功后,被烧写的uno板的bootloader区已经有了opti-boot代码。当我们点击uno的reset按键时,13脚的小灯会闪几下,这时的小灯闪烁是因为uno的bootloader开始工作了。

  • 瞒天过海,用ArduinoIDE烧写bootloader时顺便把app区的程序也烧写了。

当我们点下Tools—Burn Bootloader时,ArduinoIDE程序其实是把D:\Program Files\Arduino\hardware\arduino\bootloaders\optiboot目录下的optiboot_atmega328.hex作为烧写源文件的(根据安装目录不同,会有不同位置,Arduino官网提供的无需安装版里也可以方便找到hardware文件夹)。我们把optiboot_atmega328.hex稍改下名字再烧录,ArduinoIDE会提示avrdude: read from file 'D:\Program Files\Arduino\hardware\arduino\bootloaders\optiboot\optiboot_atmega328.hex' failed 是说找不到文件了。

见下图:

下面我们在这个文件上作些文章。 首先,我们打开ArduinoIDE的Blink程序,然后找到Blink程序生成的hex文件。如何找到该hex文件呢?只需在ArduinoIDE上点击 ,或是快捷键ctrl+R,编译程序,不上载。这时在状态提示栏的倒数第二行便会有它的目录了。如下图。ctrl+C,找到该文件。如果你的ArduinoIDE没有显示这行文字,需要点击File—Preference—compilation复选框。用记事本或是其它文本编辑器打开该hex文件,把它的内容复制到剪贴板。然后再粘贴到D:\Program Files\Arduino\hardware\arduino\bootloaders\optiboot\optiboot_atmega328.hex这个文件的最上边(optiboot_atmega328.hex可以作个备份,为了以后恢复)。如下图,笔者是用notpad打开,记事本也可以的。

删除下图选中的这一行

OK,保存文件。再回到ArduinoISP的程序界面,点击Tools—Burn Bootloader,烧写完成后看到了什么?是的,13脚的led开始blink了,点击uno的Reset,led先是执行bootloader的闪烁,然后开始无休止的执行blink。这说明了我们的uno中既烧入了opti的bootloader,也烧入了app区的blink程序。一次完成,这样实际量产时,会给生产带来方便。

下面介绍下.hex文件的组成,我们以optibootloader的第一行为例。:107E0000112484B714BE81FFF0D085E080938100F7。“:”的概念我们不去管它,“10”代表了该行的有效字节数为16,16进制嘛,10代表16。然后是“7E00”代表了328芯片Flash的地址位置,为什么是7E00,因为opti的bootloader有512个Byte(256Word),用32768(328的总Flash空间)减去512,得到的16进制数就是7E00,熔丝位烧写合适,复位向量就会直接跳到这里来的啊。后面的“00”,我们不去管它。然后是“112484B714BE81FFF0D085E080938100”共16个字节,对了,就是开头的“10”表征的这16个字节。最后一个字节是“F7”,和校验字节。校验的是“107E0000112484B714BE81FFF0D085E080938100”这一代堆数,什么是和校验?0X01的和校验字节就是FF,0X02的和校验字节就是FE,也就是总数加起来必须是256的整数倍。下面一个小软件可以获取和校验字节。供参考。上文删除的那一行“00000001FF”文字表明.hex文件的结束,如果不删这一行,两个hex文件揉在一起,后面的.hex文件不会被执行到。

更多更详细的hex文件描述可参考https://en.wikipedia.org/wiki/Intel_HEX 嗯,.hex文件介绍就写这么多吧。ArduinoIDE中File—Upload Using Programmer。单击它烧写blink程序后,bootloader就丢失了,读者熟悉了.hex文件之后,也就能知道个中缘由了。

  • 脱离ArduinoIDE环境,直接寻求avrdude烧写。

ArduinoIDE烧写程序从本质上说也是调用的avrdude烧写软件。Avrdude 链接:文件:AVRDUDE.rar,Avrdude GUI 链接: 文件:AVRdude GUI.rar 。 Avrdude是直接使用命令行操作的软件,Avrdude GUI化命令行为UI界面。 下面以Avrdude.exe文件在D盘根目录下为例。Windows开始菜单—运行—cmd—回车—d:--回车—dir—回车—avrdude---回车 可见下图。

输入avrdude -p m328p -c stk500v1 -b 19200 -P com2 -U flash:w:d:\a.hex:i 后回车,接下来就是见证奇迹的时刻。看到一大堆#号(下图),然后再看13脚的led狂闪,事情成了,Flash写入了d:\a.hex文件,该文件读者可从前文提到的揉在一起的(含app,bootloader).hex文件复制更名得到。Com口依据读者电脑更改,如果电脑的com口编号大,要改为小编号。笔者就因为Microduino-USBTTL被识别成com15耗进去几个小时,在设备管理器中更改即可。Avrdude更多命令行的学习请参考http://www.ladyada.net/learn/avr/avrdude.html。

下面介绍下Avrdude GUI。按下图选择

-b 19200是必须要输入的。点击 看看效果吧。由图可以看出,熔丝位、锁定位、eeprom、Flash都由你掌控。自然,用命令行的方式也都可以实现。 这时,我们实现的功能已不仅仅是ArduinoIDE提供的烧写bootloader功能,我们借助ArduinoISP,avrdude GUI ,可以实现avr编程器能够实现的功能。用Microduino-Core 与Microduino-USBTTL实实在在打造出了AVRISP。

  • 扩展实验:用淘宝上常见的USBasp与USBtinyISP烧写器6Pin或10Pin ISP接口直接接到uno。

实物见下图:

用USBasp+avrdude(或avrdude GUI)可以实现读取烧写等。 用USBasp+ArduinoIDE不能实现,ArduinoIDE环境不能识别淘宝20元左右的USBasp。 用USBasp+progisp可以实现读取烧写等。

USBtinyISP极客工坊有售。 USBtiny+ avrdude(或avrdude GUI)可以实现读取烧写等。 USBtiny+ArduinoIDE可以实现在ArduinoIDE环境中使用Burn bootloader或是Upload Using Programmer。

并且在avrdude命令行模式下,两款avr编程器均不需要输入-b 19200。在avrdude GUI中也无需输入 。

结果

用Microduino-Core 与Microduino USBTTL实现了AVR通用编程器的功能,不管hex文件来自iccavr或是iar for avr抑或是atmel studio,都可以通过记事本把bootloader代码叠加进去,也不论芯片是88,168还是328,本文提到的Microduino烧写器(STK500v1协议)都可以帮你实现读取烧写。本文参考了阿古作坊里的文章,http://aguegu.net/?p=1507 感谢阿古。

视频