AVR单片机的基本结构 - 图文

更新时间:2023-12-09 22:24:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第2章 AVR单片机的基本结构

单片机是构成单片机嵌入式系统的核心器件。本章首先将介绍一般单片机的基本结构和组成,使大家对单片机芯片的内部硬件有基本了解和认识。掌握了单片机的基本结构和组成,对学习、了解任何一种类型单片机的工作原理,编写单片机的系统软件以及和设计外围电路都是非常重要的。

AVR是美国ATMEL公司推出的一款采用RISC指令的8位高速单片机。本章将以ATmega16为主线,介绍和讲述AVR单片机内核的基本结构、引脚功能、工作方式等。深入的理解和掌握AVR的基本结构,对后续章节的学习、以及对实际的应用AVR单片机都是非常重要的。

2.1 单片机的基本组成

2.1.1 单片机的基本组成结构

单片机嵌入式系统的核心部件是单片机,其结构特征是将组成计算机的基本部件集成在一块晶体芯片上,构成一片具有特定功能的单芯片计算机—单片机。一片典型单片机芯片内部的基本组成结构如图2-1所示。

外部时钟源 外部事件计数 振荡器和 时序电路 操作管理寄存器 程序存储器 数据存储器 定时器计数器 CPU 内 内部总线 中断 控制 部 中 断 总 线 扩展控制器 并行I/O接口 串行I/O接口 外部中断 外部数据/地址总线

图2-1 典型单片机的基本组成结构

从单片机的基本组成可以看出,在一片(单片机)芯片中,集成了构成一个计算机系统的最基本的单元:如CPU、程序(指令)存储器、数据存储器、各种类型的输入/输出接口等。CPU同各基本单元通过芯片内的内部总线(包括数据总线、地址总线和控制总线)连接。

一般情况下,内部总线中的数据总线宽度(或指CPU的字长)也是标定该单片机等级的一个重要指标。一般讲,低档单片机的内部数据总线宽度为4位(4位机),普通和中档单片机的内部数据总线宽度一般为8位(8位机),高档单片机内部数据总线宽度为16或32位。内部数据总线宽度越宽,单片机的处理速度也相应的提高,功能也越强。

2-1

2.1.2 单片机基本单元与作用

下面分别对单片机芯片中所集成的各个组成部分予以简要介绍。 1.MCU单元(Microcontroller Unit)

MCU单元部分包括了CPU、时钟系统、复位、总线控制逻辑等电路。CPU是按照面向测控对象、嵌入式应用的要求设计的,其功能有进行算术、逻辑、比较等运算和操作,并将结果和状态信息与存储器以及状态寄存器进行交换(读/写)。时钟和复位电路实现上电复位、信号控制复位,产生片内各种时钟及功耗管理等。总线控制电路则产生各类控制逻辑信号,满足MCU对内部和外部总线的控制。其中,内部总线用以实现片内各单元电路的协调操作和数据传输,而外部总线控制用于单片机外围扩展的操作管理。 2. 片内存储器

单片机的存储器一般分成程序存储器和数据存储器,它们往往构成相互独立的两个存储空间,分别寻址,互不干扰。在这一点上,与通用计算机系统的结构是不同的。通用计算机系统通常采用“Von-Neumann”结构,在这种结构体系中采用了单一的数据总线用于指令和数据的存取,因此数据和指令是存放在同一个存储空间中的,CPU使用同一条数据总线与数据和程序进行交换,如在计算机原理课程中介绍的8086/8088。而单片机的内部结构通常使用“Harvard”体系结构,在这种体系中采用分开的指令和数据总线,以及分开的指令和数据地址空间。单片机采用Harvard双(多)总线结构的优点是,指令和数据空间完全分开,分别通过专用的总线同CPU交换,可以实现对程序和数据的同时访问,提高了CPU的执行速度和数据的吞吐率。

早期的单片机,如典型的8031单片机,在片内只集成少量的数据存储器RAM(128/256字节),没有程序存储器。因此程序存储器和大容量的数据存储器需要进行片外的扩展,增加外围的存储芯片和电路,这给构成嵌入式系统带来了麻烦。后期的单片机则在片内集成了相当数量的程序存储器,如与8031兼容的AT89S51、AT89S52在片内集成了4K/8K的Flash程序存储器。而现在新型的单片机,则在片内集成了更多数量和更多类型的存储器。如AVR系列的ATmega16在片内就集成了16K字节的Flash程序存储器,1K字节的RAM数据存储器,以及512字节的EEPROM数据存储器,这就大大方便了应用。

3.程序存储器

程序存储器用于存放嵌入式系统的应用程序。由于单片机嵌入式系统的应用程序在开发调试完成后不需要经常改变,因此单片机的程序存储器多采用只读型ROM存储器,用于永久性的存储系统的应用程序。为适应不同产品、用户和不同场合的需要,单片机的程序存储器有以下几种不同形式:

①ROMLess型。该种形式的单片机片内没有集成程序存储器,使用时必须在单片机外部扩展一定容量的EPROM器件。因此,使用这种类型的单片机就必须使用并行扩展总线,增加芯片,增加了硬件设计的工作量。

②EPROM型。单片机片内集成了一定数量的EPROM存储器用于存放系统的应用程序。这类单片机芯片的上部开有透明窗口,可通过约15分钟的紫外线照射来擦除存储器中的程序,再使用专用的写入装置写入程序代码和数据,写入次数一般为几十次。

③MaskROM型。使用种类型的单片机时,用户要将调试好的应用程序代码交给单片机的生产厂家,生产商在单片机芯片制造过程的掩膜工艺阶段将程序代码掩膜到程序存储器中。这种单片机便成为永久性专用的芯片,系统程序无法改动,适合于大批量产品的生产。 ④OTPROM型。这种类型的单片机与MaskROM型的单片机有相似的特点。生产商提供新的单片机芯片中的程序存储器可由用户使用专用的写入装置一次性编程写入程序代码,写入后也无法改动了。这种类型的单片机也是适用于大批量产品的生产。

2-2

⑤FlashROM型。这是一种可供用户多次擦除和写入程序代码的单片机。它的程序存储器采用快闪存储器(FlashMemory),现在可实现大于1万次的写入操作。

内部集成FlashROM型单片机的出现,以及随着Flash存储器价格的下降,使得使用FlashROM的单片机正在逐步淘汰使用其它类型程序存储器的单片机。由于FlashROM可多次擦除(电擦除)和写入的特性,加上新型的单片机又采用了在线下载ISP技术(In System Program--既无需将芯片从系统板上取下,直接在线将新的程序代码写入单片机的程序存储器中。),不仅为用户在嵌入式系统的设计、开发和调试带来了极大的方便,而且也适用于大批量产品的生产,并为产品的更新换代提供了更广阔的空间。 4. 数据存储器

单片机在片内集成的数据存储器一般有两类:随机存储器RAM和电可擦除存储器①随机存储器RAM。在单片机中,随机存储器RAM是用来存储系统程序在运行期间的工作变量和临时数据的。一般在单片机内部集成一定容量(32字节至512字节或更多)的RAM。这些小容量的数据存储器以高速RAM的形式集成在单片机芯片内部,作为临时的工作存储器使用,可以提高单片机的运行速度。

在单片机中,常把内部寄存器(如工作寄存器、I/O寄存器等)在逻辑上也划分在RAM空间中,这样即可以使用专用的寄存器指令对寄存器进行操作,也可将寄存器当做RAM使用,为程序设计提供了方便和灵活性。

对一些需要使用大容量数据存储器的系统,就需要在外部扩展数据存储器。这时,单片机就必须具备并行扩展总线的功能,同时外围也要增加RAM芯片和相应的地址锁存、地址译码等电路。这不仅增加了硬件设计的工作量,产品的成本,同时降低了系统的可靠性。 目前许多新型单片机片内集成的RAM容量越来越大。片内集成的RAM容量增加,不仅减少了在片外扩展RAM的必要性,提高了系统的可靠性,而且更重要的是,使得单片嵌入式系统的软件设计思想和方法有了许多的改变和发展,给编写系统程序带来很大的方便,更加有利于结构化、模块化的程序设计。

②电可擦除存储器EEPROM。一些新型的单片机,在芯片中还集成了电可擦除存储器型EEPROM的数据存储器。这类数据存储器用于存放一些永久或比较固定的系统参数,如放大倍率、电话号码、时间常数等。EEPROM的寿命大于10万次,具有掉电后不丢失数据的特点,并且通过系统程序可以随时修改,这些特性都给用户设计开发产品带来极大的方便和想象空间。

5. 输入/输出(I/O)端口 为了满足嵌入式系统“面向控制”的实际应用需要,单片机提供了数量众多、功能强、使用灵活的输入/输出端口,简称I/O。端口的类型可分为以下几种类型: ① 并行总线输入/输出端口(并型I/O口)。用于外部扩展和扩充并行存储器芯片或并行I/O芯片等使用,包括数据总线、地址总线和读写控制信号等。

② 通用数字I/O端口。用于外部电路逻辑信号的输入和输出控制。

③ 片内功能单元的输入/输出端口。如:定时器/计数器的计数脉冲输入,外部中断源信号的输入等。

④ 串行I/O通信口。用于系统之间或与采用专用串行协议的外围芯片之间的连接和交换数据。如:UART串行接口(RS-232),IC串行接口,SPI串行接口,USB串行口等。 ⑤ 其它专用接口。一些新型的单片机还在片内集成了某些专用功能的模拟或数字的I/O端口,如A/D输入、D/A输出接口,模拟比较输入端口,脉宽调制(PWD)输出端口等。更有的单片机还将LCD液晶显示器的接口也集成到单片机芯片中了。

为了减少芯片引脚的数量,又能提供更多性能的I/O端口给用户使用,大多数的单片机

2-3

2

EEPROM。

都采用了I/O端口复用技术,既某一端口,它即可作为一般通用的数字I/O端口使用,也可作为某个特殊功能的端口使用,用户可根据系统的实际需要来定义使用。这样就为设计开发提供了方便,大大拓宽了单片机的应用范围。 6. 操作管理寄存器。

操作管理寄存器也是单片机芯片中的重要组成部分之一。它的功能是管理、协调、控制和操作单片机芯片中的各功能单元的使用和运行。这类寄存器的种类有:状态寄存器、控制寄存器、方式寄存器、数据寄存器等等。各种寄存器的定义、功能、状态、相互之间的关系和应用相对比较复杂,而且往往同相应的功能单元的使用紧密相关,因此,用户应非常熟悉各个寄存器的作用以及如何与不同的功能单元的配合使用,这样才能通过程序指令对其编程操作,以实现对单片机芯片中各种功能的正确使用,充分发挥单片机的所有特点和性能,设计和开发出高性能、低成本的电子产品。可以这样讲,当你对某个单片机芯片中各个操作管理寄存器的作用、功能、定义非常透彻的掌握了,那么你已经完全精通和能够熟练使用该单片机了。

2.2 ATmega16单片机的组成

ATMEL公司的AVR单片机是一种基于增强RISC结构的、低功耗、CMOS技术、8位微控制器(Enhanced RISC Microcontroller),目前有Tiny、Mega两个系列50多种型号。它们的功能和外部的引脚各有不同,小到8-12个引脚,多到100个引脚,但它们内核的基本结构是一样的,指令系统相容。本书将以性能适中的ATmega16为主线,介绍和讲述AVR单片机的组成,以及如何应用在嵌入式系统中。在正式的产品开发与设计时,设计者可根据系统的实际需要选择合适型号的AVR单片机。

2.2.1 AVR单片机的内核结构

图 2-2 AVR单片机的内核结构示意图

2-4

尽管AVR单片机系列有几十种的型号,但它们有着相同的内核结构,指令兼容。图2-2为典型的AVR单片机的内核结构图。

为了提高MCU并行处理的运行效率,AVR单片机采用了程序存储器和数据存储器使用不同的存储空间和存取总线的Harvard结构。算术逻辑单元(ALU)使用单级流水线操作方式对程序存储器进行访问,在执行当前一条指令的同时,也完成了从程序存储器中取出下一条将要执行指令的操作,因此执行一条指令仅需要一个时钟周期。

在AVR的内核中,由32个访问操作只需要一个时钟周期的8位通用工作寄存器组成了“快速访问寄存器组”。“快速访问”意味着在一个时钟周期内执行一个完整的ALU操作。这个ALU操作中包含三个过程:从寄存器组中取出两个操作数,操作数被执行,将执行结果写回目的寄存器中。这三个过程是在一个时钟周期内完成的,构成一个完整的ALU操作。

在32个通用工作寄存器中,有6个寄存器可以合并成为3个16位的,用于对数据存储器空间进行间接寻址的间接地址寄存器(存放地址指针),以实现高效的地址计算。这3个16位的间接地址寄存器称为:X寄存器,Y寄存器和Z寄存器。其中Z寄存器还能作为间接寻址程序存储器空间的地址寄存器,用于在Flash程序存储器空间进行查表等操作。 AVR的算术逻辑单元(ALU)支持寄存器之间,立即数与寄存器之间的算术与逻辑运算功能,以及单一寄存器操作。每一次运算操作的结果将影响和改变状态寄存器(SREG)的值。 使用条件转移、无条件转移和调用指令,可以直接访问全部Flash程序存储器空间以及控制程序的执行顺序。大部分AVR指令为单一16位格式,只有少数指令为32位格式。因此,AVR的程序存储器单元为16位,即每个程序地址(两字节地址)单元存放一条单一的16位指令字。而一条32位的指令字,则要占据2个程序存储器单元。

ATmega16单片机的Flash程序存储器空间可以分成两段:引导程序段(Boot program section)和应用程序段(Application program section)。两个段的读写保护可以分别通过设置对应的锁定位(Lock bits)来实现。在引导程序段内驻留的引导程序中,可以使用SPM指令,实现对应用程序段的写操作(实现在应用自编程IAP功能,使系统能够自己更新系统程序)。 在响应中断服务和子程序调用过程时,程序计数器PC中的返回地址将被存储于堆栈之中。堆栈空间将占用数据存储器(SRAM)中一段连续的地址。因此,堆栈空间的大小仅受到系统总的数据存储器(SRAM)的大小以及系统程序对SRAM的使用量的限制。用户程序应在系统上电复位后,对一个16位的堆栈指针寄存器SP进行初始化设置(或在子程序和中断程序被执行之前)。 在AVR中,所有的存储器空间都是线性的。数据存储器(SRAM)可以通过5种不同的寻址方式进行访问。

AVR的中断控制由I/O寄存器空间的中断控制寄存器和状态寄存器中的全局中断允许位组成。每个中断都分别对应一个中断向量(中断入口地址)。所有的中断向量构成了中断向量表,该中断向量表位于Flash程序存储器空间的最前面。中断的中断向量地址越小,其中断的优先级越高。

I/O空间为连续的64个I/O寄存器空间,它们分别对应MCU各个外围功能的控制和数据寄存器地址,如控制寄存器、定时器/计数器、A/D转换器及其他的I/O功能等。I/O寄存器空间可使用I/O寄存器访问指令直接访问,也可将其映射为通用工作寄存器组后的数据存储器空间,使用数据存储器访问指令进行操作。I/O寄存器空间在数据存储器空间的映射地址为 $020~$05F。

AVR单片机的性能非常强大,所以它的内部结构相对8031结构的单片机要复杂。对于刚开始接触和学习单片机的人员,以及了解8051结构单片机的人来讲,在这里尽管不会马上理解AVR内核的全部特点,但通过以后的逐步学习,应逐渐深入的体会和掌握它的原理,

2-5

这对于熟练的应用AVR设计开发产品,以及将来学习使用更新的单片机都会有很大的帮助。技术是在不断的发展的。

2.2.2 典型AVR芯片ATmega16特点

AVR系列单片机中比较典型的芯片是ATmega16。这款芯片具备了AVR系列单片机的主要的特点和功能,不仅适合应用于产品设计,同时也方便初学入门。其主要特点有: (1)采用先进RISC结构的AVR内核

131条机器指令,且大多数指令的执行时间为单个系统时钟周期; 32个8位通用工作寄存器;

工作在16MHz时具有16MIPS的性能。 配备只需要2个时钟周期的硬件乘法器

(2)片内含有较大容量的非易失性的程序和数据存储器

16K字节在线可编程(ISP)Flash程序存储器(擦除次数>1万次),采用Boot Load技术支持IAP功能;

1K字节的片内SRAM数据存储器,可实现3级锁定的程序加密; 512个字节片内在线可编程EEPROM数据存储器(寿命>10万次); (3)片内含JTAG接口 支持符合JTAG标准的边界扫描功能用于芯片检测; 支持扩展的片内在线调试功能

可通过JTAG口对片内的Flash、EEPROM、配置熔丝位和锁定加密位实施下载编程; (4)外围接口

2个带有分别独立、可设置预分频器的8位定时器/计数器;

1个带有可设置预分频器、具有比较、捕捉功能的16位定时器/计数器; 片内含独立振荡器的实时时钟RTC; 4路PWM通道;

8路10位ADC

面向字节的两线接口TWI(兼容I2C硬件接口);

1个可编程的增强型全双工的,支持同步/异步通信的串行接口USART; 1个可工作于主机/从机模式的SPI串行接口(支持ISP程序下载); 片内模拟比较器;

内含可编程的,具有独立片内振荡器的看门狗定时器WDT; (5)其它的特点

片内含上电复位电路以及可编程的掉电检测复位电路BOD;

片内含有1M/2M/4M/8M,经过标定的、可校正的RC振荡器,可作为系统时钟使用; 多达21个各种类型的内外部中断源; 有6种休眠模式支持省电方式工作;

工作电压范围宽:ATmega16L 2.7—5.5v,ATmega16 4.5—5.5v; 运行速度:ATmega16L 0—8M,ATmega16 0—16M;

(6)宽电压、高速度、低功耗

低功耗:ATmega16L工作在1MHz、3v、25度时的典型功耗为,正常工作模式 1.1mA,空闲工作模式 0.35mA,掉电工作模式 <1uA;

(7)芯片引脚和封装形式

ATmega16共有32个可编程的I/O口(脚),芯片封装形式有40引脚的PDIP、44引脚的TQFP和44引脚的MLF封装。

2-6

2.2.3 外部引脚与封装

ATmega16单片机有三种形式的封装:40脚双列直插PDIP、44脚方形的TQFP和MLF形式(贴片形式)。其外部引脚封装如图2-3所示。

图2-3 ATmage16 外部引脚与封装示意图

其中,各个引脚的功能如下:

(1)电源、系统晶振、芯片复位引脚

Vcc: 芯片供电(片内数字电路电源)输入引脚,使用时连接到电源正极。

AVcc:为端口A和片内ADC模拟电路电源输入引脚。不使用ADC时,直接连接到电源正

极;使用ADC时,应通过一个低通电源滤波器与Vcc连接。 AREF:使用ADC时,可作为外部ADC参考源的输入引脚。 GND: 芯片接地引脚,使用时接地。

XTAL2:片内反相振荡放大器的输出端。

XTAL1:片内反相振荡放大器和内部时钟操作电路的输入端。

RESET:RESET为芯片复位输入引脚。在该引脚上施加(拉低)一个最小脉冲宽度为1.5us的低电平,将引起芯片的硬件复位(外部复位)。 (2)32根I/O引脚,分成PA、PB、PC和PD四个8位端口,他们全部是可编程控制的双(多)功能复用的I/O引脚(口)。 四个端口的第一功能是通用的双向数字输入/输出(I/O)口,其中每一位都可以由指令设置为独立的输入口,或输出口。当I/O设置为输入时,引脚内部还配置有上拉电阻,这个内部的上拉电阻可通过编程设置为上拉有效或上拉无效。

如果AVR的I/O口设置为输出方式工作,当其输出高电平时,能够输出20mA的电流,而当其输出低电平时,可以吸收40mA的电流。因此AVR的I/O口驱动能力非常强,能够直接驱动LED发光二极管、数码管等。而早期单片机I/O口的驱动能力只有5mA,驱动LED时,还需要增加外部的驱动电路和器件。

芯片Reset复位后,所有I/O口的缺省状态为输入方式,上拉电阻无效,即I/O为输入高阻的三态状态。

以上我们简单介绍了ATmega16单片机的主要特性以及引脚封装。可以看出,小小的一

2-7

块芯片,其内部的组成结构却是相当复杂的。也正式这种复杂,加上多样的程序,才使得单片机在实际应用中变化无穷。 下面,我们从ATmega16的内部结构出发,逐步的介绍它的工作原理和使用方法。

2.3 ATmega16内部结构

图2-4 ATmage16 的结构框图

2-8

图2-4是ATmage16 的结构框图。它是在AVR内核(图2-3)的基础上,具体化的一个

实例。从图中可以看出,ATmega16内部的主要构成部分有:

? AVR CPU部分。包括:ALU运算逻辑单元、32个8位快速访问通用寄存器组(寄存器

文件)、程序计数器PC、指令寄存器、指令译码器。 ? 程序存储器Flash。 ? ?

数据存储器RAM和EEPROM。

各种功能的外围接口、I/O,以及与它们相关的数据、控制、状态寄存器等。

2.3.1 AVR中央处理器CPU

AVR CPU是单片机的核心部分,它由运算逻辑单元ALU、程序计数器PC、指令寄存器、指令译码器等部件组成。 1. 运算逻辑单元ALU

运算逻辑单元ALU的功能是进行算术运算和逻辑运算,可对半字节(4位)、单字节等数据进行操作。如能完成加、减、自动加1、自动减1、比较等算术运算和与、或、异或、求补、循环移位等逻辑操作。操作结果的状态,如产生进位、结果为零等状态信息将影响到状态寄存器SREG相应的标志位。

运算逻辑单元ALU还包含一个布尔处理器,用来处理位操作。它可执行置位、清零、取反等操作。

ATmega16的ALU还能实现无符号数、有符号数以及浮点数的硬件乘法操作。一次硬件乘法操作的时间为2个时钟周期。

2. 程序计数器PC、指令寄存器和指令译码器

程序计数器PC用来存放下一条需要执行指令在程序存储器空间的地址(指向Flash空间)。取出的指令存放在指令寄存器中,然后送入指令译码器产生各种控制信号,控制CPU的运行(执行指令)。

AVR一条指令的长度大多数为16位,还有少部分为32位,因此AVR的程序存储器结构实际上是以字(16位)为一个存储单元的。ATmega16的程序计数器为13位,正好满足了对片内8K字(即手册上的16K字节)的Flash程序存储器空间直接寻址的需要,因此就不能(不支持)在外部扩展更多的程序存储器。

AVR CPU在译码执行一条指令的同时,就将PC中指定的Flash单元中的指令取出,放入指令寄存器中(图中的Instruction Register),构成了一级流水线运行方式。AVR采用一级流水线技术,在当前指令执行的时候,就取出下一条将要执行的指令,加上大多数AVR指令的长度是一个字,就使得AVR CPU实现了一个时钟周期执行一条指令。采用这种结构,减少了取指令的次数,大大提高了CPU的运行速度,同时也提高了取指令操作的(系统的)可靠性。而在其它的CISC以及类似的RISC结构的单片机中,外部振荡器的时钟被分频降低到传统的内部指令执行周期,这种分频最大达12倍(例如,标准8031结构的单片机)。

三. 通用工作寄存器组

在AVR中,由命名为R0~R31的32个8位通用工作寄存器构成一个“通用快速工作寄存器组”,图2-5为通用快速工作寄存器组的结构图。

AVR CPU中的ALU与这32个通用工作寄存器组直接相连,为了使ALU能够高效和灵活地对寄存器组进行访问操作,通用寄存器组提供和支持ALU使用4种不同的数据输入/输出的操作方式:

? ? ?

提供一个8位源操作数,并保存的一个8位结果 提供两个8位源操作数,并保存的一个8位结果 提供两个8位源操作数,并保存的一个16位结果

2-9

提供一个16位源操作数,并保存的一个16位结果

因此,AVR大多数操作工作寄存器组的指令都可以直接访问所有的寄存器,而且多数这样的指令的执行时间是一个时钟周期。例如,从寄存器组中取出两个操作数,对操作数实施

?

处理,处理结果回写到目的寄存器中。这三个过程是在一个时钟周期内完成的,构成一个完整的ALU指令操作。

在传统的基于累加器结构的单片机中(如8051),则需要大量的程序代码来完成和实现在累加器和存储器之间的数据传送。如上面所介绍的操作过程就需要三条指令来实现:第一条完成从寄存器中取出源操作数;第二条完成对操作数实施处理;第三条将处理结果回写。这样就构成了累加器和存储器之间数据传送的瓶颈,影响了指令运行效率。

而在AVR单片机中,由于采用了32个通用工作寄存器构成快速存取寄存器组,相当于用32个通用工作寄存器代替了累加器,从而避免了在传统结构中的那种由于累加器和存储器之间频繁的数据传送交换而形成的瓶颈现象,又进一步提高了指令的运行效率和速度。 在AVR中,通用寄存器组与片内的数据存储器SRAM处在相同的空间,32个通用寄存器被直接映射到用数据空间的前32个地址,如图2-5所示。虽然寄存器组的物理结构与SRAM不同,但是这种内存空间的组织方式为访问工作寄存器提供了极大的灵活性,如可以利用地址指针寄存器X、Y或Z实现对通用寄存器组的间接寻址操作。

寄存器名

R0 R1 R2 ?? R14 R15 R16 ?? R26 R27 R28 R29 R30 R31 RAM空间地址

$0000 $0001 $0002 ?? $000E $000F $0010 $001A $001B $001C $001B $001D $001F

X寄存器低位字节 X寄存器高位字节 Y寄存器低位字节 Y寄存器高位字节 Z寄存器低位字节 Z寄存器高位字节

图2-5 通用工作寄存器组在RAM空间的地址分配图

2.3.2 系统时钟部件

1. 系统时钟

ATmega16的片内含有4种频率(1/2/4/8M)的RC振荡源,可直接作为系统的工作时钟使用。同时片内还设有一个由反向放大器所构成的OSC(Oscillator)振荡电路,外围引脚XTAL1和XTAL2分别为OSC振荡电路的输入端和输出端,用于外接石英晶体等,构成高精度的或其它标称频率的系统时钟系统。

系统时钟为控制器提供时钟脉冲,是控制器的心脏。系统时钟的频率是单片机的重要性能指标之一。系统时钟频率越高,单片机的执行节拍就越快,处理速度也越快。ATmega16最高的工作频率为16M(16MIPS),在8位单片机中算是佼佼者。但并不是系统时钟频率越快就越好,因为当时钟频率越高时,其耗电量也越大,也容易受到干扰(或干扰别人)。因此,在具体设计时,应根据实际产品的需要,尽量采用较低的系统时钟频率,这样不仅能降低了功耗,同时也提高了系统的可靠性和稳定性。

2-10

为ATmega16提供系统时钟源时,有三种主要的选择:(1)直接使用片内的1/2/4/8M的RC振荡源;(2)在引脚XTAL1和XTAL2上外接由石英晶体和电容组成的谐振回路,配合片内的OSC(Oscillator)振荡电路构成的振荡源;(3)直接使用外部的时钟源输出的脉冲信号。方式2和方式3的电路连接见图2-6(a)和2-6(b)。

图2-6(a) 外部接晶体的时钟电路 图2-6(b) 直接使用外部时钟源

方式2是比较常用的方法,由于采用了外接石英晶体作为振荡的谐振回路,因此可以提供比较灵活的频率(由使用晶体的谐振频率决定)和稳定精确的振荡。在XTAL1和XTAL2引脚上加上由石英晶体和电容组成的谐振回路,与内部振荡电路配合就能产生系统需要时钟信号了。最常采用的晶体元件为一个石英晶体和两个电容组成谐振电路。晶体可在0-16MHz之间选择,电容值在20pF-30pF之间(最好与所选用的晶体相匹配)。 当对系统时钟电路的精度要求不高的话,可以使用第1种方式,即使用片内可选择的1/2/4/8M的RC振荡源作为系统时钟源,可以节省外接器件,此时XTAL1和XTAL2引脚悬空。

系统时钟电路产生振荡脉冲不经过分频将直接作为系统的主工作时钟φ,同时它还作为芯片内部的各种计数脉冲,以及各种串口定时时钟等使用(可由程序设定分频比例)。

使用AVR时要特别注意:AVR单片机有一组专用的,与芯片功能、特性、参数配置相关的可编程熔丝位。其中有几个专门的熔丝位(CKSEL3..0)用于配置芯片所要使用的系统时钟源的类型。

新芯片的缺省配置设定为使用内部1M的RC振荡源作为系统的时钟源。因此当第一次使用前,必须先正确的配置熔丝位,使其与使用的系统时钟源类型相匹配。另外,在配置其它熔丝位时,或进行程序下载时,千万不要对CKSEL3..0这几个熔丝位误操作,否则会组成芯片表面现象上的“坏死”,因为没有系统时钟源,芯片不会工作的。

关于ATmega16重要熔丝位的配置、使用方式、以及注意事项请参考附录A。

2. 内部看门狗时钟

在AVR片内还集成了一个1MHz独立的时钟电路,它仅供片内的看门狗定时器(WDT)使用。因此,AVR片内的WDT是独立硬件形式的看门狗,使用AVR可以省掉外部的WDT芯片。使用WDT可以有效的提高系统的可靠行。

2.3.3 CPU的工作时序

AVR CPU的工作是由系统时钟(φ)直接驱动的,在片内不再进行分频。图2-7所示为Harvard结构和快速访问寄存器组的并行指令存取和指令执行时序。CPU在启动后第一个时钟周期T1取出第一条指令,在T2周期便执行取出的指令,并同时又取出第二条指令,依次

2-11

进行。这种基于流水线形式的取指方式,使AVR可以以非常高的速度执行指令,获得高达1MIPS/MHz的效率。

图2-7 并行指令存取和指令执行

图2-8所示为ALU与寄存器堆操作单周期指令的执行时序。在单一时钟周期内,由2个寄存器提供操作数,ALU执行相应的操作,最后将操作结果回送到目的寄存器中。

图2-8 单周期ALU操作

AVR对片内SRAM存储器的访问需要2个时钟周期。图2-9所示,在2个系统时钟周期内,ALU完成对内部数据存储器SRAM访问的操作时序。

图2-9 片内数据SRAM访问时序

2-12

2.3.4 存储器

AVR单片机在片内集成了Flash程序存储器、SRAM数据存储器和EEPROM数据存储器。三个存储器空间互相独立,物理结构也不同。程序存储器为闪存存储器Flash,以16位(字)为一个存储单元,作为数据读取时,以字节为单位,而擦除、写入则是以页为单位的(不同型号AVR单片机一页的大小也不同)。SRAM数据存储器是以8位(字节)为一个存储单元,编址方式采用与工作寄存器组、I/O寄存器和SRAM统一寻址的方式。EEPROM数据存储器也是以8位(字节)为一个存储单元,对其的读写操作都以字节为单位。有关存储器结构的详细介绍将在下一节叙述。

2.3.5 I/O端口

ATmega16有四个8位的双向I/O端口PA、PB、PC、PD,它们对外对应32个I/O引脚,每一位都可以独立地用于逻辑信号的输入和输出。在5伏工作电压下,输出时每个引脚可供出达20mA的驱动电流。而输入时,每个引脚可吸纳最大为40mA的电流,可直接驱动发光二极管LED(一般LED的驱动电流为10mA左右)和小型继电器。

AVR大部分的I/O端口都具备双重功能,分别同片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的I/O 口,如定时器、计数器、串行接口、模拟比较器、捕捉器等。实际上,学习单片机的主要任务,就是了解、掌握单片机I/O端口的功能,以及如何正确设计这些端口与外围电路的连接构成一个嵌入式系统,并编程、管理和运用它们完成各种各样的任务。有关这些内容,将在后面的章节中逐步学习。

2.4 存储器结构和地址空间

2.4.1 支持ISP的Flash程序存储器

AVR单片机包括1K~128K字节的片内支持ISP的Flash程序存储器。由于AVR所有指令为16位字或32位双字,故Flash程序存储器的结构为(512B~64Kb)x 16位。Flash存储器的使用寿命最少为1万次写/擦循环。ATmega16单片机的程序存储器为8K x 16(16K x 8),程序计数器PC宽为13位,以此来对8K字程序存储器地址进行寻址。 程序存储器的地址空间与数据存储器的地址空间是分开的,地址空间从$000开始。如要在程序存储器中使用常量表,则常量表可以被设定在整个Flash地址空间中。

2.4.2 数据存储器SRAM空间

图2-10给出ATmega16单片机SRAM数据存储器的组织结构。全部共1120个数据存储器地址为线性编址,前96个地址为寄存器组(32个8位通用寄存器),I/O寄存器(64个8位I/O寄存器),分配在SRAM数据地址空间的$0000~$001F,$0020~$005F。接下来的1024个地址是片内数据SRAM,地址空间占用$0060~$045F。

CPU对SRAM数据存储器的寻址方式分为5种:直接寻址、带偏移量的间接寻址、间接寻址、带预减量的间接寻址和带后增量的间接寻址。在寄存器堆中,寄存器R26~R31具有间接寻址指针寄存器的特性。ALU可使用直接寻址的方式对整个存储器空间寻址操作。带偏移量的间接寻址方式可以寻址由寄存器Y和Z给出的基本地址附近的63个地址。当使用自动预减量和后增量的间接寻址方式时,3个16位的地址寄存器X、Y和Z都可作为间接寻址的地址指针寄存器,寄存器中的地址指针值将根据操作指令的不同,自动被增加或减小。

2-13

32个通用工作寄存器,64个I/O寄存器,以及ATmega16单片机中1024个字节的数据SRAM,都可通过上述的寻址方式进行访问操作。

程序存储器空间 $0000 Flash程序 存储器 (8Kx16 或 16Kx8) $1FFF 数据存储器空间 $0000 32个通用 寄存器 $001F $0020 64个I/O 寄存器 $005F $0060 内部SRAM 数据存储器 (1024x8) $045F EEPROM数据存储器空间 $0000 EEPROM 数据 存储器 (512x8) $01FF 图2-10 ATmeag16存储器结构 ATmega16不支持外部SRAM扩展。

2.4.3 内部EEPROM 存储器

AVR系列单片机还包括64B~4K字节的EEPROM数据存储器。它们被组织在一个独立的数据空间中。这个数据空间采用单字节读写方式。EEPROM 的使用寿命至少为 10万次写/擦循环。ATmega16的EEPROM容量是512字节,地址范围为$0000~$01FF。EEPROM数据存储器可用于存放一些需要掉电保护,而且比较固定的系统参数、表格等。

2.5 通用寄存器组与I/O寄存器

全面熟练地理解、掌握AVR的通用寄存器组与I/O寄存器的性能、特点、功能、设置和使用,是精通和熟练使用AVR单片机的关键。由于AVR有32个通用寄存器和64个I/O寄存器,其功能、特点及使用方法涉及到整个AVR单片机的全部功能和特性,因此相对复杂。学习者不可能一下就能全部掌握它们的应用,只有通过边学习、边实践,逐步深入,加深理解。本节仅给一个总体的介绍,各个不同寄存器具体的使用将在以后相关的章节中加以详细描述。

2.5.1 通用寄存器组

图2-11为AVR单片机中32个通用寄存器的结构图。在AVR指令集中,所有的通用寄存器操作指令均带有方向的,并能在单一时钟周期中访问所有的寄存器。

用户在使用汇编语言编写程序时,应注意如何正确使用AVR中32个通用的寄存器。因为这32个通用寄存器的功能还是有一定的区别。尤其是R16~R31后16个寄存器能实现的操作比R0~R15要多,如SBCI、SUBI、CPI、ANDI、ORI以及直接装入常数到寄存器LDI,和乘法指令仅适用于寄存器组中后半部分的寄存器(R16~R31)。另外,R26~R31还构成3个16位的地址指针寄存器X、Y、Z,所以一般情况下不要作为它用。具体指令的介绍见第三章。

2-14

如图2-11所示,每个通用寄存器还被分配在AVR的数据存储器空间中,他们直接映射到数据空间的前32个地址,因此也可以使用访问SRAM的指令对这些寄存器进行访问,但此时在指令中应使用该寄存器在SRAM空间的映射地址。通常情况下,最好是使用专用的寄存器访问指令对通用寄存器组进行操作,因为这类寄存器专用操作指令不仅功能强大,而且执行周期也短。

AVR寄存器组最后的6个寄存器R26~R31具有特殊的功能,这些寄存器每两个合并成一个16位的

寄存器名称 R0 R1 R2 …… R13 R14 R15 …… R26 R27 R28 R29 R30 R31 对应SRAM地址 $0000 $0001 $0002 $000D $000E $000F $001A $001B $001C $001D $001E $001F 附加功能 X-寄存器低字节 X-寄存器高字节 Y-寄存器低字节 Y-寄存器高字节 Z-寄存器低字节 Z-寄存器高字节 图2-11 通用寄存器组结构图

寄存器,作为对数据存储器空间(使

用X、Y、Z)以及程序存储器空间(仅使用Z寄存器)间接寻址的地址指针寄存器。这三个间接寄存器X、Y、Z由图2-12定义。在不同指令的寻址模式下,利用地址寄存器可实现地址指针的偏移、自动增量和减量(参考不同的指令)等不同形式的间址寻址操作。

X寄存器

Y寄存器

Z寄存器

15 7 0 27($001B) 15 7 0 29($001D) 15 7 0 27($001F) 0 7 0 R26($001A) 0 7 0 R26($001C) 0 7 0 R26($001E) 图2-12 X、Y、Z寄存器

2.5.2 I/O寄存器

表2.1列出了ATmega16单片机的I/O寄存器的地址空间分配、名称和功能。

表2.1 ATmega16 I/O寄存器空间分配表

十六进制地址 $00 ($0020) $01 ($0021) $02 ($0022) $03 ($0023) $04 ($0024) $05 ($0025) $06 ($0026) $07 ($0027) $08 ($0028) $09 ($0029) $0A ($002A) $0B ($002B) 名 称 TWBR TWSR TWAR TWDR ADCL ADCH ADCSRA ADMUX ACSR UBRRL UCSRB UCSRA 功 能 TWI波特率寄存器 TWI状态寄存器 TWI从机地址寄存器 TWI数据寄存器 ADC数据寄存器低字节 ADC数据寄存器高字节 ADC控制和状态寄存器 ADC多路选择器 模拟比较控制和状态寄存器 USART波特率寄存器低8位 USART控制状态寄存器B USART控制状态寄存器A 2-15

BODLEVEL=0 tBOD VHYST BOD检测的低 电压最小宽度 BOD检测迟滞电压 BODLEVEL=1 BODLEVEL=0 3.6 4.0 2 2 50 4.5 μs mV 当任何一个复位信号产生时,AVR将进行复位操作。复位操作过程并不需要时钟源处于运行工作状态(AVR采用异步复位方式,提高了可靠性)。在MCU复位过程中,所有的I/O寄存器被设为初始值,程序计数器PC置0。当系统电压高于上电复位门限Vpot(或BOD复位门限电压)时,复位信号撤消,硬件系统Delay Counters将启动一个可设置的计数延时过程(延时时间为Ttout,由一组溶丝位SUT、CKSEL确定)。经过一定的延时后,AVR才进行系统内部真正的复位启动(Internal Reset)。采用这种形式的复位启动过程,能够保证电源电压在达到稳定后单片机才进入正常的指令操作。

AVR复位启动后,由于程序计数器PC置为$0000,因此CPU取出的第一条指令就是在Flash空间的$0000处,即复位后系统程序从地址$0000处开始执行(指非BOOT LOAD方式启动)。通常在$0000地址中放置的指令为一条相对转移指令RJMP或JMP指令,跳到主程序的开始。这样,系统复位启动后,首先执行$0000处的跳转指令,然后转到执行主程序的指令。

由此可见,AVR的复位过程考虑的非常周到,也是非常可靠的。AVR单片机采用5个复位源,异步复位操作,以及内部可设置的延时启动,大大提高了芯片的抗干扰能力和整个系统的可靠性,这在工业控制中非常重要,同时也是AVR单片机的优点之一。与此同时,AVR内部的MCU控制和状态寄存器MCUCSR还将引起复位的复位源进行了记录,用户程序启动后,可以读取MCUCSR中的标记,查看复位是由于何种情况造成的,是正常复位还是异常复位,从而根据实际情况执行不同的程序,实现不同的处理。这对于实现高可靠的系统控制,掉电保护处理、故障处理等应用非常有用,具体请参考AVR的器件手册说明。

1.上电复位

AVR内部含有上电复位POR(Power_on Reset)电路。POR确保了只有当Vcc超过一个安全电平时,器件才开始工作,如图2-15、2-16所示。

图2-15 MCU上电复位启动,RESET连到Vcc

图2-16 MCU上电复位启动,RESET由外部控制

无论何时,只要Vcc低于检测电平Vpot时,器件进入复位状态。一旦当Vcc超过门限电压Vpot,而RESET电压也达到Vrst时,将启动芯片内部的一个可设置的延时计数器(图2-14中的Delay Counters)。在延时计数器溢出之前,器件一直保持复位状态(Internal Reset保持高电平)。经过Ttout时间后,延时计数器溢出,将内部复位信号(Internal Reset)拉低,CPU才开始正式工作。

2.外部复位

外部复位是由外加在RESET引脚上的低电平将产生的。当RESET引脚被拉低于Vrst的时间大于1.5μs时既触发复位过程,见图2-17。当RESET引脚电平高于Vrst后,将启动内部可设置的延时计数器(图2-14中的Delay Counters)。在延时计数器溢出之前,器件一直保持复位状态(Internal Reset保持高电平)。经过Ttout时间后,延时计数器溢出,将内部复位信号(Internal Reset)拉低,CPU才开始正式工作。

2-21

图2-17 外部RESET复位

3.掉电检测(BOD)复位

ATmega16有一个片内的BOD( Brown-out Detection)电源检测电路,用于在系统运行时对系统电压VCC的检测,并同一个固定的阈值电压相比较。BOD检测阈值电压可以通过BODLEVEL熔丝位设定为2.7V或4.0V。BOD检测阈值电压有迟滞效应,以避免系统电源的尖峰毛刺误触发BOD检测器。阈值电平的迟滞效应可以理解为:上阈值电压VBOT+ = VBOT + VHYST/2,下阈值电压VBOT- = VBOT - VHYST/2。

BOD检测电路可以通过编程BODEN熔丝位来置成有效或者无效。当BOD被置成有效,并且VCC电压跌到下阈值电压VBOT-(如图2-18所示)以下时既触发复位过程,CPU进入复位状态。当VCC回升,而且超过上阈值电压VBOT+ 后,再经过设定的启动延时时间,CPU重新启动运行。注意只有当VCC电压低于阈值电压并且持续tBOD后,BOD电路才启动延时计数器计数。

图2-18 掉电检测BOD复位

4.看门狗复位

ATmega16片内还集成一个独立的看门狗定时器WDT。该WDT由片内独立的1M振荡器提供时钟信号,并且可用专用的熔丝位或由用户通过指令控制WDT的启动和关闭,以及设置和清零计数值。当WDT启动计数后,一旦发生计数溢出,它将触发产生一个时钟周期宽度的复位脉冲。脉冲的上升沿将使器件进入复位状态,脉冲的下降沿启动延时计数器计数,经过设定的启动延时时间,CPU重新开始运行(图2-19)。使用WDT功能,可以防止系统受到干扰而引起的程序运行紊乱和跑飞,提高了系统的可靠性。

图2-19 WDT溢出复位

2.6.3 对AVR的编程下载

现在,单片机系统程序的编写、开发和调试都是借助于通用计算机PC完成的。用户首

2-22

先在PC机上通过使用专用单片机开发软件平台,编写由汇编语言或高级语言构成的系统程序(源程序),再由编译系统将源程序编译成单片机能够识别和执行的运行代码(目标代码)。运行代码的本身是一组二进制的数据,在PC中对于纯二进制码的数据文件一般是采用BIN格式保存的,以“bin”作为文件的扩展名。但是实际使用中,通常使用的是一种带定位格式的二进制文件:HEX格式的文件,一般以“hex”作为文件的扩展名(HEX文件格式说明见附录?)。

对单片机的编程操作,通常也称为程序下载,是指以特殊手段和软硬件工具,对单片机进行特殊的操作,以实现下面的3种功能:

? 将在PC机上生成的该单片机系统程序的运行代码写入单片机的程序存储器中。

? ?

用于对片内的Flash、EEPROM进行擦除、数据的写入(包括运行代码)、和数据的读出。

实现对AVR配置溶丝位的设置;芯片型号的读取;加密位的锁定等。 AVR单片机支持多种形式的编程下载方式: ? 高压并行编程方式。

对于外围引脚数大于20的AVR芯片,一般都支持这种高压并行编程方式。这种编程方式也是最传统的单片机的程序下载方式,其优点是编程速度快。但使用这种编程方式需要占用芯片众多的引脚和12V的电压,所以必须采用专用的编程器单独对芯片操作。这样AVR芯片必须从PCB板上取下来,不可以实现芯片在线(板)的编程操作,因此这种方式不适合系统调试过程以及产品的批量生产需要。

? 串行编程方式(ISP)。

串行编程方式是通过AVR芯片本身的SPI或JTAG串行口实现的,由于编程时只需要占用比较少的外围引脚,所以可以实现芯片的在线编程(In System Programmable),不需要将芯片从PCB板上取下来,所以串行编程方式也是最方便和最常用的编程方式。

串行编程方式还细分成SPI、JTAG方式,前者表示通过芯片的SPI串口实现对AVR芯片的编程操作,后者则是通过JTAG串口来实现的。AVR的许多芯片都同时集成有SPI和JTAG两种串口,因此可以同时支持SPI和JTAG的编程。使用JTAG方式编程的优点是,通过JTAG口还可以实现系统的在片实时仿真调试(On Chip Debug),缺点是需要占用AVR的4个I/O引脚。而采用SPI方式编程,只需要一跟简单的编程电缆,同时可以方便的实现I/O口的共用,因此是最常使用的方式。其不足之处是不能实现系统的在片实时仿真调试。

? 其它编程方式 一些型号的AVR还支持串行高压编程方式和IAP(In Application Programmable)在运行编程方式。串行高压编程是替代并行高压编程的一种方式,主要针对8个引脚的Tiny系列的AVR使用。IAP在运行编程方式则是采用了ATMEL称为自引导加载(Boot Load)技术实现的,往往在一些需要进行远程修改更新系统程序,或动态改变系统程序的应用中才采用。 ATmega16片内集成了16K字节的支持系统在线可编程(ISP)和在应用可编程(IAP)的Flash程序存储器,以及512个字节的EEPROM数据存储器。另外在它的内部,还有一些专用的可编程单元-熔丝位,用于加密锁定和对芯片的配置等。对ATmega16编程下载操作,就是在片外对上述的存储器和熔丝单元进行读/写(烧入)以及擦除的操作。

由于ATmega16片内含有SPI和JTAG口,所以对ATmega16能使用3种编程的方式:高压并行编程、串行SPI编程、串行JTAG编程。在本书中将主要介绍和采用串行SPI编程方式。

2.6.4 ATmega16的熔丝位

在AVR内部有多组与器件配置和运行环境相关熔丝位,这些熔丝位非常重要,用户可以

2-23

通过设定和配置熔丝位,使AVR具备不同的特性,以更加适合实际的应用。下面只介绍在开始学习和使用ATmega16时,需要特别注意和关心的重要熔丝位的使用配置,全部熔丝位的定义和使用配置见附录A。

ATmega16单片机在售出时,片内的Flash 存储器和EEPROM 存储器阵列是处在擦除的状态(即内容 = $FF),且可被编程。同时其器件配置熔丝位的缺省值为使用内部1M的RC振荡源作为系统时钟! 1.存储器加密锁定位

ATmage16有2个加密锁定位LB1和LB2,用于设定对片内存储器的加密方式,用户可在编程方式下,对LB1、LB2不编程(1),或编程(0),从而获得对片内存储器不同的加密保护方式,见表2.3。

表2.3 加密锁定位保护方式

加 密 锁 定 位 保 护 方 式 模 式 LB2 LB1 1 1 1 无锁定方式(无加密),出厂状态 2 1 0 禁止对Flash、EEPROM、溶丝位的再编程 禁止对Flash、EEPROM、加密锁定位、溶丝位的再编程和3 0 0 校验,禁止对加密锁定位、溶丝位的再编程 需要进一步说明是: ?

在AVR的器件手册中,使用已编程(Programmed)和未编程(Unprogrammed)定义加密位和熔丝位的状态。“Unprogrammed”表示熔丝状态为“1”(禁止),“Programmed”表示熔丝状态为“0”(允许),即 1:未编程 ? ? ?

0:编程

AVR的加密位和熔丝位可多次编程,不是OPT熔丝。

AVR芯片加密锁定后(LB2/LB1 = 1/0,0/0),在外部不能通过任何方式读取芯片内部Flash和EEPROM中的数据,但熔丝位的状态仍然可以读取,不能修改配置。 需要重新下载程序时,或芯片被加密锁定后,或发现熔丝位配置不对,都必须先在编程状态使用芯片擦除命令,清除芯片内部存储器中的数据,同时解除加密锁定。然后重新下载运行代码和数据,修改和配置相关的熔丝位,最后再次配置芯片的加密锁定位。 ?

编程状态的芯片擦除命令是将Flash和EEPROM中的数据清除,并同时将两位锁定位状态配置成无锁定状态(LB2/LB1 = 1/1)。但芯片擦除命令并不改变其它熔丝位的状态。

下载编程的正确的操作程序是:在芯片无锁定状态下,下载运行代码和数据,配置相关的熔丝位,最后配置芯片的加密锁定位。

?

2.系统时钟类型的配置

ATmega16可以使用多种类型的系统时钟源,最常用的为2种:使用内部的RC振荡源(1M/2M/4M/8M)和外接晶体(晶体可在0-16MHz之间选择)配合内部振荡放大器构成的振荡源。具体系统时钟类型的配置由CKOPT和CKSEL[3-0]共5个熔丝设定,表2.4、表2.5给出了具体的配置值。用户在使用中,首先要根据实际使用情况进行正确的设置,而且千万注意不要对这些熔丝位误操作!

2-24

AVR提供了用户更多的灵活选择系统时钟的可能性,以满足和适合实际产品的需要。 ATmega16在片内集成有内部可校准的RC振荡器,能提供固定的1/2/4/8MHZ的系统时钟,这些频率是在5V,25℃时的标称数值。CKOPT和CKSEL熔丝按表2.4编程配置时,可以选择4种内部RC振荡源之一作为系统时钟使用,此时将不需要外部的元件。

表2.4 系统时钟类型为使用内部RC振荡源

CKOPT 1 1 1 1 CKSEL[3..0] 0001 0010 0011 0100 工作频率范围 (MHz) 1.0 (出厂设定) 2.0 4.0 8.0

当产品对系统时钟的精度要求比较高,或需要使用一些特殊频率的系统时钟场合时,如使用了USART通信接口,系统时钟频率需要使用4.6080M/7.3728M/11.0592M时,就要采用第2种方式来组成系统时钟源:使用外接晶体(晶体可在0-16MHz之间选择)配合内部振荡放大器构成振荡源,具体连接电路为图2-6(a)。此时需要将CKOPT和CKSEL熔丝按表2.5编程配置。

表2.5 使用外部晶体与片内振荡放大器构成的振荡源

熔丝位 工作频率范围 C1、C2容量(pF) (MHz) (仅适用石英晶振) CKSEL[3..0] 101x 110x 111x 101x,110x,111x 0.4-0.9 0.9-3.0 3.0-8.0 ≥1.0 仅适合陶瓷振荡器 12-22 (应与使用晶体配合) 12-22 (应与使用晶体配合) 12-22 (应与使用晶体配合) CKOPT 1 1 1 0 在表2.5中,当CKOPT = 0时,振荡器的输出振幅较大,容易起振,适合在干扰大的场合以及使用的晶体超过8M时的情况下使用。而CKOPT = 1时,振荡器的输出振幅较小,这样可以减小对电源的消耗,对外的电磁幅射也较小。

2.6.5 AVR单片机的工作状态

当AVR芯片的Vcc与系统电源接通后,根据RESET引脚的电平值的不同,单片机将进入不同的状态:复位状态、常规工作状态、编程状态。 1. RESET引脚电平为高

通常情况下,RESET引脚通过一个上拉电阻接系统电源,为高电平“1”,见图2-13。在此条件下,一旦接通电源,AVR将进入上电复位状态。经过短暂的内部的复位操作后,芯片便进入了常规的工作状态(BOD和WDT引起的复位类同)。

AVR处在常规工作状态时,有两种工作方式:正常程序执行工作方式和休眠节电工作方式。

?

正常程序执行工作方式

正常程序执行工作方式是单片机的基本工作方式。由于硬件的复位操作将程序计数器置为零(PC=$0000),因此程序的执行总是从Flash地址的$0000开始的(指非BOOT LOAD方式启动)。

对于ATmega16来讲,Flash地址的$0002到$0028是中断向量区(详见第六章),所以真正实际要开始运行的程序代码一般放在从$002A以后的程序地址空间中。标准的做法是在Flash的$0000单元中放置一条转移指令JMP或RJMP,使得CPU在复位重新启动后,首先执

2-25

行该转移指令,跳过中断向量区,转到执行实际程序的开始处。典型的程序结构如下:

Flash空间地址

$0000 ? ? ? $002A ??

指 令 字

jmp RESET ? ? ?

RESET: ldi r16,high(RAMEND) ??

说 明

;复位中断向量

;向量区

;主程序开始 ;??

? 休眠节电工作方式

休眠节电工作方式是使单片机处于低功耗节电的一种工作方式。当单片机需要处于长时间等待外部触发信号,待有外部触发后才做相应的处理,或每隔一段时间才需要做处理的情况时,可以使用休眠节电工作方式,以减小对电源的消耗。CPU处于等待的时候(待机状态)可进入休眠节电工作方式,此时CPU暂停工作,不执行任何指令。在休眠节电工作方式中,只有部分单片机的电路处于工作状态,而其它的电路停止工作,这样就可节省单片机的对电源消耗,形成系统的省电待机状态。一旦有外部的触发信号,或等待时间到,CPU从休眠状态中被唤醒,重新进入正常程序执行工作方式。

ATmega16有6种不同的休眠模式,每一种模式对应的电源消耗也不同,被唤醒的方式也有多种类型,用户可以根据实际的需要进行选择。

休眠节电工作方式对使用电池供电的系统非常重要,AVR提供了更多的休眠模式,更加符合和适应实际的需要。如ATmega16处在掉电休眠模式状态,其本身的耗电量小于1μA。

2. RESET引脚电平为低

AVR通电后,如果RESET脚的电平被外部拉为低电平“0”,则芯片将进入和处在复位状态,见图2-16和图2-17。通常情况下,该复位状态一直延续到RESET脚的低电平被撤消。一旦RESET恢复了高电平,AVR将重新启动,进入常规工作状态。利用该特点可以实现对AVR系统的人工复位或外部强制复位操作。

尤其需要说明的是,一旦RESET脚的电平被外部拉低,当满足某些特殊条件后,芯片将进入编程状态。例如,如果芯片带有SPI接口,支持SPI串行编程,则通过以下方式将使芯片进入SPI编程状态:

?

外部将SPI口的SCK引脚拉低,然后外部在RESET引脚上施加一个至少为2个系统周期以上低电平脉冲;

? 延时等待20ms后,由外部通过AVR的SPI口向芯片下发允许SPI编程的指令; 在AVR的器件手册的存储器编程(Memory Programming)一章中串行下载(Serial Downloading)一节里,详细介绍了利用AVR的SPI接口实现ISP编程的硬件连接、编程方式状态的进入过程和串行编程的命令等。

一旦芯片进入编程状态,就可以通过SPI口将运行代码写入AVR的程序存储器,对片内的Flash、EEPROM进行擦除、数据的写入(包括运行代码)、和数据的读出,以及实现对AVR配置溶丝位的设置、芯片型号的读取和加密位的锁定等操作了。

2.6.6 支持ISP编程的最小系统设计

在本小节中给出一个最基本的、典型的支持ISP编程的AVR最小系统硬件图。尽管ATmega16的SPI和JTAG口都可以实现ISP在线编程,但采用SPI口实现ISP在线编程是最常用的方式,因为这样不会造成AVR的I/O口浪费。

作为图2-13以ATmega16芯片构成的AVR最小系统中,并没有考虑如何实现对AVR的编程。如果完全按图2-13完成硬件系统后,要对AVR编程时,就必须将芯片从PCB板上取下,

2-26

放到专用的编程设备上将才能系统的执行代码下载到芯片中,然后再将芯片插回到PCB上,对于系统调试和生产都非常不方便。

图2-20在图2-13的基础上增加了一个ISP编程下载口,该口的2、3、4、5脚同芯片SPI接口的MOSI(PB5)、MISO(PB6)、SCK(PB7)和RESET引脚连接。当需要改动AVR的熔丝位配置,或将编译好的运行代码烧入的AVR的FlashROM中时,就不需要将芯片从PCB板上取下了。只要将一根简单的编程线插在该编程下载口上,利用PC机就可以方便的实现上面的操作了。

如2.6.5中所介绍,当PC机对AVR编程时,需要先将SCK和RESET引脚拉低,使AVR芯片进入SPI编程状态,然后通过SPI口进行下载操作。所以,在设计AVR系统硬件时,如考虑使用SPI口实现ISP的功能,图中的R1电阻不可省略。此时R1起到了隔离作用,正是有了R1,才能使用户在外部能够对RESET脚施加低电平(0伏)。当编程下载完成后,外部一旦释放掉RESET,该引脚通过R1又被拉成高电平,AVR就直接进入了正常运行工作状态。R1的阻值在5k-10k之间,太大和太小都不合适。如果系统不需要支持ISP功能话,则可将R1省掉,把RESET引脚与Vcc连接。

AVR的PB5、PB6、PB7与编程下载口连接,在编程状态时这3个引脚用于下载操作。编程完成拔掉下载线,芯片进入正常工作后,PB5、PB6、PB7仍可作为普通的I/O口或AVR的SPI口使用,受AVR的控制,这是使用SPI口实现ISP功能的优点之一。需要注意的是,如果系统中使用了这3个引脚,PCB板上这3个引脚已经与外围器件连接在一起的情况下,就需要对外围的连接情况进行分析。如果外围连接在上电情况时表现为强上拉或强下拉(最极端情况为接高电平或GND),那么为了保证AVR的SPI功能的正常工作,应该如图2-20中所示,串入3个隔离电阻,阻值在2K左右。

图2-20支持ISP编程的最小系统设计

对于不同的AVR芯片,使用SPI方式进行下载编程的硬件连接口,操作命令和时序请参考与该器件相关器件手册中详细说明,会有所变化(如ATmega128),但基本方式相同。同

2-27

使用其它类型的单片机(如8051)一样,可以采用专用的写入设备对进行编程下载,但AVR提供了更方便的在线(ISP)串行下载的方法,用户只要制作一个简单的带隔离电路的下载线,就可直接使用个人电脑PC机的打印机口实现AVR的Flash、EEPROM以及熔丝配置位进行编程操作,在第5章中将给出利用ISP功能的编程下载具体操作实际过程与相关的资料等。

2.7 AVR单片机内部资源的扩展和删减

以上我们以ATmega16为典型介绍了AVR单片机的基本结构、性能和特点。ATMEL公司为满足不同的需求,在AVR基本内核的基础上,对芯片的内部资源进行了相应的扩展和删减,形成了AVR单片机几十种型号的芯片。尽管它们的功能和外部的引脚定义和封装各有不同,小到8-12个引脚,多到100个引脚,但它们的内核结构相同,指令相容,用户可根据实际需要进行选择。

2.8 思考与练习

1. 典型单片机由哪几部分组成?每部分的基本功能和作用是什么? 2. 了解AVR单片机的主要特点和性能。

3. 熟悉ATmega16的外围引脚名称和基本作用。

4. AVR系列单片机内部有哪些主要的逻辑部件?

5. AVR系列单片机的CPU是由哪些部件组成?它们的具体作用是什么?如何协同工作? 6. AVR单片机系统有2个时钟系统,他们如何构成?其作用如何? 7. AVR单片机是如何实现每MHz高达1MIPS的处理能力的? 8. 说明AVR单片机通用寄存器组的作用和功能? 9. 说明AVR单片机I/O寄存器的作用和功能?

10.ATmega16单片机的存储器有几种类型?它们是如何构成和组织的?有何作用? 11.ATmega16单片机的数据存储器的地址空间是如何分布的?

12.AVR单片机的SRAM存储器和EEPROM存储器有和区别?用途是什么?

13.AVR单片机熔丝位的作用和用途使什么,你认为本章中所介绍的那些熔丝位非常重要,

并说明原因。 14.AVR单片机的I/O寄存器空间是如何寻址? 15.简述状态寄存器(SREG)各个控制位的作用。

16.熟悉堆栈指针寄存器(SP)和堆栈的作用,并说明AVR单片机堆栈是如何工作的。 17.使用电子电路版图设计软件(如:Protel)画出用ATmega16构成最小系统的电路图,并说明各个元器件的作用。

18.AVR单片机有几种复位方式?它们是如何复位的?这些复位方式有何区别,在实际应用

中应该如何使用这些复位方式?复位以后AVR单片机怎样开始工作?

19.在设计AVR系统程序时,程序存储器最低几十个存储单元一般应放置什么指令?为什

么? 20.AVR有几种复位方式?仔细理解和分析它们的复位条件。并说明AVR复位系统所具备的

优点。 21.AVR系统上电后,一旦外部把AVR的RESET引脚拉低,使AVR进入复位状态后,接下来

变化将如何?

22.对AVR编程下载主要的目的是什么?对AVR的编程下载的方式有哪些?各有何优点和缺

2-28

点,各适合在那些情况下使用?

23.阅读ATmega16的英文版器件手册,找到其中与本章所介绍内容相关的部分,更仔细的

进行学习和理解。

24.在图2-20支持ISP功能的最小系统中,R1的值取10欧姆或10M可以吗?请分析原因

并说明理由。 25.对于图2-20支持ISP功能的最小系统,可以使用外部晶体构成系统时钟,也可使用芯

片内部4M的RC振荡源。两种方式各有何优点和缺点?熔丝位应该如何配置? 26.对于图2-20支持ISP功能的最小系统,如果AVR的熔丝位配置为使用外部晶体,但图

中的晶体、C1、C2、R2并没有使用,此时会产生什么情况,如何解决? 27.对于图2-20支持ISP功能的最小系统,如果PB5、PB6、PB7这3个引脚与外围器件连

接,且为强上拉或强下拉,那么为什么要串入3个隔离电阻?请分析3个电阻的作用,并说明阻值在2K左右为合适的。

28.用ATmega16构成一个简单的系统,该系统可以分别控制8个半导体发光二极管 LED闪

烁,设计并画出系统的电原理图,并说明使用元器件的作用。 29.如何用ATmega16构成一个简单的嵌入式系统,该系统可以控制1个LED七段数码管,

设计并画出系统的电原理图,并讲述设计思路。 30.一般嵌入式系统经常采用6-8个LED数码管作为显示输出,如时钟显示、温度显示等。

如何用ATmega16构成一个系统,该系统可以控制8个LED七段数码管,设计并画出系统的电原理图,并说明所使用芯片各个引脚的作用和各个元器件的数值、作用和设计思

路。 本章参考文献:

1.《ATmega16数据手册》(英文,CDROM),ATMEL,www.atmel.com 2.《AVR硬件设计要点》(英文,CDROM),ATMEL,www.atmel.com 3.《EMC设计要点》(英文,CDROM),ATMEL,www.atmel.com

2-29

本文来源:https://www.bwwdw.com/article/d6c5.html

Top