单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

2019-11-30来源: eefocus关键字:avr  基础篇  BOOT区

BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。


使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。


AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控区,有了此BOOT区监控,该器件就可对自己器件的Flash程序存储器及EEPROM数据存储器进行读、写操作,即实现自编程功能,也可称IAP在系统应用中编程,这种自编程程序区我们称其用户管理程序,简称用户程序。


BOOT区大小可根据实际需要用寄存器设定,并可锁定加密,使外界无法读取其监控。如果BOOT区监控设计得好,可把该器件的主要、关键控制对象放在BOOT区监控内(如中断控制),其它工作让用户自己设计,可变成傻瓜式控制器、检测仪,可远程对嵌入式设备进行检测、维护、升级等操作。也可通过有线、无线网络监控设备。实现秀才不出门,也可管世界。这种带BOOT区监控的AVR器件,可应用于程序、数据需变动的场合;可用于自适应、自修正场合;可用于闭环控制,人工智能; 可用于统一计量、计价,又必须在同一时间内快速调正的设备中(例:IC卡计费电话机); 可用于……


有了BOOT区监控,用户程序可通过单片机通讯口与PC机RS232接口来写用户程序,可省去AVR串行或并行下载电缆,这对外出维护设备带来方便。双龙SL-MEGA8开发实验器出厂就提供BOOT区演示监控,用标准RS232通讯电缆就可做程序下载实验(对Flash程序存储器及EEPROM数据存储器实验擦、写、读取)。这样对有的AVR高档单片机编程方法有:编程器编程,ISP串行、并行下载编程,JTGA线编程,IAP在应用中编程(仅用串行通讯线)多种形式,给科研、生产带来方便。可以自己设计编程器件,对用户将提供BOOT区监控方案框架,你只需简单连接,就可组成自己的BOOT区监控。以上设计思想也适合所有AVR高档单片机ATmega系列中含带有BOOT代码区的器件。


AVR的BOOTLOAD功能同其它一些芯片不同,它的BOOTLOAD程序没有固化在芯片内部(出厂为空),而是需要由用户设计实现(实际上,你第一次下载BOOTLOAD程序还必须使用其它的方式编程,如ISP、JTAG等),因此对一般的用户掌握起来有一定的困难,不如一些其它芯片的BOOTLOAD使用方便。但对高手来讲,可以根据实际需要编写高级、高效、专用的BOOTLOAD程序,如从一个U盘读取数据,更新用户的应用程序;编写一个时间炸弹,或对用户的密码进行验证,10次不对则将系统程序销毁等等。简单意味着使用方便,但灵活和适应性差,而灵活性需要你具备更高的能力去驾驭它。可能会有一天,在单片机的系统上也出现了“病毒”程序,其原因就是使用了固化的BOOTLOAD程序。由于固化的程序必须有统一开放的接口,那么用一个带“病毒”的应用程序更新原来的应用程序也就轻而易举了。

 

相关问题的总结:

1.AVR自编程是如何实现的?
答:要想回答这个问题必须先了解AVR的FLASH的分区结构:AVR单片机FLASH分成RWW(READ-WHILE-WRITE)和NRWW(NO-READ-WHILE-WRITE)两个区;其中RWW区的含义是:如果Boot Loader 软件是对RWW 区内的某一页进行编程,则可以从Flash 中读取代码,但只限于NRWW 区内的代码。在Flash 编程期间,用户软件必须保证没有对RWW 区的读访问。如果用户软件在编程过程中试图读取位于RWW 区的代码( 如通过call/jmp/lpm指令或中断),软件可能会终止于一个未知状态。为了避免这种情况的发生,需要禁止中断或将其转移到Boot Loader 区。Boot Loader 总是位于NRWW 存储区。只要 RWW 区处于不能读访问的状态,存储程序存储器控制和状态寄存器(SPMCSR) 的RWW 区忙标志位RWWSB 置位。编程结束后,要在读取位于RWW 区的代码之前通过软件清除RWWSB。而NRWW区的含义是:在Boot Loader 软件更新RWW 区的某一页时,可以读取位于NRWW 区的代码。当 BootLoader 代码更新NRWW 区时,在整个页擦除或写操作过程中CPU 被挂起。而且AVR还自带读写程序区的指令(LPM读程序区指令,SPM写程序区指令),实现程序的更新操作。
================================================================================
2.能否在进行自编过程中,修改复位中断向量的位置(从APP区移至BOOTLOADER区或者相反)?
答:不能。我们一般通过编程Boot复位熔丝位使得复位向量指向Boot 区的起始地址。这样,复位后BOOT Loader 立即就启动了。加载了应用代码后,程序再开始执行应用代码。但,有一点必须指出的是,MCU 本身不能改变熔丝位的设置。也就是说,一旦Boot 复位熔丝位被编程,复位向量将一直指向Boot 区的起始地址。熔丝位只能通过串行或并行编程的方法来改变。故,在自编程过程中,无法实现修改复位中断向量的位置。
================================================================================
3.如何将一个函数定义在BOOT区呢?
答:首先对函数进行连接编译声明,再先修改MAKEFILE里连接编译的相关选项如M16里想将GETCHAR(VOID)定位在BOOT区里则:
(1)声明GETCHAR(VOID __attribute__ ((section (".bootloader")));
(2)在"LDFLAGS=-Wl,-Map=$(TRG).map,--cref"行加进",--section=.bootloader=0x3800"声明即可
================================================================================ 
4.如何将整个工程连接编译的起始地址定义在BOOT区首地址
答:只需修改MAKEFILE里的TEXT段的值即可
如:"LDFLAGS=-Wl,-Map=$(TRG).map,--section-start=.text=0x3800"
================================================================================
5.在编译BOOTLOADER时设置引导程序的起始,为什么与STUDIO显示的设置RWW区大小显示的不一样如设置M16时会显示(Boot Flash size = 1024 words Boot start address=$1c00;[BOOTSZ=00]:default而在MAKEFILE里则是.startsection.bootsection=0x3800呢?
答:在STUDIO里是用字描述地址,而在GCC却用字节描述。
================================================================================
6.实现AVR的BOOTLOADER工作需要注意那些事项?
答:

(1)了解AVR的FLASH的结构分区的含义及APPLICATION;
(2)理解AVR GCC的BOOT.H库文件的例子,并进行测试;
(3)懂得利用AVR GCC的MAKFILE连接编译选项,修改函数或者程序的编译时重定位操作;
(4)进行简单仿真的测试;
(5)策划正确而安全的通讯协议与上位机软件进行通讯;

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

上一篇:AVR单片机入门+使用keil-MDK裸奔TQ2440
下一篇:单片机成长之路(avr基础篇)- 001 ISP与IAP的区别

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

推荐阅读

AVR开发 Arduino方法(四) 串行通信子系统
  Arduino UNO R3主处理器ATMega328P的串行通信子系统可以用于与计算机、外设或其他微控制器进行通信,它支持3种串行通信方式:通用同步/异步收发器,串行外设接口和两线串行接口。1. 通用同步/异步收发器  在串行通信中,波特率用来衡量传输速率的快慢,同步和异步的对象是波特率的时钟信号;同步通信的设备之间需要一条额外的时钟线,也因此同步方式可以提供更高的波特率;这里将以异步为例。  下面的示例可以使通过串口发送给Arduino的数据回显到串口监视器上: 1 // SerialEcho.ino 2 char data; 3  4 void
发表于 2019-12-05
AVR开发 Arduino方法(四) 串行通信子系统
AVR开发 Arduino方法(三) 定时/计数器子系统
Arduino UNO R3的主处理器ATMega328P拥有3个定时/计数器,它们分别是Timer0,Timer1和Timer2;它们都通过对来自内部或外部的脉冲信号进行计数的方式完成基本的定时/计数功能以及一些其他的功能。Timer0和Timer2是8位定时/计时器,Timer1是16位定时/计数器;下面以Timer2为例讨论定时/计数器子系统的典型应用,这些内容同样适用于Timer0和Timer1。1. 精准延时在前面的例子中,已经使用了一些与精准延时相关的Arduino库函数:   delay(ms):延迟一段时间  ms:延迟的时长,单位是毫秒 请注意,上面的Arduino
发表于 2019-12-05
AVR开发 Arduino方法(三) 定时/计数器子系统
AVR开发 Arduino方法(二) 中断子系统
在了解中断子系统之前,首先要了解中断的概念。你正在看书,这时电话响了,你会怎么做呢?相信大多数人会这样:先标记看到的位置,接完电话回来后继续阅读。这就是一个现实生活中中断的例子,我们把“电话响了”成为中断源。Arduino UNO R3的主处理器ATMega328P拥有26个中断源,如下表所示:向量号程序地址中断源中断定义中断服务程序名称10x0000RESET外部电平复位,上电复位,掉电检测复位,看门狗复位20x0002INT0外部中断请求0INT0_vect30x0004INT1外部中断请求1INT1_vect40x0006PCINT0引脚电平变化中断请求0PCINT0_vect50x0008PCINT1引脚
发表于 2019-12-05
AVR开发 Arduino方法(一) 端口子系统
  Arduino UNO R3的主处理器ATMega328P上有3个8位的输入/输出端口,分别是PB,PC和PD。Arduino IDE提供的Blink示例可以帮助我们了解端口的数字输出功能:  1 // Blink.ino 2 int led = 13; 3  4 void setup() { 5   pinMode(led, OUTPUT); 6 } 7  8 void loop() { 9   digitalWrite(led, HIGH);10  &nbs
发表于 2019-12-05
AVR开发 Arduino方法(一) 端口子系统
AVR开发 Arduino方法(附一) 工具链与调试技术
开“AVR Source Code”和“AVR Variables”对话框,从中可以查看程序源代码以及变量值的情况:从“AVR Source Code”对话框中找到主函数,找到setup()函数和loop()函数的调用语句,双击打上断点,运行到断点处,就可以开始调试了:(2) 使用Visual Studio进行硬件调试安装带有C++组件2012或更新版本的Visual Studio后,在http://www.visualmicro.com/page/Arduino-Visual-Studio-Downloads.aspx中下载Visual 
发表于 2019-12-05
AVR开发 Arduino方法(附一) 工具链与调试技术
AVR+FPGA实现六路闭环电流控制程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity XTKZQ isport(    rst,clk        :    in        std_logic;    --时钟和复位信号,复位信号由AVR初始化手动给出    --avr 读写相关信号线    ale,rd
发表于 2019-12-05
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved