Loading...

Learning   Examples | Foundations | Hacking | Links

Bootloader开发

Bootloader是什么

关于Bootloader是什么,和我们为什么使用Bootloader,请参考此页

不使用Bootloader

如果你想使用芯片Flash的全部空间,或者想避免Bootloader带来的延迟,则可以使用别的[编程器]来烧写程序。

烧写Bootloader

为了烧写Bootloader,需要购买一个AVR-ISP (在线编程器)、USBtinyISP或做个并口编程器。编程器连至ICSP管脚(2至3脚)----请确保连接正确无误。Arduino板必须由外接电源或USB口供电。

请确保选择了Tools | Board中的正确菜单项,然后直接运行Tools > Burn Bootloader菜单中的对应命令。烧写Bootloader需要花费大约15秒或更长时间,请耐心等待。

为Arduino Mini烧写Bootloader

以下是如何为Mini烧写Bootloader的说明(多谢Gian Pablo Vilamil):

Windows XP下并口编程器仍然无法正常运行。

Windows XP可能会轮询并口从而干扰Bootloader的烧写过程,因此请为注册表添加以下内容:registry patch:

 
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Parport\Parameters]
"DisableWarmPoll"=dword:00000001

See this forum thread for details.

Bootloader的各个版本

Bootloader有各种各样的版本----因为要在各种不同的硬件上运行,也因为本身在不断地升级、变化。

Diecimila和NG(ATmega168)Bootloader的当前版本(如Arduino 0009版自带的)几乎完全相同。以上两者的Bootloader均在19200的波特率下工作,并且占用ATmega168上2K的Flash内存。仅有的区别,就是Bootloader等待新程序到来的时间和开始运行时13脚上LED闪烁的次数。由于Diecimila的自动重启,其Bootloader仅需要等待非常短的时间(少于一秒)----为了节约时间,并且仅闪烁13脚LED一次。NG的Bootloader需要等待6至8秒,并且闪烁3次。

Arduino NG自带的Bootloader有一点点不同。它启用了6脚的内置上拉电阻,而没有启动RX脚的内置上拉电阻。因此,若在重启NG之后,就立即向它发送数据,会导致它无法正常启动板上的程序,也不会因为收到无效数据就超时退出。

Arduino BT的Bootloader会做一些蓝牙模块的初始化工作。

ATmega8的Bootloader仅占用1K的Flash空间。当它收到无效数据时不会超时退出,因此需要确保在Bootloader运行的6至8秒中,不能向它发送数据。

一些早期的Bootloader版本运行在9600波特率下(而不是19200)。为了正常下载程序,需要修改preferences file文件中的serail.download\_rate参数值为9600。

一些第三方团体也在开发 Bootloader,他们的工作请参考[这个链接]

Bootloader运行原理

Arduino IDE菜单里的"Burn Bootloader"命令使用的是一款开源工具----avrdude,共有4步:

  • 1. 解锁芯片上的Bootloader区
  • 2. 设置芯片的熔丝位
  • 3. 下载Bootloader程序到芯片上
  • 4. 锁住芯片上的Bootloader区
这些步骤由Arduino配置文件中的一些设置决定。

ATmega8为例,决定以上步骤的设置是:

  • bootloader.atmega8.programmer (默认: stk500)bootloader使用的协议

  • bootloader.atmega8.unlock_bits (默认: 0xFF) 为解锁Bootloader区而向ATmega8锁位写入的值

  • bootloader.atmega8.high_fuses (默认: 0xca) 写入Atmega8熔丝位中的高位值

  • bootloader.atmega8.low_fuses (默认: 0xdf) 写入Atmega8熔丝位中的低位值

  • bootloader.atmega8.path (默认: bootloader) 包含编译好的bootloader路径(相对于Arduino的安装目录)

  • bootloader.atmega8.file (默认: ATmegaBOOT.hex) 编译好的Bootloader文件名(在bootloader.path目录里)

  • bootloader.atmega8.lock_bits (默认: 0x0F) 锁住Bootloader区时向Arduino锁位写的值(这样Bootloader才不会被新上传的程序覆盖)

ATmega168为例,决定以上步骤的设置是(<BOARD> 表示"diecimila" 或"ng"):

  • bootloader.atmega168-<BOARD>.programmer (默认: avrispmkii)bootloader使用的协议

  • bootloader.atmega168-<BOARD>.unlock_bits (默认: 0x3F) 为解锁Bootloader区而向ATmega168锁位写入的值

  • bootloader.atmega168-<BOARD>.extended_fuses (默认: 0x00) 写入Atmega168熔丝位中的高位值

  • bootloader.atmega168-<BOARD>.high_fuses (默认: 0xdd) 写入Atmega168熔丝位中的高位值

  • bootloader.atmega168-<BOARD>.low_fuses (默认: 0xff) 写入Atmega168熔丝位中的低位值

  • bootloader.atmega168-<BOARD>.path (默认: bootloader168) 包含编译好的bootloader路径(相对于Arduino的安装目录)

  • bootloader.atmega168-<BOARD>.file (默认:ATmegaBOOT_168_<BOARD>.hex)编译好的Bootloader文件名(在bootloader.path目录里)

  • bootloader.atmega168-<BOARD>.lock_bits (默认: 0x0F) 锁住Bootloader区时向Arduino锁位写的值(这样Bootloader才不会被新上传的程序覆盖)

源代码

从此处访问Bootloader源代码