☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
☆                                ☆
☆  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中一个错误。
修改串口号的设定
通过了AVR GCC 4.1.2(WinAVR20070525)版本的测试
 

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为例。如果使用了其它的硬件环境,只需要简单的修改配置参数

使用方法

  1. 建立一个新的项目,并将上面的文件复制到新项目所在的文件夹中;
  2. 添加bootldr.c、bootldr.h、bootcfg.h三个文件到项目中;
  3. 在bootcfg.h中修改配置参数,参数的含义见下面小节;
  4. 设置项目的Flash段地址为Bootloader的起始地址,设置时注意地址是按照字(word)计算的。同时还要设置单片机型号等相关参数(如果使用AVR Studio或KamAVR,可以直接在IDE中设置;否则需要自行修改makefile文件);
  5. 编译项目,产生最终的目标文件;
  6. 使用编程器烧录Bootloader的目标文件到单片机;
  7. 通过设置相应的加密位和熔丝位来选择Boot区大小和使能Boot Reset向量;
  8. 通过串口联机,进行升级测试。

主要参数

下面的参数很重要,请按照用户系统的要求仔细设置:

参数 说明

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=简单的累加和)

BootStart

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格式的用户程序了。
其实本项目中带的专用上位机下载软件也不错的,支持HEX和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.comhttp://shaoziyang.bloger.com.cn 上可以下载到最新版本。一般情况下我也会在OURAVR上提供最新的版本。如果有任何建议,或者上述地址无法访问时,可以发EMail到 shaoziyang@gmail.com
 

特别感谢

在此特别感谢下面这些为此程序做出贡献的人:

刘海涛

在程序编写和调试时提供了很多帮助和资料

tda1552

测试了ATmega32

徐延康

发现HEX文件转换中错误

倪恩伟

提出许多有用的建议

程翔

帮助翻译此文档成英文

以及很多没有留下姓名但提出宝贵建议或进行了测试的网友。

使用许可

本项目基于GPL协议。

 

邵子扬 2007.6 于武汉

 

                        e Y8b    Y8b YV3.08P888 88e                      
                       d8b Y8b    Y8b Y888P 888 888D                     
                      d888b Y8b    Y8b Y8P  888 88"                      
                     d888WuHan8b    Y8b Y   888 b,                       
                    d8888888b Y8b    Y8P    888 88b,                     
        8888 8888       ,e,                                  888         
        8888 888820078e  " Y8b Y888P ,e e, 888,8, dP"Y ,"Y88b888         
        8888 8888888 88b888 Y8b Y8P d88 88b888 " C88b "8" 888888         
        8888 8888888 888888  Y8b "  888   ,888    Y88D,ee 888888         
        'Y88 88P'888 888888   Y8P    "YeeP"888   d,dP "88 888888         
888 88b,                    d8  888                     888              
888 88P' e88 88e  e88 88e  d88  888 e88 88e  ,"Y88b e88 888 ,e e, 888,8,
888 8K  d888 888bd888 8Shaoziyang88d888 888b"8" 888d888 888d88 88b888 "  
888 88b,Y888 888PY888 888P 888  888Y888 888P,ee 888Y888 888888   ,888    
888 88P' "88 88"  "88 88"  888  888 "88 88" "88 888 "88 888 "YeeP"888    
                                                                         
                                                                         
                                                                         
       __                                                                
      / _)                                                               
     /(_)(/                                    __                        
         /                                    (_ |_  _. _  _ o   _.._  _
                                              __)| |(_|(_) /_|\/(_|| |(_|
                                                              /        _|