手机版
您的当前位置: 老骥秘书网 > 范文大全 > 公文范文 > AVR自编程是如何实现?(范文推荐)

AVR自编程是如何实现?(范文推荐)

下面是小编为大家整理的AVR自编程是如何实现?(范文推荐),供大家参考。

AVR自编程是如何实现?(范文推荐)

 

 AVR 自编程是如何实现的?

  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)策划正确而安全的通讯协议与上位机软件进行通讯;

老骥秘书网 https://www.round-online.com

Copyright © 2002-2018 . 老骥秘书网 版权所有

Top