AVR BOOTLOADER 实例开发笔记

2020-04-28来源: eefocus关键字:AVR  BOOTLOADER  Atmega8

写了一个基于Atmega8 的Bootloader应用实例,其间遇到了一些问题,下面把过程和问题叙述如下,供朋友们参考。工程实例的代码在http://download.csdn.net/detail/knowmuch/7712209,也包含了一个C#的配套烧录程序,欢迎有兴趣的朋友们下载。


1、准备一个目标程序(被加载的应用程序),一般环境编译生成的结果是Hex文件,而写进Flash的是Bin文件。二者转换其实很简单,去掉Hex中的类型、长度、校验等,只留下数据依次排列就好了。


a)Hex文件格式:以ASCII格式记录,“:”表示一行开始,第1、2个字符表示此行数据长度。第3-6字符表示数据存储的起始地址,第7、8字符表示类型,“00”数据记录、“01”文件结束、“02”扩展段地址、“04”扩展线性地址,其他格式这里不涉及,不作详述。第9字符开始为数据。最后两个字符是效验码(与前面的值相加为0)。比如说,每个文件的最后一行肯定是:00 0000 01 FF。


b)Bin文件格式:没有其他信息,只有要烧录的命令与操作数。


c)先写一个很小的闪灯程序,编译出Hex,再把Bin提取出来。


d)目标程序大小不要超过RWW区大小,BootLoad程序不要超过NRWW区大小。呵呵,废话,这是自然啦。


2、程序代码定位,Bootloader程序是运行在NRWW区(也就是BootLoader区)的,这个区的大小和首地址通过熔丝设置(别忘了把复位指针也定向到NRWW区开始)。设置后,要把Bootloader程序的开始也定位到那里。


a)在avrstudio项目设置的Memory setting中添加一个段(段名记住要加个点在前面)。地址是bootloader首地址的一半(这是由于计算单位不同,一个是字节、一个是字)。也可以用保留段名“.text”,这样所有的内容都将默认到text段去。


b)代码地址指定:在函数声明之前加一个宏指令,比如:

__attribute__((section(".BootLoad")))void ABCfuntion(void){……}。


3、BootLoader程序本身倒比较简单,就是通过数据接口(一般是串口,其实也可以是其它接口,比如有些AVRUSB系统)把bin文件传进来,再用SPM指令把数据写进FLASH中,最后跳转到应用程序开始的地址去执行就行了。我在网上看到的示例都实现了Xmodem传输控制,这样的目的一是保证数据无误,二是不用开发烧录软件。其实烧录软件也很简单的,校验也可以用其它方式(比如回传)实现。为了更好的说明BootLoader机制本身,这里没有进行校验,传输控制也很简单,就是一问一答式的一页一页(Atmega8是64字节)传。实验证明这样的差错率实际上也很小,不过这和你的接口电路等等也有关系。


4、FLASH的操作,WinAvr提供了一组宏,在boot.h文件中。这组宏其实是将内联汇编嵌入到代码中。比如说下面就是向Flash中写入一页数据的宏定义,仔细看看也挺好理解的(内联汇编的问题,这里暂不涉及,有兴趣可以参考一下WinAVRdocavr-libcavr-libc-user-manual目录下的inline_asm.html.html):

5、数据写入Flash的过程就是上述宏的一系列调用,这些宏的名称很直观。当然也可以自己用汇编来实现咯,有兴趣的话:


a)把要写的页擦干净。使用boot_page_erase.


b)把这一页的数据写入缓冲区,使用boot_page_fill,注意一次是写一个字。


c)写满缓冲区后,使用boot_page_write,就可以将数据写入Flash了。


d)操作过程中,要确保操作完成在进行下面的操作,使用boot_spm_busy_wait。


e)下面是写一页的代码。

6、关于中断,当我们把Reset向量熔丝位设置到BootLoader时,其实所有的中断向量都被设置到了BootLoader开始,要在应用程序中正常使用中断,就必须在跳转到应用程序之前把IVSEL位设置为0。


不同的型号这一位在不同的寄存器,查下手册就知道了。AVR对于一些关键的位有种保护机制,就是写这一位之前,必须先写修改使能位(对于IVSEL来说是IVCE)。写的时序是先给使能位写1,在随后的4个时钟周期内写目标位,同时使能位要写0。过了4个周期,使能位会自动置零,再写就没用了。


这和有些共用地址的寄存器选择位(比如Atmega8的UCSRC、UBRRH的URSEL位)看起来有点像,但实际上是两码事。还是要仔细看看手册。


7、最后是跳转到目标程序的开头,Atmega8的指令集中没有jmp(绝对跳转)指令,所以使用相对跳转。

8、上面的工作完成后,按说就可以了,如果你没有遇到下面的问题,就可以不看了,因为我感觉这个问题并不典型。


a)突然发现有一些程序在烧录后不能正常执行,只会一直执行bootloader区,重新上电也不行。比较了烧录后的程序,完全与目标程序一致。后来发现改变某些熔丝位后可以正常执行,比如将boot指针改为0x0000后再改回BootLoader首部,程序就一直正常了。但再次烧录就又不行了。


c)把烧录函数中的操作一个个注掉,然后手工合成了同时包含目标程序(因为注掉烧录函数的一些操作后就不能正常烧录目标程序了)和bootloader程序的hex文件,最后发现是boot_page_write的原因。因为把它注掉后,即使执行了其它操作,也不会有问题。


d)分析了一下,应该是写Flash时改变了一些东西,没有改回来的,而熔丝位的改变可以将它改回来。


e)最后发现与加密位有关,在写了flash后,不论加密位是什么内容,也不论往里写什么内容(当然得保证执行时CPU起码可以读取应用程序代码),只要执行一下boot_lock_bits_set,都能解决这个问题。

关键字:AVR  BOOTLOADER  Atmega8 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic495780.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:avr bootloader学习
下一篇: Microchip推出全新功能安全型AVR® DA系列单片机

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

[AVR]高压并行编程---基础知识
手一抖就锁了好几片Mega16,这可是几十块钱啊...有必要造一个高压并行编程器了一、接线方式及端口定义RDY/BSY 判忙标志位。(0:设备正忙 1:等待新的命令)OE 输出使能位 低电平有效WR 写脉冲 低电平有效BS[2:1] 字节选择1(0:选择低位字节 1:选择高位字节)XA[1:0] XTAL动作位00加载Flash或者EEPROM地址01加载数据10加载命令11保留PAGEL 加载程序存储器和EEPROM数据页DATA 双向数据/命令口0x80 芯片擦除0x40 写熔丝位0x20 写锁定位0x10 写FLASH0x11 写EEPROM0x08 读标示字节和校准字节0x04 读熔丝位及锁定位0x02 读FLash0x03
发表于 2020-06-06
AVR下载烧写的复杂熔丝设置尿性
为什么AVR16总是下不进程序,我用的是AVR Studio下载的,熔丝位SPIEN变成灰色的了,而且勾不上。提问者采纳    熔丝被你点成外部晶振了,找个信号发生器把1MHZ 5V的信号与16接晶振的任意一脚连接,同时用下载器编辑熔丝,记得点成内部的,如果还是不行把信号电压提高。    熔丝位是ATMEL公司AVR单片机比较独到的特征。在每一种型号的AVR单片机内部都有一些特定含义的熔丝位,其特性表现为多次擦写的E²PROM。用户通过配置(编程)这些熔丝位,可以固定地设置AVR的一些特性,参数以及I/O配置等,当然也包括对片内运行代码的锁定(加密)。   
发表于 2020-06-06
AVR下载烧写的复杂熔丝设置尿性
马潮老师关于正确配置AVR熔丝位的建议
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。有关ATmega128熔丝位的具体定义和功能请查看本书相关章节,在附录中将给出一个完整的汇总表。(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请
发表于 2020-06-06
基于AVR的串口与PC机通信代码(uart8位数据)
/************************************AVR时钟:8.00MHz*波特率9600(51)8位数据,1位停止,当波特率设置为19200时,UBRR=25,4800=103*注:波特率设置9600最佳,别的数据不稳定,不同波特率对应的UBRR值参考手册*PC机向开发板发送一个字符,开发板将其大写字母回写给PC机***********************************/#include<iom16v.h>#include<macros.h>void USART_Init( unsigned int baud ){/* 设置波特率,baud的值查数据手册
发表于 2020-06-06
Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)日前宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机系列产品广泛应用
发表于 2020-05-07
Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
Microchip推出全新功能安全型AVR® DA系列单片机
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)今日宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。 Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机
发表于 2020-05-06
Microchip推出全新功能安全型AVR® DA系列单片机
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved