1.2 ATmega32单片机简介
通过前面的介绍,你一定对AVR系列单片机有了最基本的认识。在8位AVR系列单片机中,megaAVR系列是极具性价比的产品,不乏像ATmega16这样的明星,几乎所有介绍AVR的书籍都是以它为例的。本书选取的目标芯片是megaAVR系列的ATmega32单片机,它与ATmega16在CPU、外围模块上大致相同,只在存储器配置和中断向量的排列顺序上有所差别。正因如此,本书的内容和示例代码同样适用于ATmega16。
1.2.1 片内资源配置
ATmega32单片机片内资源配置如表1-1所示。为了便于对比,我们选取了同一系列的几款有代表性的产品一并列出。
表1-1 AVR系列片内资源配置(部分)
从表1-1中我们可以看出ATmega32单片机片内资源十分丰富。在存储器的配置上,主要有32K字节基于FLASH工艺的程序存储器(擦写寿命10000次)、2K字节的SRAM数据存储器以及1K字节非易失性的E2PROM存储器(擦写寿命100000次);在接口配置上,ATmega32单片机有32个I/O口、1个SPI串行接口、1个TWI两线串行接口、1个串行USART接口以及用于边界扫描的JTAG接口等,JTAG接口支持片上编程与调试功能;在功能模块配置上,主要有2个具有独立预分频器和比较功能的8位定时/计数器、1个具有比较和捕捉功能的16位定时器/计数器、8路10位具有可选差分输入及可编程增益的ADC模块、4通道PWM、1个模拟比较器模块。ATmega32单片机片内有经过标定的RC振荡器,在对时钟要求不是很严格的情况下可以作为系统时钟使用。此外还配备了具有独立振荡器的看门狗定时器和仅需两个时钟周期的硬件乘法器等。
1.2.2 ATmega32的内部结构
ATmega32单片机的内部结构如图1-5所示。构成ATmega32的核心部分是AVR CPU,它由运算逻辑单元ALU、程序计数器PC、指令寄存器及指令译码器等部件组成。与传统51系列单片机不同的是,AVR CPU内部使用了32个通用工作寄存器构成快速存取寄存器组,与运算逻辑单元ALU直接相连,代替了传统意义上的累加器,从而避免了由于累加器和存储器之间频繁的数据传送而形成的瓶颈现象,这种结构大大提高了代码的执行效率,具有比CISC微控制器高出约10倍的数据吞吐量。
图1-5 ATmega32单片机的内部结构
除了AVR CPU之外,ATmega32单片机对外设的组织采用了类似模块化的结构,不同的功能被定义成相对独立的模块,如定时器、SPI、看门狗、E2PROM等。不同的单片机型号模块的配备不尽相同,CPU通过内部的8位数据总线与这些模块进行数据通信。AVR单片机的这种模块化结构既有利于布局产品线,又方便了不同型号单片机之间的代码移植。
1.2.3 ATmega32的封装
ATmega32单片机有三种不同的封装形式,其中PDIP封装的单片机引脚如图1-6所示,TQFP/MLF封装的单片机引脚如图1-7所示。下面我们将以PDIP封装的ATmega32单片机为例对其引脚功能进行说明。
图1-6 PDIP封装
PDIP封装的ATmega32单片机是双列直插式结构,共有40个引脚。从图1-6中我们可以看出,ATmega32单片机有四组8位双向I/O端口,分别记作PA、PB、PC、PD。以端口PA为例,它的每一个I/O口从最低位至最高位依次称为PA0、PA1…PA7。AVR单片机的大部分I/O口都具备双重功能,这些功能在特定的条件下会被使能。以PD0(RXD)端口为例,当串行接口USART功能被使能时,PD0端口的I/O功能就会被串行通信的输入功能所取代。ATmega32单片机I/O端口具体功能如下:
图1-7 TQFP/MLF封装
- Vcc引脚:数字电路的电源。
- GND引脚:接地。
- RESET引脚:复位输入引脚。在该引脚上出现持续时间超过最小门限时间的低电平将会引起单片机复位。
- XTAL1引脚:反向振荡放大器与片内时钟操作电路的输入端。
- XTAL2引脚:反向振荡放大器的输出端。
- AVCC引脚:A/D转换器的电源端。使用ADC模块时应通过一个低通滤波器与Vcc连接。
- AREF引脚:A/D转换基准电压输入引脚。
- PA7-PA0引脚:PORTA端口的8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,可以使能内部上拉电阻,复位时端口A处于高阻抗的输入状态。PORTA端口与A/D转换器的模拟输入端复用。
- PB7-PB0引脚:PORTB端口的8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,可以使能内部上拉电阻,复位时端口B处于高阻抗的输入状态。PORTB端口与定时/计数器、外部中断以及SPI等功能复用。
- PC7-PC0引脚:PORTC端口的8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,可以使能内部上拉电阻,复位时端口C处于高阻抗的输入状态。PORTC端口与定时/计数器、TWI和JTAG接口功能复用,如果JTAG接口使能,引脚PC5(TDI)、PC3(TMS)、PC2(TCK)的上拉电阻被激活。
- PD7-PD0引脚:PORTD端口的8位双向I/O口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,可以使能内部上拉电阻,复位时端口D处于高阻抗的输入状态。PORTD端口与USART、外部中断、定时/计数器等功能复用。
Atmega32单片机I/O口的复用情况详见表1-2。
表1-2 Atmega32单片机端口的第二功能
1.2.4 I/O端口的构成
图1-8 I/O口等效电路
ATmega32单片机的I/O端口等效电路如图1-8所示。我们前面说过,AVR单片机的I/O口是真正意义上的I/O口,每个I/O口均可单独设置为输入或输出两种状态,每个I/O口都有上下两个钳位二极管用于保护引脚不至于因过压而损坏。与51单片机不同的是,AVR单片机的I/O口在使用前需要设定其输入或输出方向。当I/O口被配置成输出状态时,输出缓冲器具有对称的驱动能力,可以输出或吸收的电流最大可以达到40mA。当I/O口作为输入使用时,端口呈现极高的输入阻抗,端口泄漏电流小于1μA,对输入信号而言,此端口可以认为是开路或浮空,对外围及输入信号影响极小。另外,当端口被设置为输入状态时,片内上拉电阻可以被使能。
ATmega32单片机的每组I/O口都有三个寄存器与其对应,即数据寄存器PORTx、数据方向寄存器DDRx和端口输入引脚寄存器PINx。
数据寄存器PORTx(x可以是A-D)是可读/写寄存器,当为其赋值时,其某一位的电平将反映到与之对应的I/O口上。例如:当PORTA端口被设为输出且赋值为0x01时,PORTA端口的PA0引脚将输出高电平,而其余引脚PA1-PA7将输出低电平。
数据方向寄存器DDRx(x可以是A-D)同样是可读/写寄存器,用于设定与之相对应引脚的输入或输出方向,1对应着输出,0对应输入。例如:当给DDRA寄存器赋值为0x01时,PORTA端口的PA0引脚被设置成输出状态,而其余PA1-PA7引脚将被设定为输入状态。端口输入引脚寄存器PINx(x可以是A-D)是只读寄存器,无论引脚的输入/输出方向如何,读取PINx寄存器即可获取对应引脚的电平状态。例如:我们读取PINA的值为0x01,即表示当前PA0引脚为高电平,其余PA1-PA7引脚均为低电平。
数据寄存器PORTx和数据方向寄存器DDRx对端口引脚的配置状态如表1-3所示。
表1-3 端口引脚配置状态
注意:当引脚被配置为输入状态时,若此时PORTx某位为1,则对应引脚的上拉电阻被使能。如果需要关闭这个上拉电阻,可以将PORTx对应位清零,或者将这个引脚配置为输出。特殊功能I/O寄存器SFIOR的PUD位是上拉禁止位,该位置1时将禁止所有端口引脚的上拉电阻。