☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆ ☆
☆ AVR 通用 Bootloader 使用说明 ☆
☆ AVR Universal Bootloader ☆
☆ ☆
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
基本介绍
主要特点
程序版本
开发环境
项目文件
使用方法
主要参数
支持型号
常见问题
特别感谢
使用许可
这个程序的主要目的是为了提供一个具有通用性的 AVR Bootloader,不同型号的AVR单片机只需要修改一下几个简单的配置参数就可以直接使用了,不需要再修改主程序。因为现在网上流传的很多 Bootloader程序都是针对某个或几个特定型号的,在换用其它型号后,需要对程序进行较多的修改;而且很多Bootloader程序虽然实现了基本功能,但是存在着一些缺陷或隐患,或者使用起来不够方便,所以我写了这个程序。它是在网上流传的马潮老师的ATmega128 Bootloader程序的基础上,结合了我以前在PIC18单片机中使用Bootloader的一点经验,以及学习自AVR USB中一些使用宏定义的技巧,再经过多次优化和反复测试后得出的。
这个通用的Bootloader可以支持大部分具有自编程功能、带有Boot区和UART串口的AVR单片机(主要是Mega系列)。如果是多串口的单片机,可以任意选择使用其中的一个串口。程序支持RS232/RS485/RS422方式,如果程序稍加修改,也应当可以很容易的支持USI、SPI、I2C等接口。
整个Bootloader最大占用不到1K Word的空间。在最小情况下,占用的空间不到300 Word(具体占用空间的大小与单片机的型号、配置的参数、功能裁剪的多少以及程序的优化等级有关)。
v3.1 | 2007.Sep |
根据Douglas Hammond的建议,调整了串口初始化中寄存器的顺序(据说在M32上存在初始化的问题,因为我没有M32所以没有测试过,但是有其他网友以前报告没有问题) |
v3.0 |
2007.Jun |
修正了ATmega162中一个错误。 |
v2.0 |
2007.Apr.10 |
增加Flash写入校验功能,极大的提高了Bootloader的可靠性。 |
v1.2 | 2007.Apr.02 |
修正了串口寄存器计算中的一个隐含错误(这个错误很常见,包括在很多书中和网上的程序中都能见到),造成部分波特率的计算会出错。 |
v1.0 |
2007.Mar.22 |
第一版,实现全部基本功能,并扩展了XModem协议以适合不同的应用(可变缓冲区长度和多种校验方式)。 |
本项目的开发环境是:WinAVR + AVR Studio
WinAVR版本: 20070025
AVR Studio版本: 4.13.528
本项目通过了WinAVR的多个版本的测试,但是早期的版本在编译某些型号的单片机中存在一些Bug。
本项目中所有文件都以AVR Studio作为IDE进行调试,可以使用JTAG mk-II仿真器或其他仿真工具进行调试。使用AVR Studio的好处是可以不用手工修改makefile文件,不容易出错,降低了初学者上手的难度。当然也可以使用其他工具软件,如KamAVR、AtmanAVR、PN等代替AVR Studio进行开发。
整个Bootloader主要由以下几个文件组成:
bootldr.c 主程序
bootldr.h 主程序的头文件
bootcfg.h 主程序的用户配置文件
bootldr.aps 主程序的AVR Studio的项目文件
test.c 串口通信的测试程序
testcfg.h test.c的配置文件
test.aps test的项目文件
readme.txt 本说明文件
readme.htm 本说明文件的HTML版本
因为很多人都有AVR Butterfly试验板,所以这里的项目文件都以AVR Butterfly为例。如果使用了其它的硬件环境,只需要简单的修改配置参数。
下面的参数很重要,请按照用户系统的要求仔细设置:
参数 | 说明 |
BUFFERSIZE |
串口缓冲区大小,使用超级终端时必须等于128。这个参数应当是单片机页面大小SPM_PAGESIZE的倍数或约数 |
F_CPU |
系统时钟频率(Hz) |
BAUDRATE |
串口通信使用的波特率(bps) |
LEVELMODE |
Bootloader触发模式(0=串口 1=电平) |
timeclk |
基本时间间隔(ms) |
TimeOutCnt |
Bootloader启动超时计数(<=255) |
TimeOutCntC |
等待接收文件的超时计数(<=255) |
CONNECTCNT |
联机密码长度 |
KEY |
联机密码,任意16进制或字符串 |
COMPORTNo |
串口号,多串口的单片机是串口号(0/1/2...),单串口的单片机一般是空,也有的需要设置为0(特别是新的型号,如ATmega168) |
WDGEn |
使能看门狗 |
RS485 |
使能RS485/RS422 |
RS485PORT |
RS485/RS422发送的控制端口(A/B/C/D...) |
RS485TXEn |
RS485/RS422发送控制的引脚(PC0/PC1/PC2...) |
LEDEn |
LED状态指示使能 |
LEDPORT |
LED使用的端口 |
LEDPORTNo |
LED使用的引脚 |
InitDelay |
额外的延时(某些型号的单片机需要,如ATmega8) |
VERBOSE |
提示模式,显示更多的提示信息,方便超级终端下的交互输入 |
CRCMODE |
通信校验模式(0=XMODEM的CRC校验 1=简单的累加和) |
Boot区起始地址: 按字节计算 |
|
ChipCheck |
校验写入的数据。这个参数必须和BootStart联合使用 |
AVR通用Bootloader已经在多种型号的AVR单片机中测试通过,下面是我测试过的型号:
ATmega8
ATmeag64
ATmega128
ATmega168
ATmega169(Bufferfly)
下面是其他网友测试过的型号:
ATmega16
ATmega32
ATmega162
如果你成功使用了不在上面列表中型号,请给我发EMail,以便及时添加到列表中。
1. |
问: |
怎样保护Bootloader区? |
答: |
为了保护Bootloader区本身不被意外改写,需要设置Bootloader区的保护。通常是将BLB1锁定位设置成模2或3,禁止对Bootloader区写操作。此外设置BootStart也可以保护Bootloader区,超过BootStart的数据将被Bootloader所忽略,不会写入到Flash中。 |
|
2. |
问: |
为什么需要在bootloader中使用看门狗? |
答: |
为了增加系统的稳定性,通常应当允许看门狗,这样在意外情况下可以由看门狗将系统复位,防止在升级过程中进入死循环。 |
|
3. |
问: |
是否支持使用超级终端作为上位机软件进行升级? |
答: |
这个程序支持使用超级终端作为上位机软件进行下载。如果使用超级终端下载,那么串口缓冲区的大小必须定义为128,同时要将等待密码和等待文件的超时时间设置大一些(TimeOutCnt/TimeOutCntC和timeclk的乘积),避免来不及输入而超时造成不能进入Bootloader模式;否则可以设置小一些,缩短启动带来的延时。使用超级终端时,注意密码不要设置得太长,一般以1-3个字符为好,不然很难输入成功。此外校验方式CRCMODE需要设置为0,下载前还需要将用户的HEX目标文件转换为BIN格式。下载时,在超级终端中输入联机密码后,在发送文件时选择标准XMODEM协议就可以下载BIN格式的用户程序了。 |
|
4. |
问: |
怎样判断串口通信是否正常(硬件连接是否正常)? |
答: |
示例程序test.c可以用于测试系统的串口通信是否正常。程序运行时不断向串口发送数据(默认是一个">"),同时检测串口是否收到数据。如果接收到数据,就将发送的数据改为新收到的数据。可以用超级终端联机调试。如果在调试Bootloader遇到问题,无法通信时可以先试试这个程序是否可以正常运行。如果test可以正常运行,那么一般就没有太大的问题了。 |
|
5. |
问: |
为什么升级完后不能跳转到用户程序? |
答: |
如果不能正确跳转到用户程序,一般有两种情况:一是使用的GCC编译器存在bug,造成某些型号的单片机不能正确跳转。可以尝试升级GCC到新版本,也可以查看反汇编代码进行分析(在AVR Studio的仿真模式下查看Disassemble,软件仿真或硬件仿真模式都可以)。再就是某些型号的AVR单片机需要设置特定熔丝位。有的时候,因为使用的编程器的问题造成没有正确设置熔丝位,造成无法跳转到用户程序。 |
|
6. | 问: |
怎样裁剪掉不用的功能? |
答: |
在bootcfg.h文件中有很多宏定义,将宏设置为0,或者设置为空就可以将其对应的功能裁剪。比如不使用LED指示状态的功能,可以将宏LEDEn设置为0。 |
|
7. |
问: |
怎样减少Bootloader代码的大小,留出更多空间给用户程序? |
答: |
可以裁减掉不必要的功能,如冗余的提示信息、LED状态指示、将CRC校验改为累加和校验等。还可以打开程序的优化选项,选择代码大小优化。不同版本的GCC之间的优化效果是不同的。此外C语言优化时具有一定的不确定性,选用代码大小优化得到的最终代码有时并不是最小的。 |
|
8. |
问: |
是否可以支持其它C编译器? |
答: |
本项目使用了WinAVR带有的GCC编译器,其它编译器目前没有试验过。IAR C编译器和GCC最为接近,我想只要做很小的修改就可以了(AVR USB就是可以同时GCC和IAR C编译器);其它编译器应当也可以,因为我在编写代码时,是尽量按照ANSI C的规范编写。可能需要修改的地方应该在头文件部分,以及一些寄存器的名称上。不同的C编译器在声明同样的寄存器或参数时存在一些差异。 |
|
9. |
问: |
在什么地方可以下载本程序的最新版本? |
答: |
在 http://shaoziyang.googlepages.com 或 http://shaoziyang.bloger.com.cn 上可以下载到最新版本。一般情况下我也会在OURAVR上提供最新的版本。如果有任何建议,或者上述地址无法访问时,可以发EMail到 shaoziyang@gmail.com。 |
在此特别感谢下面这些为此程序做出贡献的人:
刘海涛 |
在程序编写和调试时提供了很多帮助和资料 |
tda1552 |
测试了ATmega32 |
徐延康 |
发现HEX文件转换中错误 |
倪恩伟 |
提出许多有用的建议 |
程翔 |
帮助翻译此文档成英文 |
以及很多没有留下姓名但提出宝贵建议或进行了测试的网友。
本项目基于GPL协议。
邵子扬 2007.6 于武汉
e Y8b Y8b YV3.08P888 88e |