AVR教程(1):AVR单片机介绍作者:微雪电子文章来源: 点击数: 478 更新时间:2008-4-1 23:58:21 AVR,它来源于:1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。
AVR单片机特点每种MCU都有自身的优点与缺点,与其它8-bit MCU相比,AVR 8-bit MCU最大的特点是:●哈佛结构,具备1MIPS / MHz的高速运行处理能力;●超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC 进行处理造成的瓶颈现象;●快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发;●作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力;●片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠;●大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,UART,TWI,ISP,AD,Analog Comp arator,WDT等;●大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。
●性价比高。
开发AVR单片机,需要哪些编译器、调试器?软件名称类型简介官方网址AVR Studio IDE、汇编编译器ATMEL AVR Studio集成开发环境(IDE),可使用汇编语言进行开发(使用其它语言需第三方软件协助),集软硬件仿真、调试、下载编程于一体。
ATMEL官方及市面上通用的AVR开发工具都支持AVRStudio。
GCCAVR (WinAVR) C编译器GCC是Linux的唯一开发语言。
GCC的编译器优化程度可以说是目前世界上民用软件中做的最好的,另外,它有一个非常大优点是,免费!在国外,使用它的人几乎是最多的。
但,相对而言,它的缺点是,使用操作较为麻烦。
ICC AVRC编译器(集烧写程序功能)市面上(大陆)的教科书使用它作为例程的较多,集成代码生成向导,虽然它的各方面性能均不是特别突出,但使用较为方便。
虽然ICCAVR软件不是免费的,但,它有Demo版本,在45天内是完全版。
CodeVision AVRC编译器(集烧写程序功能)与KeilC51的代码风格最为相似,集成较多常用外围器件的操作函数,集成代码生成向导,有软件模块,不是免费软件,Demo版为限2KB版。
www.hpinfotech.roATman AVR C编译器支持多个模块调试(AVRStudio不支持多个模块调试)。
IAR AVR C编译器IAR实际上在国外比较多人使用,但它的价格较为昂贵,所以,中国大陆内,使用它的开发人员较少,只有习惯用IAR的工程师才会去使用它。
AVR的仿真方式一般来说,AVR有三种仿真方式:(1)JTAG仿真方式,适用于具备JTAG仿真接口的AVR。
如:Atmega16/32,At mega64/128等。
JTAG是IEEE的标准规范,通过这个标准,可对具有JTAG接口的芯片的硬件电路进行边界扫描和故障检测。
部分AVR型号带JTAG仿真调试接口,可使用JTAG仿真方式。
(2)debugWIRE仿真方式,适用于具备debugWIRE仿真接口的AVR。
如:Attin y13/24/2313,Atmega48/88/168等。
debugWIRE 是用以降低成本和调试引脚的开销,ATMEL在AVR器件上使用的新的调试接口:debugWIRE,与JTAG相比其主要区别在于仅使用一根信号线(R ESET),即可完成调试信息的交互,达到控制程序流向,执行指令以及编程熔丝位的功能。
它的总的连接图如下:这里的 RESET 信号被用于传递调试信息。
(3)采用仿真头替代AVR MCU仿真方式,适用于不带仿真接口的AVR。
如Atti ny26,Atmega8,Atmega8515等。
AVR的烧写方式一般来说,AVR的编程方式有:(1)串行编程(即ISP编程)ISP是In System Program的缩写,意思是在系统编程。
目前的AVR芯片基本上都具备ISP接口,可通过ISP接口进行编程。
它一共使用了两条电源线:V CC、GND,三条信号线:SCK、MOSI、MISO,以及复位线:RESET。
由于仅仅使用了几条数据线,所以我们亦常将其称为串行编程。
值得注意的是,虽然下载器端使用的信号线名为SCK、MOSI、MISO,但AVR MCU的信号端不一定是名为SCK、M OSI、MISO。
AVR的串行编程方式有很多种,如:(1)STK200/STK300:并口下载器多采用该烧写方式,最早期的一种烧写方式,支持型号少,烧写速度低,不支持AVR Studio。
(2)STK500:ATMEL最推荐的编程方式,由于采用ATMEL官方的STK500固件,使得它可烧写全系列AVR(若对固件进行升级亦可支持未来的AVR型号),烧写速度非常快,支持AVR Studio。
(3)AVRISP(准STK500):由于采用ATMEL官方的STK500固件,使得它可烧写大部分AVR(若对固件进行升级亦可支持未来的AVR型号),烧写速度非常快,支持AVR Studio。
(4)AVRISPmkII:由于采用ATMEL官方的AVRISPmkII固件,使得它可烧写大部分AVR(若对固件进行升级亦可支持未来的AVR型号),烧写速度非常快,支持AVR Studio。
(5)当然还有其它的ISP方式,但已经那些均不是最为常见的串行编程方式,在此不在作一一介绍。
(2)高压/并行编程AVR的高压编程/并行编程,实际上是更早出现的编程方法,它功能强大,但需要:1)连接较多的引脚(故称“并行编程”)2)使用12V电压(故称“高压编程”)联合起来一般叫高压/并行编程。
实际上,有些编程是高压/串行编程,如Attiny13。
(Attiny13端口非常少)高压/并行编程(理论上)能修复任何熔丝位,例如:1)Attiny13/24/2313、Atmega8/48/88/168等AVR的RESET端口与IO端口是共用的,由于这类AVR的引脚一般较少,(如Attiny13仅有6个IO口),经常出现IO不够用的情况,需要将RESET端口设置为IO端口使用,然而,一旦将RESET设置为IO,便无法再进行ISP编程了,更无法使用ISP恢复RESET功能,因为ISP编程需要RESET功能。
然而,这种情况下,使用高压/并行编程,可以恢复RESET功能,(注意:RESET端口与IO端口是共用的AVR,具备debugWIRE功能,“dW”熔丝位必须为启动状态)因为高压/并行编程不需要RESET功能。
2)当设置错了熔丝位导致芯片锁死,这种情况下,使用高压/并行编程,可恢复熔丝位。
(3)JTAG编程JTAG烧写方式仅适用于带JTAG接口的AVR,另外,JTAG对比ISP烧写方式主要有个缺点:必须占用JTAG对应的IO端口。
例如,ATMEGA16必须占用PC2-PC5这几个端口。
然而,有时候,缺点也是优点,因为对于IO够用的AVR来说,在产品开发过程,可以用JTAG接口来仿真调试,产品量产后,产品板预留的JT AG接口还可以用来烧写程序。
(4)IAP编程AVR MCU的ISP功能和debugWIRE功能是互斥的,也就是说,使能了AVR MC U的 debugWIRE 功能后ISP功能就无法使用,使能了ISP功能后debugWIRE功能就无法使用。
那么,怎样确定AVR的RESET引脚为ISP功能使用还是debugWIRE功能使用呢?在具备debugWIRE 的AVR 器件中,有一个可编程的熔丝位DWEN,如果该熔丝被编程(且lockbits未被编程),则debugWIRE 功能被启用,AVR的RESET引脚将被作为debugWIRE 功能使用,可与调试器进行debugWIRE仿真通信(此时,ISP 功能被禁用)。
AVR芯片出厂时,DWEN熔丝位是未编程的,也即是说I SP 功能是使能的,debugWIRE 被禁用。
使用ISP 功能时,通过调试器对debug WIRE熔丝进行编程使能,可启用debugWIRE功能;使用debugWIRE功能时,对通过调试器对debugWIRE熔丝禁止,可使能ISP 功能。
编程语言建议使用C而不是汇编开发AVR首先说说C的优点。
1、直观,可读性强:这点很重要。
对于一个产品,周期是很长的,即使出第一台产品之后,还有很长的维护时间。
这中间维护人员可能经常变动,如果可读性强,将给维护工作省下很大的成本。
即使是在开发,可读性强的程序也便于查错。
2、模块化可以做的很好:这点也是很重要的。
模块化做得好,当然程序得重用性就高。
对于公司来说,这一点是关系到公司长远发展的。
程序可以重用,说明下一次开发的投入就可以减少,时间也可以加快,多好的事呀。
还有很多有点,当然也就是高级语言相对于汇编语言的优点,这里就不一一列举了。
再来看看汇编的优点:应该来说,汇编语言操作硬件直观,对于硬件非常熟悉的人来说,直接操作很方便。
另外可能就是很多人说的效率要高了。
针对以上两点我来说说,首先“汇编语言操作硬件直观”,这是在代码编写阶段,对于整个产品周期来说,应该是要避免使用汇编语言的,这个在C语言的优点中已经说明。
对于第二点,效率问题,目前C语言的编译器优化也做的很好,对于一个汇编不是很熟练的来说,C编出来的程序应该不会效率比汇编低。
当然这样就对开发人员的要求降低了很多,人员的限制也就没有那么严格。
另外是否真的是效率问题呢。
我觉得应该是一个整体效率和局部效率的均衡问题。
需要提高的是整体的效率。
一个好的软件架构,远远比一个好的函数效率要高的多。
因此主要的精力应该放在软件的架构上。
另外现在CPU的速度不停的往上提,CPU 越来越快,这点应该也可以弥补程序的效率吧。
当然,我的意思不是不学习汇编。
汇编对于熟悉硬件有很大的好处,应此汇编语言在学习初期一定是要学习的。
在基本的硬件熟悉之后,就可以转向C了。