重编译Arduino的bootloader

2013-11-262.9万
AI 快速预览详细 收起
本文介绍了如何将Arduino UNO的Bootloader从16MHz修改为8MHz。首先,修改boards.txt文件,添加新的UNO@8MHz配置。然后,在Makefile中设置相应的参数,确保频率一致。使用Arduino自带工具链编译Makefile,生成optiboot_atmega328_8Mhz.hex文件。通过这些步骤,可以顺利完成频率切换,适用于需要低功耗项目的用户。
Arduino是开源的,其所支持的Bootloader可以根据需要修改、编译并在ArduinoIDE中使用。下面将官方16MHz时钟的UNO(定义为UNO@16M)修改为8MHz的UNO(定义为UNO@8M)为例进行说明:

1、 修改boards.txt
1)在Arduino安装目录下Arduino\hardware\arduino\boards.txt
boards.txt 的说明请 See:http://code.google.com/p/arduino/wiki/Platforms。将uno 一段复制一份后进行如下修改,红色部分为修改内容,修改好后保存(注意安装目录是否有写权限):
##############################################################
uno@8MHz.name=Arduino Uno@8MHz
uno@8MHz.upload.protocol=arduino
uno@8MHz.upload.maximum_size=32256      # = total flash size - AVR Bootloaderarea size(bytes);  AVR Bootloader areasize is defined by FUSE.
uno@8MHz.upload.speed=115200             # the speed is same as the one of bootloader or makefile
uno@8MHz.bootloader.low_fuses=0xff
uno@8MHz.bootloader.high_fuses=0xde
uno@8MHz.bootloader.extended_fuses=0x05
uno@8MHz.bootloader.path=optiboot
uno@8MHz.bootloader.file=optiboot_atmega328_8MHz.hex  # modify: use the new bootloader name
uno@8MHz.bootloader.unlock_bits=0x3F
uno@8MHz.bootloader.lock_bits=0x0F
uno@8MHz.build.mcu=atmega328p         
uno@8MHz.build.f_cpu=8000000L             # modify: It is define the F_CPUwhen compile your sketch
uno@8MHz.build.core=arduino
uno@8MHz.build.variant=standard


2、 编译Bootloader
Arduino官方Bootloader在Arduino的安装目录下,其相对路径是:Arduino\hardware\arduino\bootloaders,其下有若干子目录。[url=mailto:%E5%9C%A8board.txt%E4%B8%AD%E6%89%BE%E5%88%B0uno@8MHz.bootloader.path%3Doptiboot]在board.txt中找到uno@8MHz.bootloader.path=optiboot[/url],则UNO使用的是optiboot子目录下的bootloader,其源程序和makefile也在该目录下。
在board.txt中找到找到uno.bootloader.file=optiboot_atmega328.hex。打开Makefile文件并查找前述红色部分“atmega328:”。将以“atmega328:”所有行复制一份,进行如下修改(红色为修改后的新内容,注意频率和文件名要与board.txt相应内容要保持一致):
#atmega328 @ 8Mhz
atmega328_8Mhz: TARGET = atmega328
atmega328_8Mhz: MCU_TARGET = atmega328p
atmega328_8Mhz: CFLAGS += '-DLED_START_FLASHES=3''-DBAUD_RATE=115200'
atmega328_8Mhz: AVR_FREQ = 8000000L
atmega328_8Mhz: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328_8Mhz: $(PROGRAM)_atmega328_8Mhz.hex
atmega328_8Mhz: $(PROGRAM)_atmega328_8Mhz.lst
保存makefile后,使用make进行编译,这里需要注意的是,你的机器上的可能有多种工具链,建议使用Arduino自带的工具链,这样一般可以保证编译后HEX文件保持和原来的一致,避免用新的编译器导致编译的HEX文件超出FUSE定义的Bootloader空间。  下面以windows为例进行说明:
1)在Makefile找到如下一段,并按你的系统进行设置,以下以windows为例,并建议使用arduino的环境,
# The defaultbehavior is to build using tools that are in the users
# current pathvariables, but we can also build using an installed
# Arduino user IDEsetup, or the Arduino source tree.
# Uncomment thisnext lines to build within the arduino environment,
# using thearduino-included avrgcc toolset (mac and pc)
ENV = arduino
# ENV ?= arduinodev
# OS ?= macosx
OS = windows
2)在optiboot路径的命令行下执行
..\..\..\tools\avr\utils\bin\make atmega328_8MHz
3)编译成功则会在该目录下生成optiboot_atmega328_8Mhz.hex


注:
1)optboot下的说明和makefile是写的很完善和详细的,其它的bootloader目录下可能比较简单,可以参考optboot目录下的README.txt和makefile文件来理解。 工具链的选择在windows也可以在系统环境变量中定义,也可以在makefile中写入相对路径。
2)若编译bootloader超过了熔丝位的bootloader区域限制,则两种措施解决:一是使用原bootloader编译时使用的工具链版本;二是修改makefile中bootloader中的起始地址和board.txt中相应的FUZE位、upload.maximum_size。


3、 下载Bootloader
重新打开Arduino IDE,在tools->board中多了一个“Arduino Uno_8MHz”的单板,可以使用该单板类型烧写bootloader和编译下载程序。
重编译Arduino的bootloader图1



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
wangwei8888168
wangwei8888168
编译Bootloader里面不会啊。
【2)在optiboot路径的命令行下执行..\..\..\tools\avr\utils\bin\make atmega328_8MHz】这句看不懂!请教:handshake
微笑的rockets
微笑的rockets
好高深的样子。
- 没有更多了 -