AVR单片机介绍
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 Comparator,WDT等;
● 大部分AVR除了有ISP功能外,还有IAP功能,方便升级或销毁应用程序。 ● 性价比高。
开发AVR单片机,需要哪些编译器、调试器?
软件名称
AVR Studio
类型 简介
ATMEL AVR Studio集成开发环境(IDE),可使用
官方网址
www.atmel.com
IDE、汇编编汇编语言进行开发(使用其它语言需第三方软件协
译器
助),集软硬件仿真、调试、下载编程于一体。ATMEL官方及市面上通用的AVR开发工具都支持AVRStudio。 GCC是Linux的唯一开发语言。GCC的编译器优化程度可以说是目前世界上民用软件中做的最好的,另
GCCAVR (WinAVR) C编译器 外,它有一个非常大优点是,免费!在国外,使用它
的人几乎是最多的。但,相对而言,它的缺点是,使用操作较为麻烦。
C编译器
ICC AVR
(集烧写程序功能)
市面上(大陆)的教科书使用它作为例程的较多,集成代码生成向导,虽然它的各方面性能均不是特别但,它有Demo版本,在45天内是完全版。
sourceforge.net
www.imagecraft.com
突出,但使用较为方便。虽然ICCAVR软件不是免费的,
C编译器 与KeilC51的代码风格最为相似,集成较多常用
CodeVision AVR (集烧写程外围器件的操作函数,集成代码生成向导,有软件模www.hpinfotech.ro
序功能) 块,不是免费软件,Demo版为限2KB版。
ATman AVR IAR AVR C编译器 支持多个模块调试(AVRStudio不支持多个模块调试)。 www.atmanecl.com IAR实际上在国外比较多人使用,但它的价格较C编译器 为昂贵,所以,中国大陆内,使用它的开发人员较少,只有习惯用IAR的工程师才会去使用它。 www.iar.com AVR的仿真方式
一般来说,AVR有三种仿真方式:
(1)JTAG仿真方式,适用于具备JTAG仿真接口的AVR。如:Atmega16/32,Atmega64/128等。
JTAG是IEEE的标准规范, 通过这个标准,可对具有JTAG接口的芯片的硬件电路进行边界扫描和故障检测。部分AVR型号带JTAG仿真调试接口,可使用JTAG仿真方式。
(2)debugWIRE仿真方式,适用于具备debugWIRE仿真接口的AVR。如:Attiny13/24/2313,Atmega48/88/168等。
debugWIRE 是用以降低成本和调试引脚的开销,ATMEL在AVR器件上使用的新的调试接口:debugWIRE,与JTAG相比其主要区别在于仅使用一根信号线(RESET),即可完成调试信息的交互,达到控制程序流向,执行指令以及编程熔丝位的功能。它的总的连接图如下:
这里的 RESET 信号被用于传递调试信息。
(3)采用仿真头替代AVR MCU仿真方式,适用于不带仿真接口的AVR。如Attiny26,Atmega8,Atmega8515等。
AVR的烧写方式
一般来说,AVR的编程方式有: (1)串行编程(即ISP编程)
ISP是In System Program的缩写,意思是在系统编程。目前的AVR芯片基本上都具备ISP接口,可通过ISP接口进行编程。它一共使用了两条电源线:VCC、GND,三条信号线:SCK、MOSI、MISO,以及复位线:RESET。由于仅仅使用了几条数据线,所以我们亦常将其称为串行编程。值得注意的是,虽然下载器端使用的信号线名为SCK、MOSI、MISO,但AVR MCU的信号端不一定是名为SCK、MOSI、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接口来仿真调试,产品量产后,产品板预留的JTAG接口还可以用来烧写程序。
(4)IAP编程
AVR MCU的ISP功能和debugWIRE功能是互斥的,也就是说,使能了AVR MCU的 debugWIRE 功能后ISP功能就无法使用,使能了ISP功能后debugWIRE功能就无法使用。
那么,怎样确定AVR的RESET引脚 为ISP功能使用还是debugWIRE功能使用呢?
在具备debugWIRE 的AVR 器件中,有一个可编程的熔丝位DWEN,如果该熔丝被编程(且lockbits未被编程),则debugWIRE 功能被启用,AVR的RESET 引脚将被作为debugWIRE 功能使用,可与调试器进行debugWIRE仿真通信(此时,
ISP 功能被禁用)。AVR芯片出厂时,DWEN熔丝位是未编程的,也即是说ISP 功能是使能的,debugWIRE 被禁用。使用ISP 功能时,通过调试器对debugWIRE熔丝进行编程使能,可启用debugWIRE功能;使用debugWIRE功能时,对通过调试器对debugWIRE熔丝禁止,可使能ISP 功能。
编程语言建议使用C而不是汇编开发AVR
首先说说C的优点。
1、直观,可读性强:这点很重要。对于一个产品,周期是很长的,即使出第一台产品之后,还有很长的维护时间。这中间维护人员可能经常变动,如果可读性强,将给维护工作省下很大的成本。即使是在开发,可读性强的程序也便于查错。 2、模块化可以做的很好:这点也是很重要的。模块化做得好,当然程序得重用性就高。对于公司来说,这一点是关系到公司长远发展的。程序可以重用,说明下一次开发的投入就可以减少,时间也可以加快,多好的事呀。
还有很多有点,当然也就是高级语言相对于汇编语言的优点,这里就不一一列举了。
再来看看汇编的优点:应该来说,汇编语言操作硬件直观,对于硬件非常熟悉的人来说,直接操作很方便。另外可能就是很多人说的效率要高了。
针对以上两点我来说说,首先“汇编语言操作硬件直观”,这是在代码编写阶段,对于整个产品周期来说,应该是要避免使用汇编语言的,这个在C语言的优点中已经说明。对于第二点,效率问题,目前C语言的编译器优化也做的很好,对于一个汇编不是很熟练的来说,C编出来的程序应该不会效率比汇编低。当然这样就对开发人员的要求降低了很多,人员的限制也就没有那么严格。另外是否真的是效率问题呢。我觉得应该是一个整体效率和局部效率的均衡问题。需要提高的是整体的效率。一个好的软件架构,远远比一个好的函数效率要高的多。因此主要的精力应该放在软件的架构上。另外现在CPU的速度不停的往上提,CPU越来越快,这点应该也可以弥补程序的效率吧。
当然,我的意思不是不学习汇编。汇编对于熟悉硬件有很大的好处,应此汇编语言在学习初期一定是要学习的。在基本的硬件熟悉之后,就可以转向C了。