Page 1
产品特性
• 高性能、低功耗的 8 位 AVR
• 先进的 RISC 结构
– 130 条指令 – 大多数指令执行时间为单个时钟周期
–32个 8 位通用工作寄存器
– 全静态工作
– 工作于 16 MHz 时性能高达 16 MIPS
– 只需两个时钟周期的硬件乘法器
• 非易失性程序和数据存储器
–8K 字节的系统内可编程 Flash
擦写寿命 : 10,000 次
– 具有独立锁定位的可选 Boot 代码区
通过片上 Boot 程序实现系统内编程
真正的同时读写操作
– 512 字节的 EEPROM
擦写寿命 : 100,000 次
– 512 字节的片内 SRAM
– 可以对锁定位进行编程以实现用户程序的加密
• 外设特点
– 两个具有独立预分频器和比较器功能的 8 位定时器 / 计数器
– 一个具有预分频器、比较功能和捕捉功能的 16 位定时器 / 计数器
– 具有独立振荡器的实时计数器 RTC
– 四通道 PWM
–8路 10 位 ADC
8 个单端通道
TQFP 封装的 7 个差分通道
2 个 TQFP 封装的具有可编程增益 ( 1x, 10x, 或 200x)的差分通道
– 面向字节的两线接口
– 两个可编程的串行 USART
– 可工作于主机 / 从机模式的 SPI 串行接口
– 具有独立片内振荡器的可编程看门狗定时器
– 片内模拟比较器
• 特殊的处理器特点
– 上电复位以及可编程的掉电检测
– 片内经过标定的 RC 振荡器
– 片内 / 片外中断源
–6种睡眠模式 : 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及
扩展的 Standby 模式
• I/O 和封装
– 32 个可编程的 I/O 口
–40引脚 PDIP 封装 , 44 引脚 TQFP 封装 ,44 引脚 PLCC 封装与 44 引脚 MLF 封装
• 工作电压
– ATmega8535L: 2.7 - 5.5V
– ATmega8535: 4.5 - 5.5V
• 速度等级
– ATmega8535L: 0 - 8 MHz
– ATmega8535: 0 - 16 MHz
®
微处理器
具有 8KB 系统内
可编程 Flash 的
8 位 微
控制器
ATmega8535
ATmega8535L
初稿
本文是英文数据手册的中文
翻译,其目的是方便中国用
户的阅读。它无法自动跟随
原稿的更新,同时也可能存
在翻译上的错误。读者应该
以英文原稿为参考以获得更
准确的信息。
2502E–AVR–12/03
Rev. 2502E–AVR–12/03
Page 2
引脚配置 Figure 1. ATmega8535 的引脚
(MOSI) PB5
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
(TXD) PD1
(INT0) PD2
PB4 (SS)
PB3 (AIN1/OC0)
PB2 (AIN0/INT2)
PB1 (T1)
PB0 (XCK/T0)
GND
4443424140393837363534
1
2
3
4
5
6
7
8
9
10
11
1213141516171819202122
VCC
(OC2) PD7
(INT1) PD3
(ICP1) PD6
(OC1B) PD4
(OC1A) PD5
VCC
PA0 (ADC0)
GND
(SCL) PC0
(INT2/AIN0) PB2
(OC0/AIN1) PB3
PA1 (ADC1)
PA2 (ADC2)
PA3 (ADC3)
PC2
PC3
(SDA) PC1
(XCK/T0) PB0
(T1) PB1
(SS) PB4
(MOSI) PB5
(MISO) PB6
(SCK) PB7
RESET
XTAL2
XTAL1
(RXD) PD0
(TXD) PD1
(INT0) PD2
(INT1) PD3
(OC1B) PD4
(OC1A) PD5
(ICP1) PD6
33
PA4 (ADC4)
32
PA5 (ADC5)
31
PA6 (ADC6)
30
PA7 (ADC7)
29
AREF
28
GND
27
AVCC
26
PC7 (TOSC2)
25
PC6 (TOSC1)
24
PC5
23
PC4
VCC
GND
PA0 (ADC0)
PA1 (ADC1)
PA2 (ADC2)
PA3 (ADC3)
PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)
PA7 (ADC7)
AREF
GND
AVCC
PC7 (TOSC2)
PC6 (TOSC1)
PC5
PC4
PC3
PC2
PC1 (SDA)
PC0 (SCL)
PD7 (OC2)
(MOSI) PB5
(MISO) PB6
(SCK) PB7
RESET
VCC
GND
XTAL2
XTAL1
(RXD) PD0
(TXD) PD1
(INT0) PD2
NOTE: MLF Bottom pad should be soldered to ground.
PLCC
PB4 (SS)
PB3 (AIN1/OC0)
PB2 (AIN0/INT2)
PB1 (T1)
PB0 (XCK/T0)
GND
VCC
65432
7
8
9
10
11
12
13
14
15
16
17
1819202122232425262728
(INT1) PD3
(OC1B) PD4
(OC1A) PD5
1
VCC
(OC2) PD7
(ICP1) PD6
PA0 (ADC0)
4443424140
GND
(SCL) PC0
PA1 (ADC1)
PA2 (ADC2)
PA3 (ADC3)
39
38
37
36
35
34
33
32
31
30
29
PC2
PC3
(SDA) PC1
PA4 (ADC4)
PA5 (ADC5)
PA6 (ADC6)
PA7 (ADC7)
AREF
GND
AVCC
PC7 (TOSC2)
PC6 (TOSC1)
PC5
PC4
声明 本数据手册的典型值来源于对器件的仿真,以及其他基于相同产生工艺的 AVR 微控制器
的标定特性。本器件经过特性化之后将给出实际的最大值和最小值。
2
ATmega8535(L)
2502E–AVR–12/03
Page 3
ATmega8535(L)
综述 ATmega8535是基于增强的AVR RISC结构的低功耗8 位 CMOS微控制器。由于其先进的
指令集以及单时钟周期指令执行时间,ATmega8535 的数据吞吐率高达 1MIPS/MHz ,从
而可以缓减系统在功耗和处理速度之间的矛盾。
方框图 Figure 2. 结构框图
CC
GND
AVCC
AREF
INSTRUCTION
INSTRUCTION
PA0 - PA7 PC0 - PC7
PORTA DRIVERS/BUFFERS
PORTA DIGITAL INTERFACE
MUX &
ADC
PROGRAM
COUNTER
PROGRAM
FLASH
REGISTER
DECODER
CONTROL
LINES
ADC
INTERFACE
STACK
POINTER
SRAM
GENERAL
PURPOSE
REGISTERS
X
Y
Z
ALU
PORTC DRIVERS/BUFFERS
PORTC DIGITAL INTERFACE
TWI
TIMERS/
COUNTERS
INTERNAL
OSCILLATOR
WATCHDOG
TIMER
MCU CTRL.
& TIMING
INTERRUPT
UNIT
OSCILLATOR
OSCILLATOR
INTERNAL
CALIBRATED
OSCILLATOR
XTAL1
XTAL2
RESET
2502E–AVR–12/03
AVR CPU
PROGRAMMING
LOGIC
+
-
PORTB DIGITAL INTERFACE
PORTB DRIVERS/BUFFERS
STATUS
REGISTER
SPI
COMP.
INTERFACE
EEPROM
USART
PORTD DIGITAL INTERFACE
PORTD DRIVERS/BUFFERS
PD0 - PD7 PB0 - PB7
3
Page 4
AVR 内核具有丰富的指令集和 32 个通用工作寄存器。所有的寄存器都直接与算逻单元
(ALU) 相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。这种结
构大大提高了代码效率,并且具有比普通的 CISC 微控制器最高至 10 倍的数据吞吐率。
ATmega8535 有如下特点 : 8K 字节的系统内可编程 Flash( 具有同时读写的能力,即
RWW),512 字节 EEPROM,512 字节 SRAM,32 个通用 I/O 口线,32 个通用工作寄存
器,三个具有比较模式的灵活的定时器 /计数器 (T/C) , 片内/ 外中断,可编程串行 USART ,
面向字节的两线串行接口,10 位具有可选差分输入级可编程增益 (TQFP 封装 ) 的 ADC ,
具有片内振荡器的可编程看门狗定时器,一个 SPI 串行端口,以及六个可以通过软件进行
选择的省电模式。 工作于空闲模式时 CPU 停止工作,而 SRAM、 T/C、 SPI 端口以及中
断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外
都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其余
功能模块处于休眠状态; ADC 噪声抑制模式时终止 CPU 和除了异步定时器与 ADC 以外
所有 I/O 模块的工作,以降低 ADC 转换时的开关噪声; Standby 模式下只有晶体或谐振
振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启
动能力;扩展 Standby 模式下则允许振荡器和异步定时器继续工作。
本芯片是以 Atmel 高密度非易失性存储器技术生产的。片内 ISP Flash 允许程序存储器通
过 ISP 串行接口,或者通用编程器进行编程,也可以通过运行于 AVR 内核之中的引导程
序进行编程。引导程序可以使用任意接口将应用程序下载到应用Flash 存储区 (Application
Flash Memory) 。在更新应用Flash 存储区时引导 Flash 区 (Boot Flash Memory) 的程序继续
运行,实现了 RWW 操作。 通过将 8 位 RISC CPU 与系统内可编程的 Flash 集成在一个
芯片内, ATmega8535 成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活
而低成本的解决方案。
ATmega8535 具有一整套的编程与系统开发工具,包括:C 语言编译器、宏汇编、 程序调
试器 / 软件仿真器、仿真器及评估板。
AT90S8535 兼容性 ATmega8535 除有 AT90S8535 的所有特性外,还有一些新的特性。ATmega8535 基本上
对 AT90S8535 向下兼容。但两者间还会存在不兼容的问题。可通过对 AT90S8535 的
S8535C 熔丝位编程,选择兼容模式来解决该问题,ATmega8535 引脚与
AT90S8535100%兼容,也可在电路印刷板上替换AT90S8535,但二者的熔丝位位置及电
气特性间存在差异。
AT90S8535 兼容模式 对 S8535C 熔丝位编程会改变下列功能:
• 改变看门狗溢出周期的时序禁用,详见 P43“ 改变看门狗定时器配置的时间序列 ” 。
•U S A R T接收寄存器的双缓冲器被禁用,详见 P135“AVR USART 和 AVR UART 兼容
性 ” 。
4
ATmega8535(L)
2502E–AVR–12/03
Page 5
引脚说明
ATmega8535(L)
V
CC
GND 地
端口 A(PA7..PA0) 端口 A 作为 A/D 转换器的模拟输入端。
端口 B(PB7..PB0) 端口 B 为 8 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
端口 C(PC7..PC0) 端口 C 为 8 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
端口 D(PD7..PD0) 端口 D 为 8 位双向 I/O 口,具有可编程的内部上拉电阻。其输出缓冲器具有对称的驱动特
数字电路的电源
端口 A 不作为 A/D 转换器使用时,就作为 8 位双向 I/O 口,具有可编程的内部上拉电阻。
其输出缓冲器具有对称的驱动特性,可以输出和吸收大电流。作为输入使用时,若内部上
拉电阻使能,端口被外部电路拉低时将输出电流。在复位过程中,即使系统时钟还未起
振,端口 A 处于高阻状态。
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉
低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 B 处于高阻状态。
端口 B 的其他功能见 P58 。
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉
低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 C 处于高阻状态。
性,可以输出和吸收大电流。作为输入使用时,若内部上拉电阻使能,则端口被外部电路
拉低时将输出电流。在复位过程中,即使系统时钟还未起振,端口 D 处于高阻状态。
端口 D 的其他功能见 P62 。
RESET
XTAL1 反向振荡放大器与片内时钟操作电路的输入端。
XTAL2 反向振荡放大器的输出端。
AVCC AVCC是端口A与A/D转换器的电源。不使用ADC 时,该引脚应直接与V
AREF A/D 的模拟基准输入引脚。
复位输入引脚。持续时间超过最小门限时间的低电平将引起系统复位。门限时间见
P35Table 15 。持续时间小于门限时间的脉冲不能保证可靠复位。
连接。使用ADC
时应通过一个低通滤波器与 V
CC
连接。
CC
代码例子 本数据手册包含了一些简单的代码例子以说明如何使用芯片各个不同的功能模块。这些
例子都假定在编译之前已经包含了正确的头文件。有些 C 编译器在头文件里并没有包含
位定义,而且各个 C 编译器对中断处理有自己不同的处理方式。请注意查阅相关文档以
获取具体的信息。
AVR CPU 内核
介绍 本节从总体上讨论 AVR 内核的结构。CPU 的主要任务是保证程序的正确执行。因此它必
须能够访问存储器、执行运算、控制外设以及处理中断。
2502E–AVR–12/03
5
Page 6
结构综述 Figure 3. AVR 结构的方框图
8-bit Data Bus
Flash
Program
Memory
Instruction
Register
Instruction
Decoder
Control Lines
Program
Counter
Direct Addressing
Status
and Control
32 x 8
General
Purpose
Registrers
ALU
Indirect Addressing
Data
SRAM
EEPROM
Interrupt
Unit
SPI
Unit
Watchdog
Timer
Analog
Comparator
I/O Module1
I/O Module 2
I/O Module n
I/O Lines
为了获得最高的性能以及并行性, AVR 采用了 Harvard 结构,具有独立的数据和程序总
线。程序存储器里的指令通过一级流水线运行。 CPU 在执行一条指令的同时读取下一条
指令 ( 在本文称为预取 )。这个概念实现了指令的单时钟周期运行。程序存储器是可以在
线编程的 Flash 。
快速访问寄存器文件包括 32 个 8 位通用工作寄存器,访问时间为一个时钟周期。从而实
现了单时钟周期的 ALU 操作。在典型的 ALU 操作中,两个位于寄存器文件中的操作数同
时被访问,然后执行运算,结果再被送回到寄存器文件。整个过程仅需一个时钟周期。
寄存器文件里有 6 个寄存器可以用作 3 个 16 位的间接寻址寄存器指针以寻址数据空间,
实现高效的地址运算。其中一个指针还可以作为程序存储器查询表的地址指针。这些附加
的功能寄存器即为 16 位的 X、 Y、 Z 寄存器。
ALU 支持寄存器之间以及寄存器和常数之间的算术和逻辑运算。ALU也可以执行单寄存器
操作。运算完成之后状态寄存器的内容得到更新以反映操作结果。
程序流程通过有 / 无条件的跳转指令和调用指令来控制,从而直接寻址整个地址空间。大
多数指令长度为 16 位,亦即每个程序存储器地址都包含一条 16 位或 32 位的指令。
6
ATmega8535(L)
2502E–AVR–12/03
Page 7
ATmega8535(L)
程序存储器空间分为两个区:引导程序区 (Boot 区 ) 和应用程序区。这两个区都有专门的
锁定位以实现读和读 / 写保护。用于写应用程序区的 SPM 指令必须位于引导程序区。
在中断和调用子程序时返回地址的程序计数器 (PC) 保存于堆栈之中。堆栈位于通用数据
SRAM,因此其深度仅受限于 SRAM 的大小。在复位例程里用户首先要初始化堆栈指针
SP。这个指针位于 I/O 空间,可以进行读写访问。数据 SRAM 可以通过 5 种不同的寻址模
式进行访问。
AVR 存储器空间为线性的平面结构。
AVR有一个灵活的中断模块。控制寄存器位于I/O空间。状态寄存器里有全局中断使能位。
每个中断在中断向量表里都有独立的中断向量。各个中断的优先级与其在中断向量表的
位置有关,中断向量地址越低,优先级越高。
I/O 存储器空间包含 64 个可以直接寻址的地址,作为 CPU 外设的控制寄存器、 SPI,以 及
其他 I/O 功能。映射到数据空间即为寄存器文件之后的地址 0x20 - 0x5F 。
ALU -算术逻辑单元 AVR ALU 与 32 个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间
的 ALU 运算只需要一个时钟周期。 ALU 操作分为 3 类:算术、逻辑和位操作。此外还提
供了支持无 / 有符号数和分数乘法的乘法器。具体请参见指令集。
2502E–AVR–12/03
7
Page 8
状态寄存器 状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以
实现条件操作。如指令集所述,所有 ALU 运算都将影响状态寄存器的内容。这样,在许
多情况下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。
在进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作
需要软件来处理。
AVR 中断寄存器 SREG 定义如下:
B i t 76543210
I T H S V N Z C SREG
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 7 – I: 全局中断使能
I 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。如果 I 清零,则不
论单独中断标志置位与否,都不会产生中断。任意一个中断发生后 I 清零,而执行 RETI
指令后 I 恢复置位以使能中断。 I 也可以通过 SEI 和 CLI 指令来置位和清零。
• Bit 6 – T: 位拷贝存储
位拷贝指令 BLD 和 BST 利用 T 作为目的或源地址。BST 把寄存器的某一位拷贝到 T ,而
BLD 把 T 拷贝到寄存器的某一位。
• Bit 5 – H: 半进位标志
半进位标志 H 表示算术操作发生了半进位。此标志对于 BCD 运算非常有用。详见指令集
的说明。
• Bit 4 – S: 符号位 , S = N
⊕ V
S 为负数标志 N 与 2 的补码溢出标志 V 的异或。详见指令集的说明。
• Bit 3 – V: 2 的补码溢出标志
支持 2 的补码运算。详见指令集的说明。
• Bit 2 – N: 负数标志
表明算术或逻辑操作结果为负。详见指令集的说明。
• Bit 1 – Z: 零标志
表明算术或逻辑操作结果为零。详见指令集的说明。
• Bit 0 – C: 进位标志
表明算术或逻辑操作发生了进位。详见指令集的说明。
通用寄存器文件 寄存器文件针对 AVR 增强型 RISC 指令集做了优化。为了获得需要的性能和灵活性,寄
存器文件支持以下的输入 / 输出方案:
• 输出一个 8 位操作数,输入一个 8 位结果
• 输出两个 8 位位操作数,输入一个 8 位结果
• 输出两个 8 位位操作数,输入一个 16 位结果
• 输出一个 16 位位操作数,输入一个 16 位结果
Figure 4 为 CPU 32 个通用工作寄存器的结构。
Figure 4. AVR CPU 通用工作寄存器
7 0 Addr.
R0 0x00
R1 0x01
8
ATmega8535(L)
2502E–AVR–12/03
Page 9
ATmega8535(L)
R2 0x02
…
R13 0x0D
通用 R14 0x0E
工作 R15 0x0F
寄存器 R16 0x10
R17 0x11
…
R26 0x1A X 寄存器,低字节
R27 0x1B X 寄存器,高字节
R28 0x1C Y 寄存器,低字节
R29 0x1D Y 寄存器,高字节
R30 0x1E Z 寄存器,低字节
R31 0x1F Z 寄存器,高字节
大多数操作寄存器文件的指令都可以直接访问所有的寄存器,而且多数这样的指令的执
行时间为单个时钟周期。
如 Figure 4 所示,每个寄存器都有一个数据内存地址,将他们直接映射到用户数据空间的
头 32 个地址。虽然寄存器文件的物理实现不是 SRAM ,这种内存组织方式在访问寄存器
方面具有极大的灵活性,因为 X、 Y、 Z 寄存器可以设置为指向任意寄存器的指针。
2502E–AVR–12/03
9
Page 10
X、Y、Z 寄存器 寄存器 R26..R31 除了用作通用寄存器外,还可以作为数据间接寻址用的地址指针。这三
个间接寻址寄存器示于 Figure 5 。
Figure 5. X、 Y 、 Z 寄存器
15 XH XL 0
X 寄存器 70 7 0
R27 (0x1B) R26 (0x1A)
15 YH YL 0
Y 寄存器 70 7 0
R29 (0x1D) R28 (0x1C)
15 ZH ZL 0
Z 寄存器 70 7 0
R31 (0x1F) R30 (0x1E)
在不同的寻址模式中,这些地址寄存器可以实现固定偏移量,自动加一和自动减一功能。
具体细节请参见指令集。
堆栈指针 堆栈指针主要用来保存临时数据、局部变量和中断 / 子程序的返回地址。堆栈指针总是指
向堆栈的顶部。要注意 AVR 的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数
值将减小。
堆栈指针指向数据 SRAM 堆栈区。在此聚集了子程序堆栈和中断堆栈。调用子程序和使
能中断之前必须定义堆栈空间,且堆栈指针必须指向高于 0x60 的地址空间。使用 PUSH
指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。使
用 POP 指令将数据弹出堆栈时,堆栈指针加一;而用 RET 或 RETI 指令从子程序或中断
返回时堆栈指针加二。
AVR 的堆栈指针由I/O 空间中的两个8 位寄存器实现。实际使用的位数与具体器件有关。请
注意某些 AVR 器件的数据区太小,用 SPL 就足够了。此时将不给出 SPH 寄存器。
B i t 1 51 41 31 21 11 0 9 8
SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 SPH
SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 SPL
76543210
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
00000000
指令执行时序 这一节介绍指令执行过程中的访问时序。AVR CPU 由系统时钟 clk
来自选定的时钟源。芯片内部不对此时钟进行分频。
Figure 6 说明了由 Harvard 结构决定的并行取指和指令执行,以及可以进行快速访问的寄
存器文件的概念。这是一个基本的流水线概念,性能高达 1 MIPS /MHz ,具有优良的性价
比、功能 / 时钟比、功能 / 功耗比。
驱动。此时钟直接
CPU
10
ATmega8535(L)
2502E–AVR–12/03
Page 11
ATmega8535(L)
Figure 6. 并行取指和指令执行
T1 T2 T3 T4
clk
CPU
1st Instruction Fetch
1st Instruction Execute
2nd Instruction Fetch
nd Instruction Execute
3rd Instruction Fetch
3rd Instruction Execute
4th Instruction Fetch
Figure 7 演示的是寄存器文件内部访问时序。在一个时钟周期里,ALU 可以同时对两个寄
存器操作数进行操作,同时将结果保存到目的寄存器中去。
Figure 7. 单时钟周期 ALU 操作
T1 T2 T3 T4
clk
CPU
Total Execution Time
egister Operands Fetch
ALU Operation Execute
Result Write Back
复位与中断处理 AVR 有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件
都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位时,中断可
以发生。根据程序计数器 PC 的不同,在引导锁定位 BLB02 或 BLB12 被编程的情况下,
中断可能被自动禁止。这个特性提高了软件的安全性。详见 P225“ 存储器编程 ” 的描述。
程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见 P44“ 中断 ” 。
列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。 RESET 具有最高
的优先级,第二个为 INT0 – 外部中断请求 0 。通过置位通用中断控制寄存器 (GICR) 的
IVSEL ,中断向量可以移至引导Flash 的起始处,参见 P44“ 中断 ” 。编程熔丝位 BOOTRST
也可以将复位向量移至引导 Flash 的起始处。具体参见 P212“ 支持引导装入程序 – 在写
的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” 。
任一中断发生时全局中断使能位 I 被清零,从而禁止了所有其他的中断。用户软件可以在
中断程序里置位 I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执
行 RETI 指令后 I 自动置位。
从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序
计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中
断标志也可以通过对其写 ”1” 的方式来清除。当中断发生后,如果相应的中断使能位为
"0" ,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局
中断标志被清零,则所有已发生的中断都不会被执行,直到 I 置位。然后挂起的各个中断
按中断优先级依次执行。
第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若
中断条件在中断使能之前就消失了,中断不会被触发。
2502E–AVR–12/03
11
Page 12
AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。
要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢
复。这些工作必须由用户通过软件来完成。
使用 CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行 CLI 指令后发生,
即使它是在执行 CLI 指令的同时发生的。下面的例子说明了如何在写 EEPROM 时使用这
个指令来防止中断发生以避免对 EEPROM 内容的破坏。
汇编代码例程
in r16, SREG ; 保存SREG
cli ; 禁止中断
启动
sbi EECR, EEMWE ;
sbi EECR, EEWE
out SREG, r16 ;
EEPROM
恢复
SREG (I位)
写操作
C 代码例程
char cSREG;
保存
cSREG = SREG; /*
/* 禁止中断 */
_CLI();
EECR |= (1<<EEMWE); /*
EECR |= (1<<EEWE);
SREG = cSREG; /*
SREG */
启动
恢复
SREG (I位) */
EEPROM
写操作
*/
12
ATmega8535(L)
2502E–AVR–12/03
Page 13
ATmega8535(L)
使用 SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执
行。
汇编代码例程
sei ;
sleep ;
; 注意 : 在执行任何被挂起的中断之前 MCU 将首先进入休眠模式
C 代码例程
_SEI(); /*
_SLEEP(); /*
/* 注意 : 在执行任何被挂起的中断之前 MCU 将首先进入休眠模式 */
中断响应时间 AVR 中断响应时间最少为 4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例
程。在这 4 个时钟期期间 PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳
转需要 3 个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令
执行完毕后 MCU 才会执行中断程序。若中断发生时 MCU 处于休眠模式,中断响应时间
还需增加 4 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。
中断返回需要 4 个时钟。在此期间 PC( 两个字节 ) 将被弹出栈,堆栈指针加二,状态寄存
器 SREG 的 I 置位。
置位全局中断使能标志
进入休眠模式,等待中断发生
置位全局中断使能标志
进入休眠模式,等待中断发生
*/
*/
2502E–AVR–12/03
13
Page 14
AVR ATmega8535 存
储器
本节讲述 ATmega8535 的存储器。AVR 结构具有两个主要的存储器空间:数据存储器空
间和程序存储器空间。此外, ATmega8535 还有 EEPROM 存储器以保存数据。这三个
存储器空间都为线性的平面结构。
系统内可编程的 Flash 程序
存储器
ATmega8535 具有 8K 字节的在线编程Flash ,用于存放程序指令代码。因为所有的AVR 指
令为 16 位或 32 位,故而 Flash 组织成 4K x 16 位的形式。用户程序的安全性要根据 Flash
程序存储器的两个区:引导 (Boot) 程序区和应用程序区,分开来考虑。
Flash 存储器至少可以擦写10,000 次。ATmega8535的程序计数器(PC) 为12 位,因此可以
寻址 4K 字的程序存储器空间。引导程序区以及相关的软件安全锁定位请参见 P212“ 支持
引导装入程序 – 在写的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” ,而
P225“ 存储器编程 ” 详述了用 SPI 或平行编程模式实现对 Flash 编程。
常数可以保存于整个程序存储器地址空间 ( 参考 LPM 加载程序存储器指令的说明 )。
取指与执行时序图请参见 P10“ 指令执行时序 ” 。
Figure 8. 程序存储器映像
$000
Application Flash Section
14
Boot Flash Section
$FFF
ATmega8535(L)
2502E–AVR–12/03
Page 15
SRAM 数据存储器 Figure 9 给出了 ATmega8535 SRAM 空间的组织结构。
前 608 个数据存储器包括了寄存器文件、 I/O 存储器及内部数据 SRAM 。起始的 96 个地
址为寄存器文件与 I/O 存储器,接着是 512 字节的内部数据 SRAM 。
数据存储器的寻址方式分为 5 种:直接寻址、带偏移量的间接寻址、间接寻址、带预减量
的间接寻址和带后增量的间接寻址。寄存器文件中的寄存器 R26 到 R31 为间接寻址的指
针寄存器。
直接寻址范围可达整个数据区。
带偏移量的间接寻址模式能够寻址到由寄存器 Y 和 Z 给定的基址附近的 63 个地址。
在自动预减和后加的间接寻址模式中,寄存器 X、 Y 和 Z 自动增加或减少。
ATmega8535 的全部32 个通用寄存器、64个I/O 寄存器及512 个字节的内部数据SRAM 可
以通过所有上述的寻址模式进行访问。寄存器文件的描述见 P8“ 通用寄存器文件 ” 。
Figure 9. 数据存储器映像
ATmega8535(L)
R0
R1
R2
...
R29
R30
R31
I/O Registers
$00
$01
$02
...
$3D
$3E
$3F
$0000
$0001
$0002
...
$001D
$001E
$001F
$0020
$0021
$0022
...
$005D
$005E
$005F
Internal SRAM
$0060
$0061
...
$025E
$025F
2502E–AVR–12/03
15
Page 16
数据存储器访问时间 本节说明访问内部存储器的时序。如 Figure 10 所示,内部数据 SRAM 访问时间为两个
clk
时钟。
CPU
Figure 10. 片上 SRAM 存取周期
T1 T2 T3
clk
CPU
ddress
Compute Address
Address valid
Data
WR
Write
Data
RD
Memory Access Instruction
Next Instruction
Read
EEPROM 数据存储器 ATmega8535 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存
在的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访
问由地址寄存器、数据寄存器和控制寄存器决定。
P225“ 存储器编程 ” 包含使用 SPI 或并行编程模式对 EEPROM 编程。
EEPROM 读 / 写访问 EEPROM 的访问寄存器位于 I/O 空间。
EEPROM 的写访问时间由 Table 1 给出。自定时功能可以让用户软件监测何时可以开始写
下一字节。用户操作 EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路
中,上电 / 下电时 V
的电源电压。请参见 P20“ 防止 EEPROM 数据丢失 ” 以避免出现 EEPROM 数据丢失的问
题。
上升 / 下降速度会比较慢。此时 CPU 可能工作于低于晶振所要求
CC
为了防止无意识的 EEPROM 写操作,需要执行一个特定的写时序。具体参看 EEPROM
控制寄存器的内容。
执行 EEPROM 读操作时, CPU 会停止工作 4 个周期,然后再执行后续指令;执行
EEPROM 写操作时, CPU 会停止工作 2 个周期,然后再执行后续指令。
16
ATmega8535(L)
2502E–AVR–12/03
Page 17
ATmega8535(L)
EEPROM 地址寄存器- EEARH
和 EEARL
EEPROM 数据寄存器- EEDR
B i t 1 51 41 31 21 11 0 9 8
–––––––E E A R 8 E E A R H
EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 EEARL
76543210
读/写 RRRRRRRR/ W
R/W R/W R/W R/W R/W R/W R/W R/W
初始值 0000000X
XXXXXXXX
• Bits 15..9 – Res: 保留
保留位,读操作返回值为零。
• Bits 8..0 – EEAR8..0: EEPROM 地址
EEPROM 地址寄存器– EEARH 和EEARL 指定了512 字节的 EEPROM 空间。EEPROM地
址是线性的,从 0 到 511。EEAR 的初始值没有定义。在访问 EEPROM 之前必须为其赋
予正确的数据。
B i t 76543210
MSB LSB EEDR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bits 7..0 – EEDR7..0: EEPROM 数据
EEPROM 控制寄存器- EECR
对于 EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;对于读操作, EEDR 是
从地址 EEAR 读取的数据。
B i t 76543 2 10
––––E E R I E E E M W E E E W E E E R E E E C R
读/写 R R R R R/W R/W R/W R/W
初始值 000000X0
• Bits 7..4 – Res: 保留
保留位,读操作返回值为零。
• Bit 3 – EERIE: EEPROM 准备好中断使能
若 SREG 的 I 为 "1" ,则置位 EERIE 将使能 EEPROM 准备好中断。清零 EERIE 则禁止
此中断。当 EEWE 清零时 EEPROM 准备好中断即可发生。
• Bit 2 – EEMWE: EEPROM 主机写使能
EEMWE 决定了EEWE 置位是否可以启动EEPROM 写操作。当EEMWE 为 "1" 时,在 4 个时
钟周期内置位 EEWE 将把数据写入 EEPROM 的指定地址;若 EEMWE 为 "0“ ,则操作
EEWE 不起作用。 EEMWE 置位后 4 个周期,硬件对其清零。见 EEPROM 写过程中对
EEWE 位的描述。
• Bit 1 – EEWE: EEPROM 写使能
EEWE 为 EEPROM 写操作的使能信号。当 EEPROM 数据和地址设置好之后,需置位
EEWE 以便将数据写入 EEPROM。此 时 EEMWE 必须置位,否则EEPROM 写操作将不会
发生。写时序如下 ( 第 3 步和第 4 步的次序并不重要 ):
1. 等待 EEWE 位变为零
2. 等待 SPMCSR 中的 SPMEN 位变为零
3. 将新的 EEPROM 地址写入 EEAR(可选)
2502E–AVR–12/03
17
Page 18
4. 将新的 EEPROM 数据写入 EEDR(可选)
5. 对 EECR 寄存器的 EEMWE 写 "1",同时清零 EEWE
6. 在置位 EEMWE 的 4 个周期内,置位 EEWE
在 CPU 写 Flash 的时候不能对 EEPROM 进行编程。在启动 EEPROM 写操作之前软件
必须检查 Flash 写操作是否已经完成。步骤(2 )仅在软件包含引导程序并允许CPU 对Flash
进行编程时才有用。如果 CPU 永远都不会写 Flash ,步 骤 ( 2 ) 可省略。请参见 P212“ 支持
引导装入程序 – 在写的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” 。
注意:如果在步骤 5 和 6 之间发生了中断,写操作将失败。因为此时 EEPROM 写使能操
作将超时。如果一个操作 EEPROM 的中断打断了另一个 EEPROM 操作,EEAR 或 EEDR
寄存器可能被修改,引起 EEPROM 操作失败。建议此时关闭全局中断标志 I。
经过写访问时间之后,EEWE 硬件清零。用户可以凭借这一位判断写时序是否已经完成。
EEWE 置位后, CPU 要停止两个时钟周期才会运行下一条指令。
• Bit 0 – EERE: EEPROM 读使能
EERE 为EEPROM 读操作的使能信号。当EEPROM 地址设置好之后,需置位 EERE 以便将
数据读入 EEAR 。 EEPROM 数据的读取只需要一条指令,且无需等待。读取 EEPROM
后 CPU 要停止 4 个时钟周期才可以执行下一条指令。
用户在读取 EEPROM 时应该检测 EEWE 。如果一个写操作正在进行,就无法读取
EEPROM ,也无法改变寄存器 EEAR 。
经过校准的片内振荡器用于 EEPROM 定时。Table 1 为 CPU 访问 EEPROM 的典型时间。
Table 1. EEPROM 编程时间
符号 校准的 RC 振荡器周期数
EEPROM 写操作 (CPU) 8448 8.5 ms
(1)
典型的编程时间
Note: 1. 使用时钟频率为 1 MHz ,不倚赖 CKSEL 熔丝位的设置。
18
ATmega8535(L)
2502E–AVR–12/03
Page 19
ATmega8535(L)
下面的代码分别用汇编和 C 函数说明如何实现 EEPROM 的写操作。在此假设中断不会在
执行这些函数的过程当中发生。同时还假设软件没有 Boot Loader。若 Boot Loader 存在,
则 EEPROM 写函数还需要等待正在运行的 SPM 命令的结束。
汇编代码例程
EEPROM_write:
等待上一次写操作结束
;
sbic EECR,EEWE
rjmp EEPROM_write
设置地址寄存器
;
out EEARH, r18
out EEARL, r17
将数据写入数据寄存器
;
out EEDR,r16
置位
EEMWE
;
sbi EECR,EEMWE
置位
EEWE
;
sbi EECR,EEWE
ret
(r18:r17)
(r16)
以启动写操作
C 代码例程
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
等待上一次写操作结束
/*
while(EECR & (1<<EEWE))
;
设置地址和数据寄存器
/*
EEAR = uiAddress;
EEDR = ucData;
置位
置位
EEMWE */
EEWE
以启动写操作
/*
EECR |= (1<<EEMWE);
/*
EECR |= (1<<EEWE);
}
*/
*/
*/
2502E–AVR–12/03
19
Page 20
下面的例子说明如何用汇编和 C 函数来读取 EEPROM ,在此假设中断不会在执行这些函
数的过程当中发生。
汇编代码例程
EEPROM_read:
等待上一次写操作结束
;
sbic EECR,EEWE
rjmp EEPROM_read
设置地址寄存器
;
out EEARH, r18
out EEARL, r17
设置
EERE
;
sbi EECR,EERE
自数据寄存器读取数据
;
in r16,EEDR
ret
(r18:r17)
以启动读操作
C 代码例程
unsigned char EEPROM_read(unsigned int uiAddress)
{
等待上一次写操作结束
/*
while(EECR & (1<<EEWE))
;
设置地址寄存器
/*
EEAR = uiAddress;
设置
EERE
/*
EECR |= (1<<EERE);
自数据寄存器返回数据
/*
return EEDR;
}
以启动读操作
*/
*/
*/
*/
在掉电休眠模式下的 EEPROM
写操作
若程序执行掉电指令时 EEPROM 的写操作正在进行, EEPROM 的写操作将继续,并在
指定的写访问时间之前完成。但写操作结束后,振荡器还将继续运行,芯片并非处于完全
的掉电模式。因此在执行掉电指令之前应结束 EEPROM 的写操作。
防止 EEPROM 数据丢失 若电源电压过低,CPU 和 EEPROM 有可能工作不正常,造成 EEPROM 数据的毁坏 ( 丢
失 )。这种情况在使用独立的 EEPROM 器件时也会遇到。因而需要使用相同的保护方案。
由于电压过低造成 EEPROM 数据损坏有两种可能:一是电压低于 EEPROM 写操作所需
要的最低电压;二是 CPU 本身已经无法正常工作。
EEPROM 数据损坏的问题可以通过以下方法解决:
当电压过低时保持 AVR RESET 信号为低。这可以通过使能芯片的掉电检测电路 BOD 来
实现。如果 BOD 电平无法满足要求则可以使用外部复位电路。若写操作过程当中发生了
复位,只要电压足够高,写操作仍将正常结束。
I/O 存储器 ATmega8535 的 I/O 空间定义见 P285。
ATmega8535 所有的I/O 及外设都被放置于I/O 空间。所有的I/O 位置都可以通过 IN 与OUT
指令来访问,在 32 个通用工作寄存器和 I/O 之间传输数据。 地址为 0x00 - 0x1F 的 I/O 寄
存器还可用 SBI 和 CBI 指令直接进行位寻址,而 SBIS 和 SBIC 则用来检查某一位的值。
20
ATmega8535(L)
2502E–AVR–12/03
Page 21
ATmega8535(L)
更多内容请参见指令集。使用 IN 和 OUT 指令时地址必须在 0x00 - 0x3F 之间。如果要象
SRAM 一样通过 LD 和 ST 指令访问 I/O 寄存器,相应的地址要加上 0x20。
为了与后续产品兼容,保留未用的未应写 "0",而保留的 I/O 寄存器则不应进行写操作。
一些状态标志位的清除是通过写 "1" 来实现的。要注意的是,与其他大多数 AVR 不同,
CBI 和 SBI 指令只能对某些特定的位进行操作,因而可以用于包含这些状态标志的寄存
器。 CBI 与 SBI 指令只对 0x00 到 0x1F 的寄存器有效。
I/O 和外设控制寄存器在后续其他章节进行介绍。
2502E–AVR–12/03
21
Page 22
系统时钟及时钟选项
时钟系统及其分布 Figure 11 为 AVR 的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗,
可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟,详见 P30“ 电源管理及睡眠
模式 ” 。时钟系统详见 Figure 11 。
Figure 11. 时钟分布
Asynchronous
Timer/Counter
Timer/Counter
Oscillator
General I/O
Modules
clk
clk
ASY
External RC
Oscillator
ADC CPU Core RAM
clk
ADC
I/O
AVR Clock
Control Unit
Source clock
Clock
Multiplexer
External Clock
clk
CPU
clk
FLASH
Reset Logic
Crystal
Oscillator
Watchdog Timer
Watchdog clock
Watchdog
Oscillator
Low-frequency
Crystal Oscillator
Flash and
EEPROM
Calibrated RC
Oscillator
CPU 时钟- clk
I/O 时钟- clk
Flash 时钟- clk
CPU
I/O
FLASH
异步定时器时钟- clk
ADC 时钟- clk
22
ADC
ATmega8535(L)
ASY
CPU 时钟与操作AVR 内核的子系统相连,如通用寄存器文件、状态寄存器及保存堆栈指针
的数据存储器。终止 CPU 时钟将使内核停止工作和计算。
I/O 时钟用于主要的I/O 模块,如定时器 /计数器、SPI和 USART 。I/O时钟还用于外部中断
模块。要注意的是有些外部中断由异步逻辑检测,因此即使 I/O 时钟停止了这些中断仍然
可以得到监控。此外, USI 模块的起始条件检测在没有 clk
的情况下也是异步实现的,
I/O
使得这个功能在任何睡眠模式下都可以正常工作。
Flash 时钟控制 Flash 接口的操作。此时钟通常与 CPU 时钟同时挂起或激活。
异步定时器时钟允许异步定时器 / 计数器直接由外部 32 kHz 时钟晶体驱动。使得此定时
器 / 计数器即使在睡眠模式下仍然可以为系统提供一个实时时钟。
ADC 具有专门的时钟。这样可以在ADC 工作的时候停止 CPU 和 I/O 时钟以降低数字电路产
生的噪声,从而提高 ADC 转换精度。
2502E–AVR–12/03
Page 23
ATmega8535(L)
时钟源 ATmega8535芯片有如下几种通过Flash熔丝位进行选择的时钟源。时钟输入到AVR 时钟
发生器,再分配到相应的模块。
Table 2. 时钟源选择
芯片时钟选项 CKSEL3..0
外部晶体 / 陶瓷振荡器 1111 - 1010
外部低频晶振 1001
外部 RC 振荡器 1000 - 0101
标定的内部 RC 振荡器 0100 - 0001
外部时钟 0000
Note: 1. 对于所有的熔丝位, “1” 表示未编程, “0” 代表已编程。
(1)
不同的时钟选项将在后续部分进行介绍。当 CPU 自掉电模式或省电模式唤醒之后,被选
择的时钟源用来为启动过程定时,保证振荡器在开始执行指令之前进入稳定状态。当 CPU
从复位开始工作时,还有额外的延迟时间以保证在 MCU 开始正常工作之前电源达到稳定
电平。这个启动时间的定时由看门狗振荡器完成。看门狗溢出时间所对应的 WDT 振荡器
周期数列于 Table 3 。看门狗振荡器的频率由工作电压决定,详见 P252“ATmega8535 典
型特性 ” 。
Table 3. 看门狗振荡器周期数
典型的溢出时间 (V CC = 5.0V) 典型的溢出时间 (VCC = 3.0V) 时钟周期数
4.1 ms 4.3 ms 4K (4,096)
65 ms 69 ms 64K (65,536)
缺省时钟源 芯片出厂时 CKSEL = “0001” , SUT = “10” 。这个缺省设置的时钟源是内部 RC 振荡器,
启动时间为最长。这种设置保证用户可以通过 ISP 或并行编程器得到所需的时钟源。
晶体振荡器 XTAL1 与 XTAL2 分别为用作片内振荡器的反向放大器的输入和输出,如 Figure 12 所示,
这个振荡器可以使用石英晶体,也可以使用陶瓷谐振器。熔丝位 CKOPT 用来选择这两种
放大器模式的其中之一。当 CKOPT 被编程时振荡器在输出引脚产生满幅度的振荡。这种
模式适合于噪声环境,以及需要通过 XTAL2 驱动第二个时钟缓冲器的情况。而且这种模
式的频率范围比较宽。当保持 CKOPT 为未编程状态时,振荡器的输出信号幅度比较小。
其优点是大大降低了功耗,但是频率范围比较窄,而且不能驱动其他时钟缓冲器。
对于谐振器, CKOPT 未编程时的最大频率为 8 MHz , CKOPT 编程时为 16 MHz 。 C1
和 C2 的数值要一样,不管使用的是晶体还是谐振器。最佳的数值与使用的晶体或谐振器
有关,还与杂散电容和环境的电磁噪声有关。 Table 4 给出了针对晶体选择电容的一些指
南。对于陶瓷谐振器,应该使用厂商提供的数值。若想得到更多的有关如何选择电容以及
振荡器如何工作的信息,请参考多用途振荡器应用手册。
2502E–AVR–12/03
23
Page 24
Figure 12. 晶体振荡器连接图
C2
C1
XTAL
XTAL
GND
振荡器可以工作于三种不同的模式,每一种都有一个优化的频率范围。工作模式通过熔丝
位 CKSEL3..1 来选择,如 Table 4 所示。
Table 4. 晶体振荡器工作模式
CKOPT CKSEL3..1 频率范围
1 101
1 110 0.9 - 3.0 12 - 22
1 111 3.0 - 8.0 12 - 22
0 101, 110, 111 1.0 - 16.0 12 - 22
Notes: 1. 频率范围为大致值。
2. 此选项不适用于晶体,只能用于陶瓷谐振器。
(2)
(1)
(MHz)
0.4 - 0.9 –
使用晶体时电容 C1 和 C2 的推荐范围
(pF)
24
ATmega8535(L)
2502E–AVR–12/03
Page 25
ATmega8535(L)
如 Table 5 所示,熔丝位 CKSEL0 以及 SUT1..0 用于选择启动时间。
Table 5. 晶体振荡器时钟选项对应的启动时间
掉电与节电模式下的
CKSEL0 SUT1..0
00 0 2 5 8 C K
启动时间
(1)
复位时额外的延迟
时间 (V CC = 5.0V) 推荐用法
4.1 ms 陶瓷谐振器,电源快速上
升
00 1 2 5 8 C K
(1)
65 ms 陶瓷谐振器,电源缓慢上
升
01 0 1 K C K
01 1 1 K C K
(2)
(2)
– 陶瓷谐振器, BOD 使能
4.1 ms 陶瓷谐振器,电源快速上
升
10 0 1 K C K
(2)
65 ms 陶瓷谐振器,电源缓慢上
升
1 01 16K CK – 石英振荡器, BOD 使能
1 10 16K CK 4.1 ms 石英振荡器,电源快速上
升
1 11 16K CK 65 ms 石英振荡器,电源慢速上
升
Notes: 1. 这些选项只能用于工作频率不太接近于最大频率,而且启动时的频率稳定性对于应用
而言不重要的情况。不适用于晶体。
2. 这些选项是为陶瓷谐振器设计的,可以保证启动时频率足够稳定。若工作频率不太接
近于最大频率,而且启动时的频率稳定性对于应用而言不重要时也适用于晶体。
2502E–AVR–12/03
25
Page 26
低频晶体振荡器 为了使用 32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位 CKSEL 设置为 “1001”
以选择低频晶体振荡器。晶体的连接方式如 Figure 12 所示。通过对熔丝位 CKOPT 的编
程,用户可以使能 XTAL1 和 XTAL2 的内部电容,从而去除外部电容。内部电容的标称数
值为 36 pF 。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 6 所示。
Table 6. 低频晶体振荡器的启动时间
掉电模式和省电模式
SUT1..0
00 1K CK
01 1K CK
10 32K CK 65 ms 启动时频率已经稳定
11 保留
Note: 1. 这些选项只能用于启动时的频率稳定性对应用而言不重要的情况。
的启动时间
(1)
(1)
复位时的额外延迟
时间 (V CC = 5.0V) 推荐用法
4.1 ms 电源快速上升,或是 BOD 使能
65 ms 电源缓慢上升
外部 RC 振荡器 对于时间不敏感的应用可以使用 Figure 13 的外部 RC 振荡器。频率可以通过方程 f =
1/(3RC) 进行粗略地鼓估计。电容 C 至少要 22 pF。通过编程熔丝位 CKOPT,用户可以使
能 XTAL1 和 GND 之间的片内 36 pF 电容,从而无需外部点燃。若想获取有关振荡器如
何工作以及如何选择 R 和 C 的具体信息,请参考外部 RC 振荡器应用手册。
Figure 13. 外部 RC 配置
VCC
NC
XTAL
XTAL
GND
振荡器可以工作于四个不同的模式,每个模式有自己的优化频率范围。工作模式通过熔丝
位 CKSEL3..0 选取,如 Table 7 所示。
26
ATmega8535(L)
2502E–AVR–12/03
Page 27
ATmega8535(L)
Table 7. 外部 RC 振荡器工作模式
CKSEL3..0 频率范围 (MHz)
0101 - 0.9
0110 0.9 - 3.0
0111 3.0 - 8.0
1000 8.0 - 12.0
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 8 所示。
Table 8. 外部 RC 振荡器的启动时间
掉电模式和省电模式
SUT1..0
00 18 CK – BOD 使能
01 18 CK 4.1 ms 电源快速上升
10 18 CK 65 ms 电源缓慢上升
11 6 CK
Note: 1. 这些选项只能用于工作频率不太接近于最大频率时的情况。
的启动时间
(1)
复位时的额外延迟
时间 (V CC = 5.0V) 推荐用法
4.1 ms 电源快速上升,或是 BOD 使能
标定的片内 RC 振荡器 标定的片内 RC 振荡器提供了固定的 1.0 、 2.0 、 4.0 或 8.0 MHz 的时钟。这些频率都是
5V、 25°C 下的标称数值。这个时钟也可以作为系统时钟,只要按照 Table 9 对熔丝位
CKSEL进行编程即可。选择这个时钟(此时不能对CKOPT进行编程) 之后就无需外部器件
了。复位时硬件将标定字节加载到 OSCCAL 寄存器,自动完成对 RC 振荡器的标定。在
5V, 25°C 和频率为 1.0 MHz 时,这种标定可以提供标称频率 ± 3% 的精度;使用
www.atmel.com/avr 中所给出的方法,可在任何电压、任何温度下,使精度达到 ± 1% 。当
使用这个振荡器作为系统时钟时,看门狗仍然使用自己的看门狗定时器作为溢出复位的
依据。更多的有关标定数据的信息请参见 P227“ 标定字节 ” 。
Table 9. 片内标定的 RC 振荡器工作模式
CKSEL3..0 标称频率 (MHz)
(1)
0001
0010 2.0
0011 4.0
0100 8.0
1.0
2502E–AVR–12/03
Note: 1. 出厂时的设置。
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 10 所示。 XTAL1 和
XTAL2 要保持为空 (NC)。
27
Page 28
Table 10. 内部标定 RC 振荡器的启动时间
振荡器标定寄存器- OSCCAL
掉电模式与省电模式的启
SUT1..0
00 6 CK – BOD 使能
01 6 CK 4.1 ms 电源快速上升
(1)
10
11 保留
Note: 1. 出厂时的设置。
B i t 76543210
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 标定数据
动时间
6 CK 65 ms 电源缓慢上升
CAL7 CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0 OSCCAL
复位时的额外延迟时间
(VCC = 5.0V) 推荐用法
• Bits 7..0 – CAL7..0: 振荡器标定数据
将标定数据写入这个地址可以对内部振荡器进行调节以消除由于生产工艺所带来的振荡
器频率偏差。复位时 1 MHz 的标定数据 ( 标识数据的高字节,地址为 0x00) 自动加载到
OSCCAL 寄存器。如果需要内部 RC 振荡器工作于其他频率,标定数据必须人工加载:首
先通过编程器读取标识数据,然后将标定数据保存到 Flash 或 EEPROM 之中。这些数据
可以通过软件读取,然后加载到 OSCCAL 寄存器。
当 OSCCAL 为零时振荡器以最低频率工作。当对其写如不为零的数据时内部振荡器的频
率将增长。写入 0xFF 即得到最高频率。标定的振荡器用来为访问 EEPROM 和 Flash 定
时。有写 EEPROM 和 Flash 的操作 时不要将频率标定到超过标称频率的 10% ,否则写
操作有可能失败。要注意振荡器只对 1.0 、 2.0 、4.0 和 8.0 MHz 这四种频率进行了标定,
其他频率则无法保证,如 Table 11 所示。
Table 11 . 内部 RC 振荡器频率范围
OSCCAL 数值 最小频率,标称频率的百分比 (%) 最大频率,标称频率的百分比 (%)
0x00 50 100
0x7F 75 150
0xFF 100 200
28
ATmega8535(L)
2502E–AVR–12/03
Page 29
ATmega8535(L)
外部时钟 为了从外部时钟源驱动芯片, XTAL1 必须如 Figure 14 所示的进行连接。同时,熔丝位
CKSEL必须编程为 “0000”。若熔丝位CKOPT也被编程,用户就可以使用内部的XTAL1和
GND 之间的 36 pF 电容。
Figure 14. 外部时钟驱动配置图
XTERNAL
CLOCK
SIGNAL
选择了这个振荡器之后,启动时间由熔丝位 SUT 确定,如 Table 12 所示。
Table 12. 外部时钟的启动时间
掉电模式与省电模式的
SUT1..0
00 6 CK – BOD 使能
01 6 CK 4.1 ms 电源快速上升
10 6 CK 65 ms 电源缓慢上升
11 保留
启动时间
复位时的额外延迟时间
(VCC = 5.0V) 推荐用法
为了保证 MCU 能够稳定工作,不能突然改变外部时钟源的振荡频率。工作频率突变超过
2% 将会产生异常现象。应该在 MCU 保持复位状态时改变外部时钟的振荡频率。
定时器 / 计时器振荡器 对于拥有定时器 / 振荡器引脚 (TOSC1 和 TOSC2) 的 AVR 微处理器,晶体可以直接与这
两个引脚连接,无需外部电容。此振荡器针对 32.768 kHz 的钟表晶体作了优化。不建议
在 TOSC1 引脚输入振荡信号。
29
2502E–AVR–12/03
Page 30
电源管理及睡眠模式 睡眠模式可以使应用程序关闭 MCU 中没有使用的模块,从而降低功耗。 AVR 具有不同
的睡眠模式,允许用户根据自己的应用要求实施剪裁。
进入睡眠模式的条件是置位寄存器 MCUCR 的 SE ,然后执行 SLEEP 指令。具体哪一种
模式 ( 空闲模式、ADC 噪声抑制模式、掉电模式、省电模式、Standby 模式和扩展 Standby
模式 ) 由 MCUCR 的 SM2、 SM1 和 SM0 决定,如 Table 13 所示。使能的中断可以将进
入睡眠模式的 MCU 唤醒。经过启动时间,外加 4 个时钟周期后, MCU 就可以运行中断
例程了。然后返回到 SLEEP 的下一条指令。唤醒时不会改变寄存器文件和 SRAM 的内
容。如果在睡眠过程中发生了复位,则 MCU 唤醒后从中断向量开始执行。
P22Figure 11 介绍了 ATmega8535 不同的时钟系统及其分布。此图在选择合适的睡眠模
式时非常有用。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含了电源管理的控制位。
B i t 76543210
SM2 SE SM1 SM0
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bits 7, 5, 4 – SM2..0: 休眠模式选择位 2 、 1 和 0
如 Table 13 所示,这些位用于选择具体的休眠模式。
Table 13. 休眠模式选择
SM2 SM1 SM0 休眠模式
000空闲模式
ISC11 ISC10 ISC01 ISC00 MCUCR
001 A D C噪声抑制模式
010掉电模式
011省电模式
100保留
101保留
(1)
110 S t a n d b y
111扩展 Standby
Note: 1. 仅在使用外部晶体或谐振器时 Standby 模式与扩展 Standby 模式才可用。
模式
(1)
模式
• Bit 6 – SE: 休眠使能
为了使 MCU 在执行 SLEEP 指令后进入休眠模式, SE 必须置位。为了确保进入休眠模
式是程序员的有意行为,建议仅在 SLEEP 指令的前一条指令置位 SE 。MCU 一旦唤醒立
即清除 SE 。
30
ATmega8535(L)
2502E–AVR–12/03
Page 31
ATmega8535(L)
空闲模式 当 SM2..0 为 000 时, SLEEP 指令将使 MCU 进入空闲模式。在此模式下,CPU 停止运
行,而 SPI 、 USART 、模拟比较器、 ADC 、两线串行接口、定时器 / 计数器、看门狗和
中断系统继续工作。这个睡眠模式只停止了 clk
象定时器溢出与 USART 传输完成等内外部中断都可以唤醒 MCU 。如果不需要从模拟比
较器中断唤醒 MCU ,为了减少功耗,可以切断比较器的电源。方法是置位模拟比较器控
制和状态寄存器 ACSR 的 ACD 。如果 ADC 使能,进入此模式后将自动启动一次转换。
ADC 噪声抑制模式 当 SM2..0 为 001 时, SLEEP 指令将使 MCU 进入噪声抑制模式。在此模式下,CPU 停
止运行,而 ADC 、外部中断、两线接口地址配置、定时器 / 计数器 2 和看门狗继续工作。
这个睡眠模式只停止了 clk
I/O
、 clk
CPU
和 clk
FLASH
此模式提高了 ADC 的噪声环境,使得转换精度更高。 ADC 使能的时候,进入此模式将
自动启动一次 AD 转换。 ADC 转换结束中断、外部复位、看门狗复位、BOD 复位、两线
接口地址匹配中断、定时器 / 计数器 2 中断、SPM/EEPROM 准备好中断、外部电平中断
INT0 或 INT1 ,或外部中断 INT2 可以将 MCU 从 ADC 噪声抑制模式唤醒。
掉电模式 当 SM2..0 为 010 时, SLEEP 指令将使 MCU 进入掉电模式。在此模式下,外部晶体停
振,而外部中断、两线接口地址匹配及看门狗 (如果使能的话)继续工作。只有外部复
位、看门狗复位、 BOD 复位、两线接口地址匹配中断、外部电平中断 INT0 或 INT1 ,或
外部中断 INT2 可以使 MCU 脱离掉电模式。这个睡眠模式停止了所有的时钟,只有异步
模块可以继续工作。
CPU
和 clk
,其他时钟则继续工作。
FLASH
,其他时钟则继续工作。
当使用外部电平中断方式将 MCU 从掉电模式唤醒时,必须保持外部电平一定的时间。具
体请参见 P66“ 外部中断 ” 。
从施加掉电唤醒条件到真正唤醒有一个延迟时间,此时间用于时钟重新启动并稳定下来。
唤醒周期与由熔丝位 CKSEL 定义的复位周期是一样的,如 P23“ 时钟源 ” 所示。
省电模式 当 SM2..0 为 011 时, SLEEP 指令将使 MCU 进入省电模式。这一模式与掉电模式只有
一点不同:
如果定时器 / 计数器 2 为异步驱动,即寄存器 ASSR 的 AS2 置位,则定时器 / 计数器 2 在
睡眠时继续运行。除了掉电模式的唤醒方式,定时器 / 计数器 2 的溢出中断和比较匹配中
断也可以将 MCU 从休眠方式唤醒,只要 TIMSK 使能了这些中断,而且 SREG 的全局中
断使能位 I 置位。
如果异步定时器不是异步驱动的,建议使用掉电模式,而不是省电模式。因为在省电模式
下,若 AS2 为 0 ,则 MCU 唤醒后异步定时器的寄存器数值是没有定义的。
这个睡眠模式停止了除 clk
以外所有的时钟,只有异步模块可以继续工作。
ASY
Standby 模式 当 SM2..0 为 110 时, SLEEP 指令将使 MCU 进入 Standby 模式。这一模式与掉电模式
唯一的不同之处在于振荡器继续工作。其唤醒时间只需要 6 个时钟周期。
2502E–AVR–12/03
31
Page 32
扩展 Standby 模式 当 SM2..0 为 111 时, SLEEP 指令将使 MCU 进入扩展的 Standby 模式。这一模式与省
掉电模式唯一的不同之处在于振荡器继续工作。其唤醒时间只需要 6 个时钟周期。
Table 14. 在不同睡眠模式下活动的时钟以及唤醒源
工作的时钟 振荡器 唤醒源
使能的
clk
睡眠模式
空闲模式 XX X X X
ADC 噪声
抑制模式
clk
CP
U
FLAS
H
clk
clk
AD
IO
clk
C
ASY
使能的
主时钟
XX X X
定时器
时钟
(2)
(2)
INT2
INT1
INT0
掉电模式 X
省电模式 X
(2)
(2)
X
定时
TWI
地
址匹配
器
2
XX X XX X
(3)
X
(3)
(3)
X
XX XX
X
XX
(2)
SPM /
EEPROM
准备好
A
D
其他
C
I/O
Standby
(1)
模式
扩展的
Standby
(1)
模式
Notes: 1. 时钟源为外部晶体或谐振器
2. ASSR 的 AS2 置位
3. INT2 或电平中断 INT1 与 INT0
XX
(2)
X
XX
(2)
(3)
(3)
X
X
XX
(2)
32
ATmega8535(L)
2502E–AVR–12/03
Page 33
ATmega8535(L)
最小化功耗 试图降低 AVR 控制系统的功耗时需要考虑几个问题。一般来说,要尽可能利用睡眠模式,
并且使尽可能少的模块继续工作。不需要的功能必须禁止。下面的模块需要特殊考虑以达
到尽可能低的功耗。
模数转换器 使能时, ADC 在睡眠模式下继续工作。为了降低功耗,在进入睡眠模式之前需要禁止
ADC 。重新启动后的第一次转换为扩展的转换。具体请参照 P195“ 模数转换器 ” 。
模拟比较器 在空闲模式时,如果没有使用模拟比较器,可以将其关闭。在 ADC 噪声抑制模式下也是
如此。在其他睡眠模式模拟比较器是自动关闭的。如果模拟比较器使用了内部电压基准
源,则不论在什么睡眠模式下都需要关闭它。否则内部电压基准源将一直使能。请参见
P192“ 模拟比较器 ” 以了解如何配置模拟比较器。
掉电检测 BOD 如果系统没有使用掉电检测器 BOD ,这个模块也可以关闭。如果熔丝位 BODEN 被编程,
从而使能了 BOD 功能,它将在各种休眠模式下继续工作。在深层次的休眠模式下,这个
电流将占总电流的很大比重。请参看 P37“ 掉电检测 ” 以了解如何配置 BOD。
片内基准电压 使用 BOD 、模拟比较器和 ADC 时可能需要内部电压基准源。若这些模块都禁止了,则基
准源也可以禁止。重新使能后用户必须等待基准源稳定之后才可以使用它。如果基准源在
休眠过程中是使能的,其输出立即可以使用。请参见 P39“ 片内基准电压 ” 以了解基准源
启动时间的细节。
看门狗定时器 如果系统无需使用看门狗,这个模块也可以关闭。若使能,则在任何休眠模式下都持续工
作,从而消耗电流。在深层次的睡眠模式下,这个电流将占总电流的很大比重。请参看
P39“ 看门狗定时器 ” 以了解如何配置看门狗定时器。
端口引脚 进入休眠模式时,所有的端口引脚都应该配置为只消耗最小的功耗。最重要的是避免驱动
电阻性负载。在休眠模式下 I/O 时钟 clk
和 ADC 时钟 clk
I/O
都被停止了,输入缓冲器
ADC
也禁止了,从而保证输入电路不会消耗电流。在某些情况下输入逻辑是使能的,用来检测
唤醒条件。用于此功能的具体引脚请参见 P53“ 数字输入使能和睡眠模式 ” 。 如果输入缓
冲器是使能的,此时输入不能悬空,信号电平也不应该接近 V
/2,否则输入缓冲器会消
CC
耗额外的电流。
2502E–AVR–12/03
33
Page 34
系统控制与复位
复位 AVR 复位时所有的 I/O 寄存器都被设置为初始值,程序从复位向量处开始执行。复位向量处的
指令必须是绝对跳转 JMP 指令,以使程序跳转到复位处理例程。如果程序永远不利用中
断功能,中断向量可以由一般的程序代码所覆盖。这个处理方法同样适用于当复位向量位
于应用程序区,中断向量位于 Boot 区 — 或者反过来 — 的时候。 Figure 15 为复位逻辑
的电路图。 Table 15 则定义了复位电路的电气参数。
复位源有效时 I/O 端口立即复位为初始值。此时不要求任何时钟处于正常运行状态。
所有的复位信号消失之后,芯片内部的一个延迟计数器被激活,将内部复位的时间延长。
这种处理方式使得在 MCU 正常工作之前有一定的时间让电源达到稳定的电平。延迟计数
器的溢出时间通过熔丝位 SUT 与 CKSEL 设定。延迟时间的选择请参见 P23“ 时钟源 ” 。
复位源 ATmega8535 有 4 个复位源:
• 上电复位。电源电压低于上电复位门限 V
• 外部复位。引脚 RESET
上的低电平持续时间大于最小脉冲宽度时 MCU 复位。
• 看门狗复位。看门狗使能并且看门狗定时器溢出时复位发生。
• 掉电检测复位。掉电检测复位功能使能,且电源电压低于掉电检测复位门限 V
MCU 即复位。
Figure 15. 复位逻辑
时, MCU 复位。
POT
DATA BUS
BOT
时
BODEN
BODLEVEL
Pull-up Resistor
Spike
Filter
Power-on
Reset Circuit
Brown-out
Reset Circuit
Reset Circuit
Watchdog
Timer
Watchdog
Oscillator
Clock
Generator
CKSEL[3:0]
SUT[1:0]
MCU Control and Status
Register (MCUCSR)
BORF
PORF
WDRF
EXTRF
CK
Delay Counters
TIMEOUT
34
ATmega8535(L)
2502E–AVR–12/03
Page 35
Table 15. 复位特性
符号 参数 条件
ATmega8535(L)
最小值典型
值 最大值 单位
V
V
V
V
POT
RST
t
RST
BOT
t
BOD
HYST
上电复位门限电压 ( 电压由
低到高上升 )
上电复位门限电压 ( 电压由
高到低跌落 )
(2)
RESET 门限电压 0.1 0.9 V
RESET 最小脉冲宽度 1.5 µs
掉电检测复位门限电压
(3)
BODLEVEL = 1 2.5 2.7 3.2
BODLEVEL = 0 3.7 4.0 4.2
触发掉电检测复位的低电平
的最小持续时间
BODLEVEL = 1 2 µs
BODLEVEL = 0 2 µs
掉电检测器的容限 130 mV
1.4 2.3 V
1.3 2.3 V
V
Notes: 1. 数值仅供参考。
2. 电压下降时,只有电压低于 V
3. 一些器件的 V
了 V CC = V
可能比标称的最小工作电压还要低。这些器件在生产测试过程中进行
BOT
的测试,保证在 VCC下降到处理器无法正常工作之前产生掉电检测复
BOT
时复位才会发生。
POT
位。 ATmega8535L 的测试条件为 BODLEVEL=1 , ATmega8535 的测试条件为
BODLEVEL=0。 BODLEVEL=1 不适用于 ATmega8535。
上电复位 上电复位 (POR) 脉冲由片内检测电路产生。检测电平请参见 Table 15 。 无论何时 V CC低
于检测电平 POR 即发生。 POR 电路可以用来触发启动复位,或者用来检测电源故障。
POR 电路保证器件在上电时复位。V
出之前器件一直保持为复位状态。当 V
达到上电门限电压后触发延迟计数器。在计数器溢
CC
下降时,只要低于检测门限, RESET 信号立即
CC
生效。
2502E–AVR–12/03
Figure 16. MCU 启动过程, RESET
V
V
CC
RESET
TIME-OUT
NTERNAL
RESET
POT
V
RST
t
TOUT
连接到 V
CC
35
Page 36
Figure 17. MCU 启动过程, RESET 由外电路控制
V
V
CC
RESET
TIME-OUT
NTERNAL
RESET
POT
V
RST
t
TOUT
36
ATmega8535(L)
2502E–AVR–12/03
Page 37
ATmega8535(L)
外部复位 外部复位由外加于 RESET 引脚的低电平产生。当复位低电平持续时间大于最小脉冲宽度
时 ( 参见 Table 15) 即触发复位过程,即使此时并没有时钟信号在运行。当外加信号达到
复位门限电压 V
Figure 18. 工作过程中发生外部复位
CC
掉电检测 ATmega8535 具有片内 BOD(Brown-out Detection) 电路,通过与固定的触发电平的对比
来检测工作过程中 V
(BODLEVEL 未编程 ),4.0V (BODLEVEL 已编程 )。BOD 的触发电平具有迟滞功能以消
除电源尖峰的影响。这个迟滞功能可以解释为 V
- V
HYST
/2。
BOD 电路的开关由熔丝位 BODEN控制。当BOD使能后(BODEN被编程),一 旦 V
触发电平以下 (V
时(V
如果 V
,Figure 19),延时计数器开始计数,一旦超过溢出时间t
BOT+
一直低于触发电平并保持如 Table 15 所示的时间 t
CC
压跌落。
(上升沿)时, t
RST
的变化。此触发电平通过熔丝位 BODLEVEL 来设定, 2.7V
CC
, Figure 19), BOD 复位立即被激发。当 V CC上升到触发电平以上
BOT-
延时周期开始。延时结束后 MCU 即启动。
TOUT
BOT+
= V
BOT
+ V
BOD
/2 以及 V
HYST
, MCU即恢复工作。
TOUT
, BOD 电路将只检测电
BOT-
= V
下降到
CC
BOT
Figure 19. 工作过程中发生掉电检测复位
V
CC
RESET
TIME-OUT
NTERNAL
RESET
V
BOT-
V
BOT+
t
TOUT
37
2502E–AVR–12/03
Page 38
看门狗复位 看门狗定时器溢出时将产生持续时间为 1 个 CK 周期的复位脉冲。在脉冲的下降沿,延时
定时器开始对 t
记数。请参见 P39 以了解看门狗定时器的具体操作过程。
TOUT
Figure 20. 工作过程中发生看门狗复位
CC
CK
MCU 控制和状态寄存器-
MCUCSR
MCU 控制和状态寄存器提供了有关引起 MCU 复位的复位源的信息。
B i t 76543210
– ISC2 – – WDRF BORF EXTRF PORF MCUCSR
读/写 R/W R/W R R/W R/W R/W R/W R/W
初始值 000 见位说明
• Bit 3 – WDRF: 看门狗复位标志
看门狗复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 2 – BORF: 掉电检测复位标志
掉电检测复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 1 – EXTRF: 外部复位标志
外部复位发生时置位。上电复位将使其清零,也可以通过写 ”0” 来清除。
• Bit 0 – PORF: 上电复位标志
上电复位发生时置位。只能通过写 ”0” 来清除。
为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复
位。如果在其他复位发生之前将此寄存器复位,则后续复位源可以通过检查复位标志来了
解。
38
ATmega8535(L)
2502E–AVR–12/03
Page 39
ATmega8535(L)
片内基准电压 ATmega8535 具有片内能隙基准源,用于掉电检测,或者是作为模拟比较器或 ADC 的输
入。 ADC 的 2.56V 基准电压由此片内能隙基准源产生。
基准电压使能信号和启动时间 电压基准的启动时间可能影响其工作方式。启动时间列于 Table 16 。为了降低功耗,可以
控制基准源仅在如下情况打开:
1. BOD 使能 ( 熔丝位 BODEN 被编程 )
2. 能隙基准源连接到模拟比较器 (ACSR 寄存器的 ACBG 置位 )
3. ADC 使能
因此,当 BOD 被禁止时,置位 ACBG 或使能 ADC 后要启动基准源。为了降低掉电模式
的功耗,用户可以禁止上述三种条件,并在进入掉电模式之前关闭基准源。
Table 16. 内部电压基准源的特性
符号 参数
V
BG
t
BG
I
BG
Note: 1. 数值仅供参考。
能隙基准源电压 1.15 1.23 1.35 V
能隙基准源启动时间 40 70 µs
能隙基准源功耗 10 µA
(1)
看门狗定时器 看门狗定时器由独立的 1 Mhz 片内振荡器驱动。这是 V
数据以了解其他V
复位的时间间隔,如 P41Table 18 所示。看门狗复位指令 WDR 用来复位看门狗定时器。
此外,禁止看门狗定时器或发生复位时定时器也被复位。复位时间有 8 个选项。如果没有
及时复位定时器,一旦时间超过复位周期, ATmega8535 就复位,并执行复位向量指向
的程序。具体的看门狗复位时序在 P38 有说明。
为了防止无意之间禁止看门狗定时器或改变了复位时间,根据熔丝位S8535C 和 WDTON
芯片提供了 3 个不同的保护级别,如 Table 17. 所示。安全级别 0 相应于 AT90S8535 的
设置。使能看门狗定时器则没有限制。
电平下的典型值。通过设置看门狗定时器的预分频器可以调节看门狗
CC
最小值典型值最大
值单 位
= 5V 时的典型值。请参见特性
CC
2502E–AVR–12/03
39
Page 40
Table 17. WDT 配置表
安全级别WDT 初始
S8535C WDTON
未编程 未编程 1 禁止 时间序列 时间序列
未编程 已编程 2 使能 总是使能 时间序列
已编程 未编程 0 禁止 时间序列 没有限制
已编程 已编程 2 使能 总是使能 时间序列
状态 如何禁止 WDT
如何改变复
位间隔时间
Figure 21. 看门狗定时器
WATCHDOG
OSCILLATOR
看门狗定时器控制寄存器-
WDTCR
B i t 76543210
– – – WDCE WDE WDP2 WDP1 WDP0 WDTCR
读/写 R R R R/W R/W R/W R/W R/W
初始值 00000000
• Bits 7..5 – Res: 保留
保留位,读操作返回值为零。
• Bit 4 – WDCE: 看门狗修改使能
清零 WDE 时必须先置位 WDCE ,否则不能禁止看门狗。一旦置位,硬件将在紧接的 4 个
时钟周期之后将其清零。请参考有关 WDE 的说明来禁止看门狗。工作于安全级别 1 和 2
时也必须置位 WDCE 以修改预分频器的数据,如 P43“ 改变看门狗定时器配置的时间序列
” 所示。
• Bit 3 – WDE: 看门狗使能
WDE 为"1“ 时,看门狗使能,否则看门狗将被禁止。只有在WDCE 为 "1“ 时 WDE 才能清零。
以下为关闭看门狗的步骤:
1. 在同一个指令内对 WDCE 和 WDE 写 "1“,即使 WDE 已经为 "1“。
2. 在紧接的 4 个时钟周期之内对 WDE 写 "0”。
工作于安全级别 2 时是永远无法禁止看门狗定时器的。参见 P43“ 改变看门狗定时器配置
的时间序列 ” 。
• Bits 2..0 – WDP2, WDP1, WDP0: 看门狗定时器预分频器 2, 1, 和 0
40
ATmega8535(L)
2502E–AVR–12/03
Page 41
ATmega8535(L)
WDP2、WDP1 和 WDP0 决定看门狗定时器的预分频器,其预分频值及相应的溢出周期如
Table 18 所示。
Table 18. 看门狗定时器预分频器选项
WDP2 WDP1 WDP0 WDT 振荡器周期
0 0 0 16K (16,384) 17.1 ms 16.3 ms
0 0 1 32K (32,768) 34.3 ms 32.5 ms
0 1 0 64K (65,536) 68.5 ms 65 ms
0 1 1 128K (131,072) 0.14 s 0.13 s
1 0 0 256K (262,144) 0.27 s 0.26 s
1 0 1 512K (524,288) 0.55 s 0.52 s
1 1 0 1,024K (1,048,576) 1.1 s 1.0 s
1 1 1 2,048K (2,097,152) 2.2 s 2.1 s
Note: 1. 数值仅供参考。
(1)
V
= 3.0V 时典型
CC
的溢出周期
VCC = 5.0V 时典型
的溢出周期
2502E–AVR–12/03
41
Page 42
下面的例子分别用汇编和C 实现了关闭WDT 的操作。在此假定中断处于用户控制之下 (比
如禁止全局中断 ) ,因而在执行下面程序时中断不会发生。
汇编代码例程
WDT_off:
;
复位
WDT
wdr
;
置位
WDCE 和 WDE
in r16, WDTCR
ori r16, (1<<WDCE)|(1<<WDE)
out WDTCR, r16
;
关闭
WDT
ldi r16, (0<<WDE)
out WDTCR, r16
ret
C 代码例程
void WDT_off(void )
{
/*
复位
WDT */
_WDR()
/*
置位
WDCE 和 WDE */
WDTCR |= (1<<WDCE) | (1<<WDE);
/*
关闭 WDT */
WDTCR = 0x00;
}
42
ATmega8535(L)
2502E–AVR–12/03
Page 43
ATmega8535(L)
改变看门狗定时器配置的时
改变配置的序列根据不同的安全级别略有不同。下面将逐一说明。
间序列
安全级别 0 这个模式与 AT90S8535 的看门狗操作相兼容。看门狗的初始状态是禁止的,可以没有限
制地通过置位 WDE 来使能它,以及改变定时器溢出周期。禁止看门狗定时器时则需要遵
守如下步骤:
1. 在同一个指令内对 WDCE 和 WDE 写 "1“,即使 WDE 已经为 "1“。
2. 在紧接的 4 个时钟周期之内同时对 WDE及 WDP 写入合适的数据,而 WDCE 则写
"0”。
安全级别 1 在这个模式下,看门狗定时器的初始状态是禁止的,可以没有限制地通过置位 WDE 来使
能它。改变定时器溢出周期及禁止 ( 已经使能的 ) 看门狗定时器时需要执行一个特定的时
间序列:
1. 在同一个指令内对 WDCE 和 WDE 写 "1“,即使 WDE 已经为 "1“。
2. 在紧接的 4 个时钟周期之内同时对 WDE及 WDP 写入合适的数据,而 WDCE 则写
"0”。
安全级别 2 在这个模式下,看门狗定时器总是使能的, WDE 的读返回值为 "1” 。 改变定时器溢出周
期需要执行一个特定的时间序列:
1. 在同一个指令内对 WDCE 和 WDE 写"1“ 。虽 然 WDE 总是为置位状态,也必须写"1“
以启动时序。
2. 在紧接的 4 个时钟周期之内同时对 WDCE 写 "0”,以 及 为 WDP 写入合适的数据。
WDE 的数值可以任意。
2502E–AVR–12/03
43
Page 44
中断 本节说明 ATmega8535 的中断处理。更一般的 AVR 中断处理请参见 P11“ 复位与中断处
理 ” 。
ATmega8535 的中断向量
Table 19. 复位和中断向量
程序
向量号
1 0x000
2 0x001 INT0 外部中断请求 0
3 0x002 INT1 外部中断请求 1
4 0x003 TIMER2 COMP 定时器 / 计数器 2 比较匹配
5 0x004 TIMER2 OVF 定时器 / 计数器 2 溢出
6 0x005 TIMER1 CAPT 定时器 / 计数器 1 捕捉事件
7 0x006 TIMER1 COMPA 定时器 / 计数器 1 比较匹配 A
8 0x007 TIMER1 COMPB 定时器 / 计数器 1 比较匹配 B
9 0x008 TIMER1 OVF 定时器 / 计数器 1 溢出
10 0x009 TIMER0 OVF 定时器 / 计数器 0 溢出
11 0x00A SPI, STC SPI 串行传输结束
12 0x00B USART, RXC USART, Rx 结束
13 0x00C USART, UDRE USART 数据寄存器空
14 0x00D USART, TXC USART, Tx 结束
15 0x00E ADC ADC 转换结束
16 0x00F EE_RDY EEPROM 就绪
地址
(2)
中断源 中断定义
(1)
RESET 外部引脚,上电复位,掉电检测复位,看门狗复
位
17 0x010 ANA_COMP 模拟比较器
18 0x011 TWI 两线串行接口
19 0x012 INT2 外部中断请求 2
20 0x013 TIMER0 COMP 定时器 / 计数器 0 比较匹配
21 0x014 SPM_RDY 保存程序存储器内容就绪
Notes: 1. 熔丝位 BOOTRST 被编程时,MCU 复位后程序跳转到 Boot Loader。请参见 P212“支持
引导装入程序 – 在写的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” 。
2. 当寄存器 GICR的 IVSEL置位时,中断向量转移到Boot区的起始地址。此时各个中断向
量的实际地址为表中地址与 Boot 区起始地址之和。
Table 20给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远
不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于
应用区,而其他中断向量位于 Boot 区,则复位向量之后可以直接写程序。反过来亦是如
此。
Table 20. 复位和中断向量位置的确定
BOOTRST
(1)
IVSEL 复位地址 中断向量起始地址
1 0 0x0000 0x0001
44
ATmega8535(L)
2502E–AVR–12/03
Page 45
ATmega8535(L)
Table 20. 复位和中断向量位置的确定
BOOTRST
Note: 1. Boot 区复位地址列于 P223Table 93 。 对于熔丝位 BOOTRST,“1” 表示未编程, “0” 表
ATmega8535 典型的复位和中断设置如下:
地址 符号 代码 说明
0x000 rjmp RESET ; 复位中断向量
0x001 rjmp EXT_INT0 ; IRQ0 中断向量
0x002 rjmp EXT_INT1 ; IRQ1 中断向量
0x003 rjmp TIM2_COMP ; Timer2 比较中断向量
0x004 rjmp TIM2_OVF ; Timer2 溢出中断向量
0x005 rjmp TIM1_CAPT ; Timer1 捕捉中断向量
0x006 rjmp TIM1_COMPA ; Timer1 比较 A 中断向量
0x007 rjmp TIM1_COMPB ; Timer1 比较 B 中断向量
0x008 rjmp TIM1_OVF ; Timer1 溢出中断向量
0x009 rjmp TIM0_OVF ; Timer0 溢出中断向量
0x00A rjmp SPI_STC ; SPI 传输结束中断向量
0x00B rjmp USART_RXC ; USART RX 结束中断向量
0x00C rjmp USART_UDRE ; UDR 空中断向量
0x00D rjmp USART_TXC ; USART TX 结束中断向量
0x00E rjmp ADC ; ADC 转换结束中断向量
0x00F rjmp EE_RDY ; EEPROM 就绪中断向量
0x010 rjmp ANA_COMP ; 模拟比较器中断向量
0x011 rjmp TWSI ; 两线串行接口中断向量
0x012 rjmp EXT_INT2 ; IRQ2 中断向量
0x013 rjmp TIM0_COMP ; Timer0 比较中断向量
0x014 rjmp SPM_RDY ; SPM 就绪中断向量
;
0x015 RESET: ldi r16,high(RAMEND) ;
0x016 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
0x017 ldi r16,low(RAMEND)
0x018 out SPL,r16
0x019 sei ;
0x020 <instr> xxx
... ... ...
(1)
IVSEL 复位地址 中断向量起始地址
1 1 0x0000 Boot 区复位地址 + 0x0001
00 B o o t 区复位地址 0x0001
01 B o o t 区复位地址 Boot 区复位地址 + 0x0001
示已编程。
主程序
使能中断
2502E–AVR–12/03
当熔丝位 BOOTRST 未编程,Boot 区为 2K 字节,且寄存器 GICR 的 IVSEL 置位时,典
型的复位和中断设置如下:
45
Page 46
地址 符号 代码 说明
0x000 RESET: ldi r16,high(RAMEND) ; 主程序
0x001 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
0x002 ldi r16,low(RAMEND)
0x003 out SPL,r16
0x004 sei ;
0x005 <instr> xxx
;
.org 0xC01
0xC01 rjmp EXT_INT0 ; IRQ0
0xC02 rjmp EXT_INT1 ; IRQ1 中断向量
... .... .. ;
0xC14 rjmp SPM_RDY ; SPM 就绪中断向量
使能中断
中断向量
当熔丝位 BOOTRST 已编程,且 Boot 区为 2K 字节时,典型的复位和中断设置如下:
地址 符号 代码 说明
.org 0x001
0x001 rjmp EXT_INT0 ; IRQ0 中断向量
0x002 rjmp EXT_INT1 ; IRQ1 中断向量
... ... . .. ;
0x014 rjmp SPM_RDY ; SPM 就绪中断向量
;
.org 0xC00
0xC00RESET: ldi r16,high(RAMEND) ; 主程序
0xC01 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
0xC02 ldi r16,low(RAMEND)
0xC03 out SPL,r16
0xC04 sei ;
0xC05 <instr> xxx
使能中断
当熔丝位 BOOTRST 已编程, Boot 区为 2K 字节,且寄存器 GICR 的 IVSEL 置位时,典
型的复位和中断设置如下:
地址 符号 代码 说明
.org 0xC00
0xC00 rjmp RESET ; Reset 中断向量
0xC01 rjmp EXT_INT0 ; IRQ0 中断向量
0xC02 rjmp EXT_INT1 ; IRQ1 中断向量
... ... . .. ;
0xC14 rjmp SPM_RDY ; SPM 就绪中断向量
;
0xC15RESET: ldi r16,high(RAMEND) ;
0xC16 out SPH,r16 ; 设置堆栈指针为 RAM 的顶部
0xC17 ldi r16,low(RAMEND)
0xC18 out SPL,r16
0xC19 sei ;
0xC20 <instr> xxx
主程序
使能中断
在应用区和 Boot 区之间移动中断通用中断控制寄存器决定中断向量表的放置地址。
46
ATmega8535(L)
2502E–AVR–12/03
Page 47
ATmega8535(L)
通用中断控制寄存器- GICR
B i t 76543210
INT1 INT0 INT2 – – – IVSEL IVCE GICR
读/写 R/W R/W R/W R R R R/W R/W
初始值 00000000
• Bit 1 – IVSEL: 中断向量选择
当 IVSEL 为 "0“ 时,中断向量位于 Flash 存储器的起始地址;当 IVSEL 为 "1“ 时,中断向
量转移到 Boot 区的起始地址。实际的 Boot 区起始地址由熔丝位 BOOTSZ 确定。具体请
参考 P212“ 支持引导装入程序 – 在写的同时可以读 (RWW, Read-While-Write) 的自我编
程能力 ” 。 为了防止无意识地改变中断向量表,修改 IVSEL 时需要遵照如下过程:
1. 置位中断向量修改使能位 IVCE
2. 在紧接的 4 个时钟周期里将需要的数据写入 IVSEL,同时对 IVCE 写 ”0”
执行上述序列时中断自动被禁止。其实,在置位 IVCE 时中断就被禁止了,并一直保持到
写 IVSEL 操作之后的下一条语句。如果没有 IVSEL 写操作,则中断在置位 IVCE 之后的
4 个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位 I 的值并
不受此操作的影响。
Note: 若中断向量位于Boot 区,且Boot 锁定位 BLB02 被编程,则执行应用区的程序时中断被禁止
;若中断向量位于应用区,且 Boot 锁定位 BLB12 被编程, 则执行 Boot 区的程序时中断
被禁止。有关 Boot 锁定位的细节请参见 P212“ 支持引导装入程序 – 在写的同时可以读
(RWW, Read-While-Write) 的自我编程能力 ” 。
• Bit 0 – IVCE: 中断向量修改使能
改变 IVSEL 时 IVCE 必须置位。在 IVCE 或 IVSEL 写操作之后 4 个时钟周期, IVCE 被
硬件清零。如前面所述,置位 IVCE 将禁止中断。代码如下:
2502E–AVR–12/03
47
Page 48
汇编代码例程:
Move_interrupts:
; 使能中断向量的修改
ldi r16, (1<<IVCE)
out GICR, r16
; 将中断向量转移到 boot
ldi r16, (1<<IVSEL)
out GICR, r16
ret
C 代码例程
void Move_interrupts(void )
{
/* 使能中断向量的修改 */
GICR = (1<<IVCE);
/* 将中断向量转移到 boot
GICR = (1<<IVSEL);
}
Flash 区
Flash 区 */
48
ATmega8535(L)
2502E–AVR–12/03
Page 49
ATmega8535(L)
I/O 端口
介绍 作为通用数字 I/O 使用时,所有 AVR I/O 端口都具有真正的读 - 修改 - 写功能。这意味着
用 SBI 或 CBI 指令改变某些管脚的方向 ( 或者是端口电平、禁止 / 使能上拉电阻 ) 时不会
无意地改变其他管脚的方向 ( 或者是端口电平、禁止 / 使能上拉电阻 )。输出缓冲器具有对
称的驱动能力,可以输出或吸收大电流,直接驱动 LED。所有的端口引脚都具有与电压无
关的上拉电阻。并有保护二极管与 V
特性 ” 以了解完整的参数列表。
Figure 22. I/O 引脚等效原理图
和地相连,如 Figure 22 所示。请参见 P242“ 电气
CC
R
pu
Pxn
C
pin
本节所有的寄存器和位以通用格式表示:小写的 “x” 表示端口的序号,而小写的 “n” 代表
位的序号。但是在程序里要写完整。例如, PORTB3 表示端口 B 的第 3 位,而本节的通
用格式为 PORTxn 。物理 I/O 寄存器和位定义列于 P64“I/O 端口寄存器的说明 ” 。
每个端口都有三个 I/O 存储器地址:数据寄存器 – PORTx 、 数据方向寄存器 – DDRx 和
端口输入引脚 – PINx 。数据寄存器和数据方向寄存器为读 / 写寄存器,而端口输入引脚为
只读寄存器。但是需要特别注意的是,对 PINx 寄存器某一位写入逻辑 "1“ 将造成数据寄
存器相应位的数据发生 "0“ 与 “1“ 的交替变化。当寄存器 SFIOR 的上拉禁止位 PUD 置位
时所有端口引脚的上拉电阻都被禁止。
作为通用数字 I/O 时的端口请参见 P49“ 作为通用数字 I/O 的端口 ” 。多数端口引脚是与第
二功能复用的,如 P55“ 端口的第二功能 ” 所示。请参见各个模块的具体说明以了解引脚
的第二功能。
使能某些引脚的第二功能不会影响其他属于同一端口的引脚用于通用数字 I/O 目的。
See Figure
"General Digital I/O" for
Logic
Details
作为通用数字 I/O 的端口 端口为具有可选上拉电阻的双向 I/O 端口。 Figure 23 为一个 I/O 端口引脚的说明。
2502E–AVR–12/03
49
Page 50
Figure 23. 通用数字 I/O
Pxn
(1)
Q
D
DDxn
Q
CLR
RESET
Q
D
PORTxn
Q
CLR
RESET
PUD
WDx
RDx
WPx
DATA BUS
SLEEP
SYNCHRONIZER
Q
D
PINxn
Q
Q
PUD: PULLUP DISABLE
SLEEP: SLEEP CONTROL
clk
: I/O CLOCK
I/O
DLQ
WDx: WRITE DDRx
RDx: READ DDRx
WPx: WRITE PORTx
RRx: READ PORTx REGISTER
RPx: READ PORTx PIN
Note: 1. WPx, WDx, RRx, RPx 和 RDx 对于同一端口的所有引脚都是一样的。 clk
RRx
RPx
clk
I/O
, SLEEP 和
I/O
PUD 则对所有的端口都是一样的。
配置引脚 每个端口引脚都具有三个寄存器位 : DDxn 、 PORTxn 和 PINxn ,如 P64“I/O 端口寄存器
的说明 ” 所示。 DDxn 位于 DDRx 寄存器, PORTxn 位于 PORTx 寄存器, PINxn 位于
PINx 寄存器。
DDxn 用来选择引脚的方向。 DDxn 为 "1“ 时, Pxn 配置为输出,否则配置为输入。
引脚配置为输入时,若 PORTxn 为 "1“ ,上拉电阻将使能。如果需要关闭这个上拉电阻,
可以将 PORTxn 清零,或者将这个引脚配置为输出。复位时各引脚为高阻态,即使此时
并没有时钟在运行。
50
当引脚配置为输出时,若 PORTxn 为 "1“ ,引脚输出高电平 ("1“) ,否则输出低电平 (“0“) 。
在 ( 高阻态 ) 三态 ({DDxn, PORTxn} = 0b00) 输出高电平 ({DDxn, PORTxn} = 0b11) 两种
状态之间进行切换时,上拉电阻使能 ({DDxn, PORTxn} = 0b01) 或输出低电平 ({DDxn,
PORTxn} = 0b10) 这两种模式必然会有一个发生。通常,上拉电阻使能是完全可以接受
的,因为高阻环境不在意是强高电平输出还是上拉输出。如果使用情况不是这样子,可以
通过置位 SFIOR 寄存器的 PUD 来禁止所有端口的上拉电阻。
在上拉输入和输出低电平之间切换也有同样的问题。用户必须选择高阻态 ({DDxn,
PORTxn} = 0b00) 或输出高电平 ({DDxn, PORTxn} = 0b10) 作为中间步骤。
ATmega8535(L)
2502E–AVR–12/03
Page 51
Table 21 总结了引脚的控制信号。
Table 21. 端口引脚配置
ATmega8535(L)
PUD
DDxn PORTxn
00 X输入 No 高阻态 (Hi-Z)
01 0输入 Ye s 被外部电路拉低时将输出电流
01 1输入 No 高阻态 (Hi-Z)
10 X输出 No 输出低电平 ( 漏电流 )
11 X输出 No 输出高电平 ( 源电流 )
(in SFIOR) I/O
上拉电
阻说 明
读取引脚上的数据 不论如何配置 DDxn ,都可以通过读取 PINxn 寄存器来获得引脚电平。如 Figure 23 所示,
PINxn 寄存器的各个位与其前面的锁存器组成了一个同步器。这样就可以避免在内部时钟
状态发生改变的短时间范围内由于引脚电平变化而造成的信号不稳定。其缺点是引入了
延迟。 Figure 24 为读取引脚电平时同步器的时序图。最大和最小传输延迟分别为 t
和 t
pd,min
。
pd,max
Figure 24. 读取引脚数据时的同步
SYSTEM CLK
INSTRUCTIONS
XXX in r17, PINx
XXX
SYNC LATCH
PINxn
r17
0x00 0xFF
t
pd, max
t
pd, min
下面考虑第一个系统时钟下降沿之后起始的时钟周期。当时钟信号为低时锁存器是关闭
的;而时钟信号为高时信号可以自由通过,如图中 SYNC LATCH 信号的阴影区所示。时
钟为低时信号即被锁存,然后在紧接着的系统时钟上升沿锁存到 PINxn 寄存器。如 t
和 t
所示,引脚上的信号转换延迟界于 ½ ~ 1½ 个系统时钟。
pd,min
pd,max
如 Figure 25 所示,读取软件赋予的引脚电平时需要在赋值指令 out 和读取指令 in 之间有
一个时钟周期的间隔,如 nop 指令。 out 指令在时钟的上升沿置位 SYNC LATCH 信号。
此时同步器的延迟时间 t
为一个系统时钟。
pd
2502E–AVR–12/03
51
Page 52
Figure 25. 读取软件赋予的引脚电平的同步
SYSTEM CLK
r16
INSTRUCTIONS
SYNC LATCH
PINxn
r17
0xFF
out PORTx, r16 nop in r17, PINx
0x00 0xFF
t
pd
52
ATmega8535(L)
2502E–AVR–12/03
Page 53
ATmega8535(L)
下面的例子演示了如何置位端口B 的引脚0和1 ,清零引脚2和3 ,以及将引脚4到7 设置为输
入,并且为引脚 6 和 7 设置上拉电阻。然后将各个引脚的数据读回来。如前面讨论的那
样,我们在输出和输入语句之间插入了一个 nop 指令。
汇编代码例程
...
; 定义上拉电阻和设置高电平输出
; 为端口引脚定义方向
ldi r16,(1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0)
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
out PORTB,r16
out DDRB,r17
; 为了同步插入 nop 指令
nop
; 读取端口引脚
in r16,PINB
...
C 代码例程
unsigned char i;
...
/* 定义上拉电阻和设置高电平输出 */
/* 为端口引脚定义方向 */
PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* 为了同步插入 nop 指令 */
_NOP();
/* 读取端口引脚 */
i = PINB;
...
(1)
(1)
Note: 1. 在汇编程序里使用了两个暂存器。其目的是为了使整个操作过程的时间最短。通过拉
高引脚 0、 1、 6 与 7,直到方向位设置正确,定义位 2、 3 为低,且重新定义为 0 与
1 为强驱动。
数字输入使能和睡眠模式 如 Figure 23 所示,数字输入信号 ( 施密特触发器的输入 ) 可以钳位到地。图中的 SLEEP
信号由 MCU 休眠控制器在各种掉电模式、省电模式以及 Standby 模式下设置,以防止在
输入悬空或模拟输入电平接近 V
/2 时消耗太多的电流。
CC
引脚作为外部中断输入时 SLEEP 信号无效。但若外部中断没有使能, SLEEP 信号仍然
有效。引脚的第二功能使能时 SLEEP 也让位于第二功能,如 P55“ 端口的第二功能 ” 里描
述的那样。
如果逻辑高电平 (“1”) 出现在一个被设置为 " 上升沿、下降沿或任何逻辑电平变化都引起
中断 " 的外部异步中断引脚上,即使该外部中断未被使能,但从上述休眠模式唤醒时,相
应的外部中断标志位仍会被置 "1”。这是因为引脚电平在休眠模式下被钳位到 "0” 电平。唤
醒过程造成了引脚电平从 "0” 到 ”1” 的变化。
未连接引脚的处理 如果有引脚未被使用,建议给这些引脚赋予一个确定电平。虽然如上文所述,在深层休眠
模式下大多数数字输入被禁用,但还是需要避免因引脚没有确定的电平而造成悬空引脚
在其它数字输入使能模式 ( 复位、工作模式、空闲模式 ) 消耗电流。
最简单的保证未用引脚具有确定电平的方法是使能内部上拉电阻。但要注意的是复位时
上拉电阻将被禁用。如果复位时的功耗也有严格要求则建议使用外部上拉或下拉电阻。不
53
2502E–AVR–12/03
Page 54
推荐直接将未用引脚与 V CC 或 GND 连接,因为这样可能会在引脚偶然作为输出时出现冲
击电流。
54
ATmega8535(L)
2502E–AVR–12/03
Page 55
ATmega8535(L)
端口的第二功能 除了通用数字I/O 功能之外,大多数端口引脚都具有第二功能。 Figure 26 说明了由Figure
23 简化得出的端口引脚控制信号是如何被第二功能取代的。这些被重载的信号不会出现
在所有的端口引脚,但本图可以看作是适合于 AVR系列处理器所有端口引脚的一般说明。
Figure 26. 端口的第二功能
Pxn
(1)
PUOExn
1
0
PUOVxn
PUD
DDOExn
1
0
1
0
1
0
DDOVxn
PVOExn
PVOVxn
DIEOExn
DIEOVxn
SLEEP
SYNCHRONIZER
SET
DLQ
Q
CLR
D
PINxn
D
Q
DDxn
Q
CLR
WDx
RESET
RDx
D
Q
PORTxn
Q
CLR
WPx
DATA BUS
RESET
RRx
RPx
Q
Q
CLR
clk
I/O
DIxn
AIOxn
PUOExn: Pxn PULL-UP OVERRIDE ENABLE
PUOVxn: Pxn PULL-UP OVERRIDE VALUE
DDOExn: Pxn DATA DIRECTION OVERRIDE ENABLE
DDOVxn: Pxn DATA DIRECTION OVERRIDE VALUE
PVOExn: Pxn PORT VALUE OVERRIDE ENABLE
PVOVxn: Pxn PORT VALUE OVERRIDE VALUE
DIEOExn: Pxn DIGITAL INPUT-ENABLE OVERRIDE ENABLE
DIEOVxn: Pxn DIGITAL INPUT-ENABLE OVERRIDE VALUE
SLEEP: SLEEP CONTROL
PUD: PULLUP DISABLE
WDx: WRITE DDRx
RDx: READ DDRx
RRx: READ PORTx REGISTER
WPx: WRITE PORTx
RPx: READ PORTx PIN
clk
: I/O CLOCK
I/O
DIxn: DIGITAL INPUT PIN n ON PORTx
AIOxn: ANALOG INPUT/OUTPUT PIN n ON PORTx
Note: 1. WPx, WDx, RRx, RPx和RDx对于同一个端口的所有引脚都是一样的。clk
PUD 则对所有的端口都是一样的。其他信号只对某一个引脚有效。
, SLEEP和
I/O
2502E–AVR–12/03
55
Page 56
Table 22 为重载信号的简介。表中没有给出 Figure 26 的引脚和端口索引。这些重载信号
是由第二功能模块产生的。
Table 22. 第二功能重载信号的一般说明
信号名
称 全 称 说 明
PUOE 上拉电阻
重载使能
PUOV 上拉电阻
重载值
若此信号置位,上拉电阻使能将受控于 PUOV ;若此信号清
零,则 {DDxn, PORTxn, PUD} = 0b010 时上拉电阻使能。
若 PUOE 置位,则不论 DDxn 、 PORTxn 和 PUD 寄存器各个
位如何配置, PUOV 置位 / 清零时上拉电阻使能 / 禁止
DDOE 数据方向
重载使能
DDOV 数据方向
重载值
PVOE 端口数据
重载使能
PVOV 端口数据
重载值
DIEOE
DIEOV
DI 数字输入 此信号为第二功能的数字输入。在图中,这个信号与施密特触
AIO 模拟信号
数字输入使能
覆盖使能
数字输入使能
覆盖值
输入 / 输出
如果此信号置位,则输出驱动使能由 DDOV 控制;若此信号清
零,输出驱动使能由 DDxn 寄存器控制。
若 DDOE 置位,则 DDOV 置位 / 清零时输出驱动使能 / 禁止,
而不管 DDxn 寄存器的设置如何。
如果这个信号置位,且输出驱动使能,端口数据由 PVOV 控制
;若 PVOE 清零,且输出驱动使能,端口数据由寄存器
PORTxn 控制。
若 PVOE 置位,端口值设置为 PVOV ,而不管寄存器 PORTxn
如何设置。
如果这个信号置位,数字输入使能由 DIEOV 控制;若 DIEOE
清零,数字输入使能由 MCU 的状态确定 ( 正常模式,睡眠模式
)。
若 DIEOE 置位, DIEOV 置位 / 清零时数字输入使能 / 禁止,
而不管 MCU 的状态如何 ( 正常模式,睡眠模式 )。
发相连,并且在同步器之前。除非数字输入用作时钟源,否则
第二功能模块将使用自己的同步器。
模拟输入 / 输出。信号直接与引脚接点相连,而且可以用作双
向端口。
下面的几小节将简单地说明每个端口的第二功能以及相关的信号。具体请参考有关第二
功能的说明。
56
ATmega8535(L)
2502E–AVR–12/03
Page 57
ATmega8535(L)
特殊功能 I/O 寄存器- SFIOR
Bit 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10 SFIOR
读/写 R/W R/W R/W R R/W R/W R/W R/W
初始值 000 00000
• Bit 2 – PUD: 禁用上拉电阻
置位时,即使将寄存器 DDxn 和 PORTxn 配置为使能上拉电阻 ({DDxn, PORTxn} =
0b01) , I/O 端口的上拉电阻也被禁止。请参见 P50“ 配置引脚 ” 。
端口 A 的第二功能 端口 A 作为 ADC 模拟输入的第二功能示于 Table 23 。如果端口 A 的部分引脚置为输出,
当转换时不能切换,否则会影响转换结果。
Table 23. 端口 A 的第二功能
端口引脚 第二功能
PA7 ADC7 (ADC 输入通道 7)
PA6 ADC6 (ADC 输入通道 6)
PA5 ADC5 (ADC 输入通道 5)
PA4 ADC4 (ADC 输入通道 4)
PA3 ADC3 (ADC 输入通道 3)
PA2 ADC2 (ADC 输入通道 2)
PA1 ADC1 (ADC 输入通道 1)
PA0 ADC0 (ADC 输入通道 0)
Table 24 和 Table 25 给出了端口 A 第二功能与 P55Figure 26 重载信号的对应关系。
Table 24. PA7..PA4 的第二功能重载信号
信号名称 PA7/ADC7 PA6/ADC6 PA5/ADC5 PA4/ADC4
P U O E 0000
P U O V 0000
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE 0 0 0 0
PVOV 0 0 0 0
D I E O E 0000
D I E O V 0000
D I––––
AIO ADC7 输入 ADC6 输入 ADC5 输入 ADC4 输入
2502E–AVR–12/03
57
Page 58
Table 25. PA3..PA0 的第二功能重载信号
信号名称 PA3/ADC3 PA2/ADC2 PA1/ADC1 PA0/ADC0
P U O E 0000
P U O V 0000
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE 0 0 0 0
PVOV 0 0 0 0
D I E O E 0000
D I E O V 0000
D I––––
AIO ADC3 输入 ADC2 输入 ADC1 输入 ADC0 输入
端口 B 的第二功能 端口 B 的第二功能列于 Table 26。
Table 26. 端口 B 的第二功能
端口引脚 第二功能
PB7 SCK (SPI 总线的串行时钟 )
PB6 MISO (SPI 总线的主机输入 / 从机输出信号 )
PB5 MOSI (SPI 总线的主机输出 / 从机输入信号 )
PB4 SS
PB3
PB2
PB1 T1 (T/C1 外部计数器输入 )
PB0
(SPI 从机选择引脚 )
AIN1 ( 模拟比较负输入 )
OC0 (T/C0 输出比较匹配输出 )
AIN0 ( 模拟比较正输入 )
INT2 ( 外部中断 2 输入 )
T0 (T/C0 外部计数器输入 )
XCK (USART 外部时钟输入 / 输出 )
引脚配置如下:
•SCK – 端口 B, Bit 7
SCK :SPI 通道的主机时钟输出,从机时钟输入端口。工作于从机模式时,不论 DDB7 设
置如何,这个引脚都将设置为输入。工作于主机模式时,这个引脚的数据方向由 DDB7 控
制。设置为输入后,上拉电阻由 PORTB7 控制。
•MISO – 端口 B, Bit 6
MISO :SPI 通道的主机数据输入,从机数据输出端口。工作于主机模式时,不论 DDB6 设
置如何,这个引脚都将设置为输入。工作于从机模式时,这个引脚的数据方向由 DDB6 控
制。设置为输入后,上拉电阻由 PORTB6 控制。
58
ATmega8535(L)
2502E–AVR–12/03
Page 59
ATmega8535(L)
•MOSI – 端口 B, Bit 5
MOSI : SPI 通道的主机数据输出,从机数据输入端口。工作于从机模式时,不论 DDB5 设
置如何,这个引脚都将设置为输入。当工作于主机模式时,这个引脚的数据方向由 DDB5
控制。设置为输入后,上拉电阻由 PORTB5 控制。
•SS
– 端口 B, Bit 4
SS
: 从机选择输入。工作于从机模式时,不论 DDB4 设置如何,这个引脚都将设置为输
入。当此引脚为低时 SPI 被激活。工作于主机模式时,这个引脚的数据方向由 DDB4 控
制。设置为输入后,上拉电阻由 PORTB4 控制。
• AIN1/OC0 – 端口 B, Bit 3
AIN1 ,模拟比较负输入。配置该引脚为输入时,切断内部上拉电阻,防止数字端口功能
与模拟比较器功能相冲突。
OC0,输出比较匹配输出: PB3 引脚可作为 T/C0 比较匹配的外部输出。实现该功能时,
PB3 引脚必须配置为输出 ( 设 DDB3为 1) 。在 PWM 模式的定时功能中, OC0 引脚作为输
出。
• AIN0/INT2 – 端口 B, Bit 2
AIN0 ,模拟比较正输入。配置该引脚为输入时,切断内部上拉电阻,防止数字端口功能
与模拟比较器功能相冲突。
INT2 ,外部中断源 2 : PB2 引脚作为 MCU 的外部中断源。
•T1 – 端口 B, Bit 1
T1 , T/C1 计数器源。
• T0/XCK – 端口 B, Bit 0
T0, T/C0 计数器源。
XCK,USART外部时钟。数据方向寄存器(DDB0) 控制时钟为输出 (DDB0 置位 ) 还是输入
(DDB0 清零 )。只有当 USART 工作在同步模式时, XCK 引脚激活。
Table 27 与 Table 28 给出了端口 B 第二功能与 P55Figure 26 重载信号的对应关系。 SPI
MSTR INPUT 和 SPI SLAVE OUTPUT 构成了MISO信号,而MOSI可以分解为SPI MSTR
OUTPUT 和 SPI SLAVE INPUT。
2502E–AVR–12/03
59
Page 60
Table 27. PB7..PB4 的第二功能重载信号
信号
名称 PB7/SCK PB6/MISO PB5/MOSI PB4/SS
PUOE SPE • MSTR SPE • MSTR SPE • MSTR SPE • MSTR
PUOV PORTB7 • PUD PORTB6 • PUD PORTB5 • PUD PORTB4 • PUD
DDOE SPE • MSTR SPE • MSTR SPE • MSTR SPE • MSTR
DDOV 0 0 0 0
PVOE SPE • MSTR SPE • MSTR
PVOV SCK 输出 SPI 从机输出 SPI 主机输出 0
DIEOE 0 0 0 0
DIEOV 0 0 0 0
DI SCK 输入 SPI 主机输入 SPI 从机输入 SPI SS
AIO – – – –
SPE • MSTR 0
Table 28. PB3..PB0 的第二功能重载信号
信号
名称 PB3/OC0/AIN1 PB2/INT2/AIN0 PB1/T1 PB0/T0/XCK
PUOE 0 0 0 0
PUOV 0 0 0 0
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE OC0 使能 0 0 UMSEL
PVOV OC0 0 0 XCK 输出
DIEOE 0 INT2 使能 00
DIEOV 0 1 0 0
DI – INT2 输入 T1 输入 XCK 输入 /T0 输
AIO AIN1 输入 AIN0 输入 ––
端口 C 的第二功能 端口 C 的第二功能示于 Table 29。
Table 29. 端口 C 的第二功能
端口引脚 第二功能
PC7 TOSC2 ( 定时振荡器引脚 2)
PC6 TOSC1 ( 定时振荡器引脚 1)
PC1 SDA ( 两线串行总线数据输入 / 输出线 )
PC0 SCL ( 两线串行总线时钟线 )
第二功能配置如下:
•TOSC2 – 端口 C, Bit 7
入
60
ATmega8535(L)
2502E–AVR–12/03
Page 61
ATmega8535(L)
TOSC2,定时振荡器引脚 2:当寄存器 ASSR 的 AS2 位置 1,使 能 T/C2 的异步时钟,引脚
PC7 与端口断开,成为振荡器放大器的反向输出。在这种模式下,晶体振荡器与该引脚相
联,该引脚不能作为 I/O 引脚。
•TOSC1 – 端口 C, Bit 6
TOSC1,定时振荡器引脚 1:当寄存器 ASSR 的 AS2 位置 1,使 能 T/C2 的异步时钟,引脚
PC6 与端口断开,成为振荡器放大器的反向输出。在这种模式下,晶体振荡器与该引脚相
联,该引脚不能作为 I/O 引脚。
•SDA – 端口 C, Bit 1
SDA ,两线串行接口数据:当寄存器TWCR 的 TWEN 位置 1 使能两线串行接口 ,引 脚 PC1
不与端口相联,且成为两线串行接口的串行数据 I/O 引脚。在该模式下,在引脚处使用窄
带滤波器抑制低于 50 ns 的输入信号,且该引脚由斜率限制的开漏驱动器驱动。当该引脚
使用两线串行接口,仍可由 PORTC1 位控制上拉。
•SCL – 端口 C, Bit 0
SCL ,两线串行接口时钟:当 TWCR 寄存器的 TWEN 位置 1 使能两线串行接口,引脚 PC0
未与端口连接,成为两线串行接口的串行时钟 I/O 引脚。在该模式下,在引脚处使用窄带
滤波器抑制低于 50 ns 的输入信号,且该引脚由斜率限制的开漏驱动器驱动。当该引脚使
用两线串行接口,仍可由 PORTC0 位控制上拉。
Table 30 和 Table 31 给出了端口 C 第二功能与 P55Figure 26 重载信号的对应关系。
Table 30. PC7..PC6 的第二功能重载信号
信号名称 PC7/TOSC2 PC6/TOSC1
PUOE AS2 AS2
PUOV 0 0
DDOE AS2 AS2
DDOV 0 0
PVOE 0 0
PVOV 0 0
DIEOE AS2 AS2
DIEOV 0 0
DI – –
AIO T/C2 OSC 输出 T/C2 OSC 输入
2502E–AVR–12/03
61
Page 62
Table 31. PC1..PC0 的第二功能重载信号
信号名称 PC1/SDA PC0/SCL
PUOE TWEN TWEN
PUOV PORTC1 • PUD PORTC0 • PUD
DDOE TWEN TWEN
DDOV SDA_OUT SCL_OUT
PVOE TWEN TWEN
PVOV 0 0
DIEOE 0 0
DIEOV 0 0
DI – –
AIO SDA 输入 SCL 输入
Note: 1. 使能后,两线串行接口使能输出引脚 PC0 与 PC1 的斜率控制。这在图中并未示出。另
外,窄带滤波器连在图中给出的 AIO 输出端口与 TWI 的数字逻辑模块之间。
端口 D 的第二功能 端口 D 的第二功能列于 Table 32 。
Table 32. 端口 D 的第二功能
端口引脚 第二功能
PD7 OC2 (T/C2 输出比较匹配输出 )
PD6 ICP1 (T/C1 输入捕捉引脚 )
(1)
PD5 OC1A (T/C1 输出比较 A 匹配输出 )
PD4 OC1B (T/C1 输出比较 B 匹配输出 )
PD3 INT1 ( 外部中断 1 的输入 )
PD2 INT0 ( 外部中断 0 的输入 )
PD1 TXD (USART 输出引脚 )
PD0 RXD (USART 输入引脚 )
第二功能配置如下:
•OC2 – 端口 D, Bit 7
OC2 ,T/C2 输出比较匹配输出:PD7 引脚作为 T/C2 输出比较外部输入。在该功能下引脚
作为输出 (DDD7 置 1) 。在 PWM 模式的定时器功能中, OC2 引脚作为输出。
• ICP1 – 端口 D, Bit 6
ICP1 – 输入捕捉引脚:PD6 作为 T/C1 的输入捕捉引脚。
• OC1A – 端口 D, Bit 5
OC1A , 输出比较匹配 A 输出 :PD5 引脚作为T/C1 输出比较A 外部输入。在该功能下引脚
作为输出 (DDD5 置 1) 。在 PWM 模式的定时器功能中, OC1A 引脚作为输出。
• OC1B – 端口 D, Bit 4
OC1B ,输出比较匹配 B 输出 :PD4 引脚作为T/C1 输出比较 B 外部输入。在该功能下引脚
作为输出 (DDD4 置 1) 。在 PWM 模式的定时器功能中, OC1B 引脚作为输出。
• INT1 – 端口 D, Bit 3
62
ATmega8535(L)
2502E–AVR–12/03
Page 63
ATmega8535(L)
INT1,外部中断 1。 PD3 引脚作为 MCU 的外部中断源。
• INT0 – 端口 D, Bit 2
INT0,外部中断 0。 PD2 引脚作为 MCU 的外部中断源。
•TXD – 端口 D, Bit 1
TXD 是USART 的数据发送引脚。当使能了USART 的发送器后,这个引脚被强制设置为输
出,此时 DDD1 不起作用。
•RXD – 端口 D, Bit 0
RXD 是USART 的数据接收引脚。当使能了USART 的接收器后,这个引脚被强制设置为输
出,此时 DDD0 不起作用。但是 PORTD0 仍然控制上拉电阻。
Table 33 和 Table 34 将端口 D 的第二功能与 P55Figure 26 的重载信号关联在了一起。
Table 33. PD7..PD4 的第二功能
信号名称 PD7/OC2 PD6/ICP1 PD5/OC1A PD4/OC1B
PUOE 0 0 0 0
PUOV 0 0 0 0
DDOE 0 0 0 0
DDOV 0 0 0 0
PVOE OC2 使能 0O C 1 A 使能 OC1B 使能
PVOV OC2 0 OC1A OC1B
DIEOE 0 0 0 0
DIEOV 0 0 0 0
DI – ICP1 输入 ––
AIO – – – –
2502E–AVR–12/03
63
Page 64
I/O 端口寄存器的说明
Table 34. PD3..PD0 的第二功能
信号名称 PD3/INT1 PD2/INT0 PD1/TXD PD0/RXD
PUOE 0 0 TXEN RXEN
PUOV 0 0 0 PORTD0 • PUD
DDOE 0 0 TXEN RXEN
DDOV 0 0 1 0
PVOE 0 0 TXEN 0
PVOV 0 0 TXD 0
DIEOE INT1 使能 INT0 使能 00
D I E O V 110 0
DI INT1 输入 INT0 输入 –R X D
A I O ––– –
端口 A 数据寄存器- PORTA
端口 A 数据方向寄存器- DDRA
端口 A 输入引脚地址- PINA
端口 B 数据寄存器- PORTB
端口 B 数据方向寄存器- DDRB
B i t 76543210
PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0 PORTA
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
DDA7 DDA6 DDA5 DDA4 DDA3 DDA2 DDA1 DDA0 DDRA
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
PINA7 PINA6 PINA5 PINA4 PINA3 PINA2 PINA1 PINA0 PINA
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
Bit
读/写
初始值
B i t 76543210
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
76543210
PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB
R/W R/W R/W R/W R/W R/W R/W R/W
00000000
DDB7 DDB6 DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 DDRB
64
ATmega8535(L)
2502E–AVR–12/03
Page 65
ATmega8535(L)
端口 B 输入引脚地址- PINB
端口 C 数据寄存器- PORTC
端口 C 数据方向寄存器- DDRC
端口 C 输入引脚地址- PINC
端口 D 数据寄存器- PORTD
B i t 76543210
PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0 PINB
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
B i t 76543210
PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 PORTC
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
DDC7 DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0 DDRC
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
PINC7 PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0 PINC
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
B i t 76543210
PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 PORTD
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
端口 D 数据方向寄存器- DDRD
端口 D 输入引脚地址- PIND
B i t 76543210
DDD7 DDD6 DDD5 DDD4 DDD3 DDD2 DDD1 DDD0 DDRD
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
B i t 76543210
PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0 PIND
读/写 RRRRRRRR
初始值 N/A N/A N/A N/A N/A N/A N/A N/A
2502E–AVR–12/03
65
Page 66
外部中断 外部中断通过引脚 INT0 、 INT1 与 INT2 触发。只要使能了中断,即使引脚 INT0..2 配置
为输出,只要电平发生了合适的变化,中断也会触发。这个特点可以用来产生软件中断。
通过设置 MCU 控制寄存器 MCUCR 与 MCU 控制与状态寄存器 MCUCSR,中断可以由
下降沿、上升沿,或者是低电平触发 (INT2 为边沿触发中断 )。当外部中断使能并且配置
为电平触发 ( INT0/INT1),只要引脚电平为低,中断就会产生。若要求 INT0 与 INT1 在信
号下降沿或上升沿触发, I/O 时钟必须工作,如 P22“ 时钟系统及其分布 ” 说明的那样。
INT0/INT1 的中断条件检测INT2 则是异步的。也就是说,这些中断可以用来将器件从睡眠
模式唤醒。在睡眠过程 ( 除了空闲模式 ) 中 I/O 时钟是停止的。
通过电平方式触发中断,从而将 MCU 从掉电模式唤醒时,要保证电平保持一定的时间,
以降低 MCU 对噪声的敏感程度。电平以看门狗的频率检测两次。在 5.0V 、 25 °C 的条件
下,看门狗的标称时钟周期为 1 µs 。看门狗时钟受电压的影响,具体请参考 P242“ 电气
特性 ” 。只要在采样过程中出现了合适的电平,或是信号持续到启动过程的末尾, MCU
就会唤醒。启动过程由熔丝位 SUT 决定,如 P22“ 系统时钟及时钟选项 ” 所示。若信号出
现于两次采样过程,但在启动过程结束之前就消失了, MCU 仍将唤醒,但不再会引发中
断了。要求的电平必须保持足够长的时间以使 MCU 结束唤醒过程,然后触发电平中断。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能
B i t 76543210
SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00 MCUCR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 3, 2 – ISC11, ISC10: 中断触发方式控制 1 Bit1 与 Bit 0
如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话,外部中断 1 由引脚 INT1 激
发。触发方式如 Table 35 所示。在检测边沿前 MCU 首先采样 INT1 引脚上的电平。如果
选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触
发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保
持到当前指令执行完成。
Table 35. 中断 1 触发方式控制
ISC11 ISC10 说明
00 I N T 1 为低电平时产生中断请求
01 I N T 1引脚上任意的逻辑电平变化都将引发中断
10 I N T 1的下降沿产生异步中断请求
11 I N T 1 的上升沿产生异步中断请求
• Bit 1, 0 – ISC01, ISC00: 中断 0 触发方式控制 Bit 1 与 Bit 0
如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。触发方式如 Table 36 所示,
外部中断 0 由引脚 INT0 激发。在检测边沿前 MCU 首先采样 INT0 引脚上的电平。如果选
择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发
中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持
到当前指令执行完成。
Table 36. 中断 0 触发方式控制
ISC01 ISC00 说明
00 I N T 0 为低电平时产生中断请求
66
ATmega8535(L)
2502E–AVR–12/03
Page 67
Table 36. 中断 0 触发方式控制
ISC01 ISC00 说明
01 I N T 0引脚上任意的逻辑电平变化都将引发中断
10 I N T 0的下降沿产生异步中断请求
11 I N T 0 的上升沿产生异步中断请求
ATmega8535(L)
MCU 控制与状态寄存器-
MCUCSR
通用中断控制寄存器- GICR
B i t 76543210
–I S C 2– – WDRF BORF EXTRF PORF MCUCSR
读/写 R/W R/W R R/W R/W R/W R/W R/W
初始值 000 见位说明
• Bit 6 – ISC2: 中断 2 触发方式控制
如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的中断屏蔽位置位的话,异步外中断 2 由
外部引脚 INT2 激活。若 ISC2 写 0 , INT2 的下降沿激活中断。 若 ISC2 写 1, INT2 的上
升沿激活中断。 INT2 的边沿触发方式是异步的。只要INT2 引脚上产生宽度大于 Table 37
所示数据的脉冲就会引发中断。若选择了低电平中断,低电平必须保持到当前指令完成,
然后才会产生中断。而且只要将引脚拉低,就会引发中断请求。改变 ISC2 时有可能发生
中断。因此建议首先在寄存器 GICR 里清除相应的中断使能位 INT2 ,然后再改变 ISC2 。
最后,不要忘记在重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1’
使其清零。
Table 37. 异步 ( 外部 ) 中断特性
最小值典型值最大
符号 参数 条件
t
INT
B i t 76543210
读/写 R/W R/W R/W R R R R/W R/W
初始值 00000000
异步 ( 外部 ) 中断的最小脉冲宽度 TBD 50 TBD ns
INT1 INT0 INT2
– – – IVSEL IVCE GICR
值单 位
2502E–AVR–12/03
• Bit 7 – INT1: 外部中断请求 1 使能
当 INT1 为 '1’ ,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。
MCU 通用控制状态寄存器– MCUCSR 的中断敏感电平控制1 位 1/0 (ISC11 与ISC10) 决定
中断是由上升沿、下降沿,还是 INT1 电平触发的。只要使能,即使 INT1 引脚被配置为
输出,只要引脚电平发生了相应的变化,中断将产生。
• Bit 6 – INT0: 外部中断请求 0 使能
当 INT0 为 '1’ ,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。
MCU 通用控制状态寄存器– MCUCSR 的中断敏感电平控制0 位 1/0 (ISC01 与ISC00) 决定
中断是由上升沿、下降沿,还是 INT0 电平触发的。只要使能,即使 INT0 引脚被配置为
输出,只要引脚电平发生了相应的变化,中断将产生。
• Bit 5 – INT2: 外部中断请求 2 使能
当 INT2 为 '1’ ,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。
MCU 通用控制状态寄存器– MCUCSR 的中断敏感电平控制2 位 1/0 (ISC2 与ISC2) 决定中
断是由上升沿、下降沿,还是 INT2 电平触发的。只要使能,即使 INT2 引脚被配置为输
出,只要引脚电平发生了相应的变化,中断将产生。
67
Page 68
通用中断标志寄存器- GIFR
B i t 76543210
INTF1 INTF0 INTF2
读/写 R/W R/W R/W R R R R R
初始值 00000000
– – – – –G I F R
• Bit 7 – INTF1: 外部中断标志 1
INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如 果 SREG 的位
I以及 GICR寄存器相应的中断使能位 INT1 为 ”1”,MCU即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。
• Bit 6 – INTF0: 外部中断标志 0
INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如 果 SREG 的位
I以及 GICR寄存器相应的中断使能位 INT0 为 ”1”,MCU即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。当 INT0 配
置为电平中断时,该标志会被清零。
• Bit 5 – INTF2: 外部中断标志 2
INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。如 果 SREG 的位
I以及 GICR寄存器相应的中断使能位 INT2 为 ”1”,MCU即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。注意,当
INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。这会导致 INTF2标志设置
信号的逻辑变化,详见 P53“ 数字输入使能和睡眠模式 ” 。
68
ATmega8535(L)
2502E–AVR–12/03
Page 69
ATmega8535(L)
具有 PWM 功能的 8 位
定时器 / 计时器 0
T/C0 是一个通用的单通道 8 位定时器 / 计数器模块。其主要特点如下:
单通道计数器
•
• 比较匹配发生时清除定时器 ( 自动加载 )
• 无干扰脉冲,相位正确的 PWM
• 频率发生器
• 外部事件计数器
• 10 位的时钟预分频器
• 溢出和比较匹配中断源 (TOV0 和 OCF0)
综述 Figure 27为8 位定时器 /计数器的简化框图。实际引脚排列请参考 P2“ATmega8535的引脚
” 。CPU 可以访问的 I/O 寄存器,包括位和引脚,以粗体显示。I/O 寄存器和位的位置列于
P79“8 位定时器 / 计数器寄存器的说明 ” 。
Figure 27. 8 位 T/C 方框图
TCCRn
count
clear
direction
BOTTOM
Control Logic
TOP
clk
Tn
Clock Select
Edge
Detector
TOVn
(Int.Req.)
Tn
Timer/Counter
TCNTn
= 0
=
0xFF
DATA BUS
=
OCRn
Waveform
Generation
( From Prescaler )
OCn
(Int.Req.)
OCn
寄存器 T/C(TCNT0) 和输出比较寄存器(OCR0) 为8 位寄存器。中断请求(图中简写为Int.Req. ) 信
号在定时器中断标志寄存器 TIFR 都有反映。 所有中断都可以通过定时器中断屏蔽寄存器
TIMSK 单独进行屏蔽。由于 TIFR 和 TIMSK 寄存器是与其他定时器单元共享,因此图中没
有给出。
T/C 可以通过预分频器由内部时钟源驱动,或者是通过T0 引脚的外部时钟源来驱动。时钟
选择逻辑模块控制使用哪一个时钟源与什么边沿来增加 ( 或降低 )T/C 的数值。如果没有
选择时钟源 T/C 就不工作。时钟选择模块的输出定义为定时器时钟 clk
T 0
。
双缓冲的输出比较寄存器 OCR0 一直与 T/C 的数值进行比较。比较的结果可用来产生
PWM 波,或在输出比较引脚OC0 上产生变化频率的输出,如 P71“ 输出比较单元 ” 说明的
那样。比较匹配事件还将置位比较标志 OCF0。此标志可以用来产生输出比较中断请求。
2502E–AVR–12/03
69
Page 70
定义 本文的许多寄存器及其各个位以通用的格式表示。小写的 “n” 取代了 T/C 的序号,在此即
为 0 。小写的 “x” 取代了输出比较单元通道,在此即为通道 A 。但是在写程序时要使用精
确的格式,例如使用 TCNT0 来访问 T/C0 计数器值,等等。
Table 38 的定义适用于全文。
Table 38. 定义
BOTTOM 计数器计到 0x00 时即达到 BOTTOM。
MAX 计数器计到 0xFF ( 十进制的 255) 时即达到 MAX。
TOP 计数器计到计数序列的最大值时即达到 TOP。TOP 值可以为固定值 0xFF
(MAX),或是存储于寄存器 OCR0A 里的数值,具体由工作模式确定
T/C 的时钟源 T/C 可以由内部同步时钟或外部异步时钟驱动。时钟源是由时钟选择逻辑决定的,而时钟
选择逻辑是由位于 T/C 控制寄存器 TCCR0 的时钟选择位 CS02:0 控制的。 P83“T/C0 与
T/C1 的预分频器 ” 对时钟源与预分频有详尽的描述。
计数器单元 8位 T/C的主要部分为可编程的双向计数单元。 Figure 28 即为计数器和周边电路的框图。
Figure 28. 计数器单元方框图
TOVn
DATA BUS
count
TCNTn Control Logic
clear
direction
(Int.Req.)
clk
Tn
Clock Select
Edge
Detector
Tn
( From Prescaler )
bottom
top
信号说明 ( 内部信号 ):
count 使 TCNT0 加 1 或减 1 。
direction 选择加操作或减操作。
clear 清除 TCNT0 ( 将所有的位清零 )。
clk
Tn
T/C 的时钟, clk T0 。
top 表示 TCNT0 已经达到了最大值。
bottom 表示 TCNT0 已经达到了最小值 (0) 。
根据不同的工作模式,计数器针对每一个 clk
实现清零、加一或减一操作。clk T0 可以由
T0
内部时钟源或外部时钟源产生,具体由时钟选择位 CS02:0 确定。没有选择时钟源时
(CS02:0 = 0) 定时器即停止。但是不管有没有 clk
, CPU 都可以访问 TCNT0 。CPU 写操
T0
作比计数器其他操作 ( 如清零、加减操作 ) 的优先级高。
计数序列由 T/C 控制寄存器 (TCCR0) 的 WGM01 和 WGM00 决定。计数器计数行为与输
出比较 OC0 的波形有紧密的关系。有关计数序列和波形产生的详细信息请参考 P73“ 工作
模式 ” 。
T/C 溢出中断标志TOV0 根据WGM01:0 设定的工作模式来设置。TOV0可以用于产生CPU
中断。
70
ATmega8535(L)
2502E–AVR–12/03
Page 71
ATmega8535(L)
输出比较单元 8位比较器持续对TCNT0 和输出比较寄存器OCR0 进行比较。一旦TCNT0 等于OCR0 ,比
较器就给出匹配信号。在匹配发生的下一个定时器时钟周期输出比较标志 OCF0 置位。若
此时 OCIE0 = 1 且 SREG 的全局中断标志 I 置位,CPU 将产生输出比较中断。执行中断
服务程序时 OCF0 自动清零,或者通过软件写 ”1” 的方式来清零。根据由 WGM01:0 和
COM01:0 设定的不同的工作模式,波形发生器利用匹配信号产生不同的波形。同时,波
形发生器还利用 max 和 bottom 信号来处理极值条件下的特殊情况 (P73“ 工作模式 ” )。
Figure 29 为输出比较单元的方框图。
Figure 29. 输出比较单元方框图
DATA BUS
OCRn
TCNTn
= (8-bit Comparator )
OCFn (Int.Req.)
top
bottom
FOCn
使用 PWM 模式时 OCR0 寄存器为双缓冲寄存器;而在正常工作模式和匹配时清零模式
双缓冲功能是禁止的。双缓冲可以将更新 OCR0 寄存器与 top 或 bottom 时刻同步起来,
从而防止产生不对称的 PWM 脉冲,消除了干扰脉冲。
访问 OCR0 寄存器看起来很复杂,其实不然。使能双缓冲功能时,CPU 访问的是 OCR0
缓冲寄存器;禁止双缓冲功能时 CPU 访问的则是 OCR0 本身。
强制输出比较 工作于非 PWM 模式时,可以通过对强制输出比较位 FOC0 写 ”1” 的方式来产生比较匹
配。强制比较匹配不会置位 OCF0 标志,也不会重载 / 清零定时器,但是 OC0 引脚将被
更新,好象真的发生了比较匹配一样 (COM01:0 决定 OC0A 是置位、清零,还是 "0“-”1”
交替变化 )。
Waveform Generator
WGMn1:0
COMn1:0
OCn
写 TCNT0 操作将阻止比较匹配 CPU 对 TCNT0 寄存器的写操作会在下一个定时器时钟周期阻止比较匹配的发生,即使此
时定时器已经停止了。这个特性可以用来将 OCR0 初始化为与 TCNT0 相同的数值而不触
发中断。
使用输出比较单元 由于在任意模式下写 TCNT0 都将在下一个定时器时钟周期里阻止比较匹配,在使用输出
比较时改变 TCNT0 就会有风险,不论 T/C 此时是否在运行与否。如果写入的 TCNT0 的
数值等于 OCR0 ,比较匹配就被丢失了,造成不正确的波形发生结果。类似地,在计数器
进行降序计数时不要对 TCNT0 写入等于 BOTTOM 的数据。
71
2502E–AVR–12/03
Page 72
OC0 的设置应该在设置数据方向寄存器之前完成。最简单的设置 OC0 的方法是在普通模
式下利用强制输出比较 FOC0 。即使在改变波形发生模式时 OC0 寄存器也会一直保持它
的数值。
注意 COM01:0 和比较数据都不是双缓冲的。 COM01:0 的改变将立即生效。
72
ATmega8535(L)
2502E–AVR–12/03
Page 73
ATmega8535(L)
比较匹配输出单元 比较匹配模式控制位 COM01:0 具有双重功能。波形发生器利用 COM01:0 来确定下一次
比较匹配发生时的输出比较状态 (OC0) ; COM01:0 还控制 OC0 引脚输出信号的来源。
Figure 30 为受 COM01:0 设置影响的简化逻辑框图。 I/O寄存器、I/O位和I/O 引脚以粗体表
示。图中只给出了受 COM01:0 影响的通用 I/O 端口控制寄存器 (DDR 和 PORT) 。谈及
OC0 状态时指的是内部 OC0 寄存器,而不是 OC0 引脚。系统复位时 OC0 寄存器清零。
Figure 30. 比较匹配输出单元原理图
COMn1
COMn0
FOCn
Waveform
Generator
DQ
OCn
DQ
PORT
1
0
OCn
Pin
DATA BUS
DQ
DDR
clk
I/O
如果 COM01:0 不全为零,通用 I/O 口功能将被波形发生器的输出比较功能取代。但 OC0
引脚为输入还是输出仍然由数据方向寄存器 DDR 控制。在使用 OC0 功能之前首先要通
过数据方向寄存器的 DDR_OC0 位将此引脚设置为输出。端口功能与波形发生器的工作
模式无关。
输出比较逻辑的设计允许 OC0 状态在输出之前首先进行初始化。要注意某些 COM01:0
设置保留给了其他操作类型,详见 P79“8 位定时器 / 计数器寄存器的说明 ” 。
比较输出模式和波形产生 波形发生器利用 COM01:0 的方法在普通模式、 CTC 模式和 PWM 模式下有所区别。对
于所有的模式,设置 COM01:0 = 0 表明比较匹配发生时波形发生器不会操作 OC0 寄存
器。非 PWM 模式的比较输出请参见 P79Table 40 ;快速 PWM 的比较输出示于P80Table
41 ;相位修正 PWM 的比较输出在 P80Table 42 有描述。
改变 COM01:0 将影响写入数据后的第一次比较匹配。对于非 PWM 模式,可以通过使用
FOC0 来立即产生效果。
工作模式 工作模式 - T/C 和输出比较引脚的行为 - 由波形发生模式 (WGM01:0) 及比较输出模式
(COM01:0) 的控制位决定。比较输出模式对计数序列没有影响,而波形产生模式对计数序
列则有影响。 COM01:0 控制 PWM 输出是否为反极性。非 PWM 模式时 COM01:0 控制
输出是否应该在比较匹配发生时置位、清零,或是电平取反 (P73“ 比较匹配输出单元 ” )。
2502E–AVR–12/03
具体的时序信息请参考 P77“T/C 时序图 ” 之 Figure 34 、Figure 35、Figure 36、与 Figure
37。
73
Page 74
普通模式 普通模式 (WGM01:0 = 0) 为最简单的工作模式。在此模式下计数器不停地累加。计到 8
比特的最大值后 (TOP = 0xFF) ,由于数值溢出计数器简单地返回到最小值 0x00 重新开
始。在 TCNT0 为零的同一个定时器时钟里 T/C 溢出标志 TOV0 置位。此时 TOV0 有点象
第 9 位,只是只能置位,不会清零。但由于定时器中断服务程序能够自动清零 TOV0 ,因
此可以通过软件提高定时器的分辨率。在普通模式下没有什么需要特殊考虑的,用户可以
随时写入新的计数器数值。
输出比较单元可以用来产生中断。但是不推荐在普通模式下利用输出比较来产生波形,因
为这会占用太多的 CPU 时间。
CTC( 比较匹配时清零定时器 )
模式
在 CTC 模式 (WGM01:0 = 2) 下 OCR0 寄存器用于调节计数器的分辨率。当计数器的数值
TCNT0 等于 OCR0 时计数器清零。OCR0定义了计数器的TOP 值,亦即计数器的分辨率。
这个模式使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操
作。
CTC 模式的时序图为 Figure 31 。计数器数值TCNT0 一直累加到 TCNT0 与 OCR0 匹配,然
后 TCNT0 清零。
Figure 31. CTC 模式的时序图
OCn Interrupt Flag Set
TCNTn
OCn
(Toggle)
Period
1 4
2 3
(COMn1:0 = 1)
利用 OCF0 标志可以在计数器数值达到 TOP 时产生中断。在中断服务程序里可以更新
TOP的数值。由于CTC模式没有双缓冲功能,在计数器以无预分频器或很低的预分频器工
作的时候将 TOP 更改为接近 BOTTOM 的数值时要小心。如果写入的 OCR0 数值小于当
前 TCNT0 的数值,计数器将丢失一次比较匹配。在下一次比较匹配发生之前,计数器不
得不先计数到最大值 0xFF ,然后再从 0x00 开始计数到 OCF0 。
为了在 CTC 模式下得到波形输出,可以设置 OC0 在每次比较匹配发生时改变逻辑电平。
这可以通过设置 COM01:0 = 1 来完成。在期望获得 OC0 输出之前,首先要将其端口设置
为输出。波形发生器能够产生的最大频率为 f
OC0
= f
/2 (OCR0 = 0x00)。频率由如下
clk_I/O
公式确定:
f
f
OCn
clk_I/O
------------------------------------------------- =
2 N 1 OCRn + () ⋅⋅
变量 N 代表预分频因子 (1 、 8 、 64 、 256 或 1024) 。
在普通模式下, TOV0 标志的置位发生在计数器从 MAX 变为 0x00 的定时器时钟周期。
快速 PWM 模式 快速 PWM 模式 (WGM01:0 = 3) 可用来产生高频的 PWM 波形。快速 PWM 模式与其他
PWM模式的不同之处是其单斜坡工作方式。计数器从BOTTOM 计到 MAX,然后立即回到
BOTTOM重新开始。对于普通的比较输出模式,输出比较引脚OC0 在 TCNT0与 OCR0 匹
配时清零,在 BOTTOM 时置位;对于反向比较输出模式, OC0 的动作正好相反。由于
使用了单斜坡模式,快速 PWM 模式的工作频率比使用双斜坡的相位修正 PWM 模式高一
74
ATmega8535(L)
2502E–AVR–12/03
Page 75
ATmega8535(L)
倍。此高频操作特性使得快速 PWM 模式十分适合于功率调节,整流和 DAC 应用。高频
可以减小外部元器件 ( 电感,电容 ) 的物理尺寸,从而降低系统成本。
工作于快速 PWM 模式时,计数器的数值一直增加到 MAX ,然后在后面的一个时钟周期
清零。具体的时序图为 Figure 32 。图中柱状的 TCNT0 表示这是单边斜坡操作。方框图同
时包含了普通的 PWM 输出以及反向 PWM 输出。 TCNT0 斜坡上的短水平线表示 OCR0
和 TCNT0 的比较匹配。
Figure 32. 快速 PWM 模式时序图
OCRn Interrupt Flag Set
OCRn Update and
TOVn Interrupt Flag Set
TCNTn
OCn
OCn
Period
1
2 3
4 5 6 7
(COMn1:0 = 2)
(COMn1:0 = 3)
计时器数值达到 MAX 时 T/C 溢出标志 TOV0 置位。如果中断使能,在中断服务程序可以
更新比较值。
工作于快速 PWM 模式时,比较单元可以在 OC0 引脚上输出 PWM 波形。设置 COM01:0
为 2 可以产生普通的 PWM 信号;为 3 则可以产生反向 PWM 波形 ( 参见 P80Table 41 )。
要想在引脚上得到输出信号还必须将 OC0 的数据方向设置为输出。产生 PWM 波形的机
理是 OC0 寄存器在 OCR0 与 TCNT0 匹配时置位 ( 或清零 ),以及在计数器清零 ( 从 MAX
变为 BOTTOM) 的那一个定时器时钟周期清零 ( 或置位 )。
输出的 PWM 频率可以通过如下公式计算得到:
f
f
OCnPWM
clk_I/O
------------------ =
N 256⋅
变量 N 代表分频因子 (1、 8、 64、 256 或 1024)。
OCR0 寄存器为极限值时表示快速 PWM 模式的一些特殊情况。若OCR0 等于 BOTTOM,
输出为出现在第 MAX+1 个定时器时钟周期的窄脉冲; OCR0 为 MAX 时,根据 COM01:0
的设定,输出恒为高电平或低电平。
2502E–AVR–12/03
通过设定 OC0 在比较匹配时进行逻辑电平取反 (COM01:0 = 1) ,可以得到占空比为 50%
的周期信号。OCR0 为 0 时信号有最高频率 f
oc2
= f
/2。这个特性类似于 CTC 模式下
clk_I/O
的 OC0 取反操作,不同之处在于快速 PWM 模式具有双缓冲。
75
Page 76
相位修正 PWM 模式 相位修正 PWM 模式 (WGM01:0 = 1) 为用户提供了一个获得高精度相位修正 PWM 波形
的方法。此模式基于双斜坡操作。计时器重复地从 BOTTOM 计到 MAX ,然后又从 MAX
倒退回到BOTTOM 。在一般的比较输出模式下,当计时器往 MAX 计数时若发生了 TCNT0
与OCR0 的匹配,OC0 将清零为低电平;而在计时器往BOTTOM 计数时若发生了TCNT0
与 OCR0 的匹配,OC0 将置位为高电平。工作于反向输出比较时则正好相反。与单斜坡
操作相比,双斜坡操作可获得的最大频率要小。但由于其对称的特性,十分适合于电机控
制。
相位修正 PWM 模式的 PWM 精度固定为 8 比特。计时器不断地累加直到 MAX ,然后开
始减计数。在一个定时器时钟周期里 TCNT0 的值等于 MAX 。时序图可参见 Figure 33 。
图中 TCNT0 的数值用柱状图表示,以说明双斜坡操作。本图同时说明了普通 PWM 的输
出和反向 PWM 的输出。 TCNT0 斜坡上的小横条表示 OCR0 与 TCNT0 的比较匹配。
Figure 33. 相位修正 PWM 模式的时序图
OCn Interrupt Flag Set
OCRn Update
TOVn Interrupt Flag Set
TCNTn
OCn
OCn
Period
1 2 3
(COMn1:0 = 2)
(COMn1:0 = 3)
当计时器达到 BOTTOM 时 T/C 溢出标志位 TOV0 置位。此标志位可用来产生中断。
工作于相位修正 PWM 模式时,比较单元可以在 OC0 引脚产生 PWM 波形:将 COM01:0
设置为 2 产生普通相位的 PWM ,设 置 COM01:0 为3 产生反向PWM 信号 ( 参见 P80Table
42 ) 。要想在引脚上得到输出信号还必须将OC0 的数据方向设置为输出。 OCR0和 TCNT0
比较匹配发生时 OC0 寄存器将产生相应的清零或置位操作,从而产生 PWM 波形。工作
于相位修正模式时 PWM 频率可由下式公式获得:
f
clk_I/O
f
OCnPCPWM
------------------ =
N 510⋅
变量 N 表示预分频因子 (1、 8、 64、 256 或 1024)。
OCR0寄存器处于极值代表了相位修正 PWM 模式的一些特殊情况。在普通 PWM模式下,
若 OCR0 等于 BOTTOM ,输出一直保持为低电平;若 OCR0 等于 MAX ,则输出保持为
高电平。反向 PWM 模式则正好相反。
76
在 Figure 33 的第 2 个周期,虽然没有发生比较匹配, OCn 也出现了一个从高到低的跳
变。其目的是保证波形在 BOTTOM 两侧的对称。没有比较匹配时有两种情况会出现跳变:
ATmega8535(L)
2502E–AVR–12/03
Page 77
ATmega8535(L)
• 如 Figure 33 所示,OCR0A 的值从 MAX 改变为其他数据。当 OCR0A 值为 MAX 时,引
脚 OCn 的输出应该与前面降序记数比较匹配的结果相同。为保证波形在 BOTTOM
两侧的对称,当 T/C 的数值为 MAX 时,引脚 OCn 的输出又必须符合后面升序记数
比较匹配的结果。
• 定时器从一个比 OCR0A 高的值开始记数,并因而丢失了一次比较匹配。系统因此引
入发生 OCn 却仍然有跳变的现象。
T/C 时序图 T/C 是同步电路,因此其时钟 clk
中断标志设置的时间。 Figure 34 给出了基本的 T/C 工作时序,以及除了相位修正 PWM
模式之外其他模式接近 MAX 时的记数序列。
Figure 34. T/C 时序图,无预分频器
clk
I/O
clk
Tn
(clk
/1)
I/O
TCNTn MAX - 1 MAX BOTTOM BOTTOM + 1
TOVn
Figure 35 所示为相同的工作时序,但有预分频。
Figure 35. T/C 时序图,预分频器为 f
clk
I/O
可以表示为时钟使能信号,如下图所示。图中还说明了
T0
/8
clk_I/O
2502E–AVR–12/03
clk
Tn
(clk
/8)
I/O
TCNTn
MAX - 1 MAX BOTTOM BOTTOM + 1
TOVn
Figure 36 给出了各种模式下 ( 除了 CTC 模式 )OCF0 的置位情况。
77
Page 78
Figure 36. T/C 时序图, OCF0 置位,预分频器为 f
clk
I/O
clk
Tn
(clk
/8)
I/O
clk_I/O
/8
TCNTn
OCRn
OCRn - 1 OCRn OCRn + 1 OCRn + 2
OCRn Value
OCFn
Figure 37 给出了 CTC 模式下 OCF0 置位和 TCNT0 清除的情况。
Figure 37. T/C 时序图, CTC 模式,预分频器为 f
clk
I/O
clk
Tn
(clk
/8)
I/O
TCNTn
(CTC)
OCRn
TOP - 1 TOP BOTTOM BOTTOM + 1
TOP
clk_I/O
/8
78
OCFn
ATmega8535(L)
2502E–AVR–12/03
Page 79
8 位定时器 / 计数器寄存器
的说明
ATmega8535(L)
T/C 控制寄存器- TCCR0
B i t 76543210
FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 TCCR0
读/写 W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 7 – FOC0: 强制输出比较
FOC0 仅在 WGM00 指明非PWM 模式时才有效。但是,为了保证与未来器件的兼容性,在
使用 PWM 时,写 TCCR0 要对其清零。对其写 1 后,波形发生器将立即进行比较操作。
比较匹配输出引脚 OC0 将按照 COM01:0 的设置输出相应的电平。要注意 FOC0 类似一
个锁存信号,真正对强制输出比较起作用的是 COM01:0 的设置。
FOC0 不会引发任何中断,也不会在利用OCR0 作为 TOP 的 CTC 模式下对定时器进行清零
的操作。
读 FOC0 的返回值永远为 0 。
• Bit 6, 3 – WGM01:0: 波形产生模式
这几位控制计数器的计数序列,计数器的最大值 TOP ,以及产生何种波形。 T/C 支持的
模式有:普通模式,比较匹配发生时清除计数器模式 (CTC) ,以及两种 PWM 模式,详见
Table 39 与 P73“ 工作模式 ” 。
Table 39. 波形产生模式的位定义
WGM01
模式
(CTC0)
00 0普通 0xFF 立即更新 MAX
10 1P W M,相位修正 0xFF TOP BOTTOM
2 1 0 CTC OCR0 立即更新 MAX
WGM00
(PWM0) T/C 的工作模式 TOP
(1)
OCR0 的
更新时间
TOV0 的置
位时刻
2502E–AVR–12/03
31 1快速 PWM 0xFF TOP MAX
Note: 1. 位定义 CTC0和 PWM0 已经不再使用了,要使用WGM01:0。但是功能和位置与以前版
本兼容。
• Bit 5:4 – COM01:0: 比较匹配输出模式
这两位决定了比较匹配发生时输出引脚 OC0 的电平。如果 COM01:0 中的一位或全部都
置位, OC0 以比较匹配输出的方式进行工作。同时其方向控制寄存器位要设置为 1 以使
能输出驱动器。
当 OC0 连接到物理引脚上时, COM01:0 的功能依赖于 WGM01:0 的设置。 Table 40 给
出了当 WGM01:0 设置为普通模式或 CTC 模式时 COM01:0 的功能。
Table 40. 比较输出模式,非 PWM 模式
COM01 COM00 说明
00正常的端口操作,不与 OC0 相连接
01比较匹配发生时 OC0 取反
10比较匹配发生时 OC0 清零
11比较匹配发生时 OC0 置位
79
Page 80
Table 41 给出了当 WGM01:0 设置为快速 PWM 模式时 COM01:0 的功能。
Table 41. 比较输出模式,快速 PWM 模式
COM01 COM00 说明
00正常的端口操作,不与 OC0 相连接
01保留
10比较匹配发生时 OC0A 清零,计数到 TOP 时 OC0 置位
11比较匹配发生时 OC0A 置位,计数到 TOP 时 OC0 清零
Note: 1. 一个特殊情况是 OCR0 等于 TOP,且 COM01 置位。此时比较匹配将被忽略,而计数到
TOP 时 OC0 的动作继续有效。详细信息请参见 P74“ 快速 PWM 模式 ” 。
(1)
Table 42 给出了当 WGM01:0 设置为相位修正 PWM 模式时 COM01:0 的功能。
Table 42. 比较输出模式,相位修正 PWM 模式
COM01 COM00 说明
00正常的端口操作,不与 OC0 相连接
01保留
10在升序计数时发生比较匹配将清零 OC0 ;降序计数时发生比较匹配将置
位 OC0
11在升序计数时发生比较匹配将置位 OC0 ;降序计数时发生比较匹配将清
零 OC0
Note: 1. 一个特殊情况是 OCR0 等于 TOP,且 COM01 置位。此时比较匹配将被忽略,而计数到
TOP 时 OC0 的动作继续有效。详细信息请参见 P76“ 相位修正 PWM 模式 ” 。
(1)
80
ATmega8535(L)
2502E–AVR–12/03
Page 81
ATmega8535(L)
• Bit 2:0 – CS02:0: 时钟选择
用于选择 T/C 的时钟源。
Table 43. 时钟选择位说明
CS02 CS01 CS00 说明
000无时钟, T/C 不工作
001 c l k
010 c l k
011 c l k
100 c l k
101 c l k
110时钟由 T0 引脚输入,下降沿触发
111时钟由 T0 引脚输入,上升沿触发
如果 T/C0 使用外部时钟,即使 T0 被配置为输出,其上的电平变化仍然会驱动记数器。
利用这一特性可通过软件控制记数。
/1 ( 没有预分频 )
I/O
/8 ( 来自预分频器 )
I/O
/64 ( 来自预分频器 )
I/O
/256 ( 来自预分频器 )
I/O
/1024 ( 来自预分频器 )
I/O
T/C 寄存器- TCNT0
输出比较寄存器- OCR0
T/C 中断屏蔽寄存器- TIMSK
B i t 76543210
TCNT0[7:0] TCNT0
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
通过 T/C 寄存器可以直接对计数器的 8 位数据进行读写访问。对 TCNT0 寄存器的写访问
将在下一个时钟阻止比较匹配。在计数器运行的过程中修改 TCNT0 的数值有可能丢失一
次 TCNT0 和 OCR0 的比较匹配。
B i t 76543210
OCR0[7:0] OCR0
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
输出比较寄存器包含一个 8 位的数据,不间断地与计数器数值 TCNT0 进行比较。匹配事
件可以用来产生输出比较中断,或者用来在 OC0 引脚上产生波形。
B i t 76543 210
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 TIMSK
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 0000 0000
• Bit 1 – OCIE0: T/C0 输出比较匹配中断使能
T/C 中断标志寄存器- TIFR
2502E–AVR–12/03
当 OCIE0 和状态寄存器的全局中断使能位 I 都为 ”1” 时,T/C0 的输出比较匹配中断使能。
当 T/C0 的比较匹配发生,即 TIFR 中的 OCF0 置位时,中断服务程序得以执行。
• Bit 0 – TOIE0: T/C0 溢出中断使能
当 TOIE0 和状态寄存器的全局中断使能位 I 都为 ”1” 时,T/C0 的溢出中断使能。当 T/C0
发生溢出,即 TIFR 中的 TOV0 位置位时,中断服务程序得以执行。
B i t 76543210
81
Page 82
OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0 TIFR
读/写 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 00000000
• Bit 1 – OCF0: 输出比较标志 0
当 T/C0 与 OCR0( 输出比较寄存器 0) 的值匹配时, OCF0 置位。此位在中断服务程序里
硬件清零,也可以对其写 1 来清零。当 SREG 中的位 I、 OCIE0(T/C0 比较匹配中断使能
)和OCF0 都置位时,中断服务程序得到执行。
• Bit 0 – TOV0: T/C0 溢出标志
当 T/C0 溢出时, TOV0 置位。执行相应的中断服务程序时此位硬件清零。此外, TOV0
也可以通过写 1 来清零。当 SREG 中的位 I、 TOIE0(T/C0 溢出中断使能 ) 和 TOV0 都置
位时,中断服务程序得到执行。在相位修正 PWM 模式中,当 T/C0 在 0x00 改变记数方
向时, TOV0 置位。
82
ATmega8535(L)
2502E–AVR–12/03
Page 83
ATmega8535(L)
T/C0 与 T/C1 的预分频
器
T/C1 与 T/C0 共用一个预分频模块,但它们可以有不同的分频设置。下述内容适用于 T/C1
与 T/C0 。
内部时钟源 当 CSn2:0 = 1 时,系统内部时钟直接作为 T/C 的时钟源,这也是 T/C 最高频率的时钟源
f
,与系统时钟频率相同。预分频器可以输出 4 个不同的时钟信号 f
CLK_I/O
f
CLK_I/O
/64、 f
CLK_I/O
/256 或 f
CLK_I/O
/1024。
CLK_I/O
/8、
分频器复位 预分频器是独立运行的。也就是说,其操作独立于 T/C 的时钟选择逻辑,且它由 T/C1 与
T/C0 共享。由于预分频器不受 T/C 时钟选择的影响,预分频器的状态需要包含预分频时钟
被用到何处这样的信息。一个典型的例子发生在定时器使能并由预分频器驱动 (6 >
CSn2:0 > 1)的时候:从计时器使能到第一次开始计数可能花费 1 到N+1个系统时钟周期,
其中 N 等于预分频因子 (8 、 64 、 256 或 1024) 。
通过复位预分频器来同步 T/C 与程序运行是可能的。但是必须注意另一个 T/C 是否也在
使用这一预分频器,因为预分频器复位将会影响所有与其连接的 T/C 。
外部时钟源 由 T1/T0 引脚提供的外部时钟源可以用作 T/C 时钟 clk
/clkT0。引脚同步逻辑在每个系统
T1
时钟周期对引脚 T1/T0 进行采样。然后将同步 ( 采样 ) 信号送到边沿检测器。 Figure 38
给出了 T1/T0 同步采样与边沿检测逻辑的功能等效方框图。寄存器由内部系统时钟
clk
I/O
的上跳沿驱动。当内部时钟为高时,锁存器可以看作时透明的。
CSn2:0 = 7 时边沿检测器检测到一个正跳变产生一个clk
变就产生一个 clk
0
T
脉冲。
脉冲; CSn2:0 = 6 时一个负跳
T1
Figure 38. T1/T0 引脚采样
Tn
DQ DQ
DQ
Tn_sync
(To Clock
Select Logic)
LE
clk
I/O
Edge Detector Synchronization
由于引脚上同步与边沿监测电路的存在,引脚 T1/T0 上的电平变化需要延时 2.5 到 3.5 个
系统时钟周期才能使计数器进行更新。
禁止或使能时钟输入必须在 T1/T0 保持稳定至少一个系统时钟周期后才能进行,否则有产
生错误 T/C 时钟脉冲的危险。
为保证正确的采样,外部时钟脉冲宽度必须大于一个系统时钟周期。在占空比为 50% 时
外部时钟频率必须小于系统时钟频率的一半 (f
ExtClk
< f
/2)。由于边沿检测器使用的是
clk_I/O
采样这一方法,它能检测到的外部时钟最多是其采样频率的一半 (Nyquist 采样定理 )。然
而,由于振荡器 ( 晶体、谐振器与电容 ) 本身误差带来的系统时钟频率及占空比的差异,
建议外部时钟的最高频率不要大于 f
clk_I/O
/2.5。
外部时钟源不送入预分频器。
2502E–AVR–12/03
83
Page 84
Figure 39. T/C0 与 T/C1 预分频器
clk
I/O
SR10
T0
Synchronization
T1
Synchronization
(1)
Clear
特殊功能 IO 寄存器- SFIOR
clk
T1
clk
T0
Note: 1. 输入引脚 (T1/T0) 的同步逻辑见 Figure 38。
Bit 7 6 5 4 3 2 1 0
ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10 SFIOR
读/写 R/W R/W R/W R R/W R/W R/W R/W
初始值 000 00000
• Bit 0 – PSR10: T/C1 与 T/C0 预分频器复位
置位时 T/C1 与 T/C0 的预分频器复位。操作完成后这一位由硬件自动清零。写入零时不
会引发任何动作。 T/C1 与 T/C0 共用同一预分频器,且预分频器复位对两个定时器均有
影响。该位总是读为 0。
84
ATmega8535(L)
2502E–AVR–12/03
Page 85
ATmega8535(L)
16 位定时器 / 计数器 1 16位的T/C可以实现精确的程序定时(事件管理)、波形产生和信号测量。其主要特点如下:
真正的 16 位设计 ( 即允许 16 位的 PWM)
•
• 2 个独立的输出比较单元
• 双缓冲的输出比较寄存器
• 一个输入捕捉单元
• 输入捕捉噪声抑制器
• 比较匹配发生时清除寄存器 ( 自动重载 )
• 无干扰脉冲,相位正确的 PWM
• 可变的 PWM 周期
• 频率发生器
• 外部事件计数器
• 4 个独立的中断源 (TOV1、 OCF1A、 OCF1B 与 ICF1)
综述 本节大多数的寄存器和位定义以通用的方式表示。小写 “n” 表示 T/C 序号,小写 “x” 表示
输出比较通道号。但是在写程序时要用完整的、精确的名称。如用 TCNT1 表示访问 T/C1
计数器值等。
16 位 T/C 的简化框图示于 Figure 40。I/O 引脚的实际位置请参见 P2“ATmega8535的引脚
” 。 CPU可访问的I/O寄存器,包括I/O位和I/O引脚以粗体表示。器件具体I/O寄存器与位定
位见 P103“16 位定时器 / 计数器寄存器的说明 ” 。
2502E–AVR–12/03
85
Page 86
Figure 40. 16 位 T/C 框图
(1)
Count
Clear
Direction
Timer/Counter
TCNTn
Control Logic
TOP BOTTOM
=
clk
=
Tn
0
=
OCRnA
Fixed
TOP
Values
=
DATA BUS
OCRnB
ICRn
ICFn (Int.Req.)
Edge
Detector
TOVn
(Int.Req.)
Clock Select
Edge
Detector
( From Prescaler )
OCnA
(Int.Req.)
Waveform
Generation
OCnB
(Int.Req.)
Waveform
Generation
Noise
Canceler
Tn
OCnA
OCnB
( From Analog
Comparator Ouput )
ICPn
TCCRnA TCCRnB
Note: 1. 请参考 P2Figure 1 , P58Table 26 和 P62Table 32 以获得 T/C1 的引脚定义。
寄存器 定时器 / 计数器 TCNT1 、输出比较寄存器 OCR1A/B 与输入捕捉寄存器 ICR1 均为 16 位
寄存器。访问 16 位寄存器必须通过特殊的步骤,详见 P87“ 访问 16 位寄存器 ” 。 T/C 控
制寄存器 TCCR1A/B 为 8 位寄存器,没有 CPU 访问的限制。中断请求 ( 图中简写为
Int.Req.) 信号在中断标志寄存器 TIFR1 都有反映。所有中断都可以由中断屏蔽寄存器
TIMSK1 单独控制。图中未给出 TIFR1 与 TIMSK1。
T/C可由内部时钟通过预分频器或通过由 T1引脚输入的外部时钟驱动。引发T/C数值增加(
或减少 ) 的时钟源及其有效沿由时钟选择逻辑模块控制。没有选择时钟源时 T/C 处于停止
状态。时钟选择逻辑模块的输出称为 clk
双缓冲输出比较寄存器 OCR1A/B 一直与 T/C 的值做比较。波形发生器用比较结果产生
PWM 或在输出比较引脚OC1A/B 输出可变频率的信号。参见P93“ 输出比较单元 ” 。比较匹
配结果还可置位比较匹配标志 OCF1A/B ,用来产生输出比较中断请求。
当输入捕捉引脚 ICP1 或模拟比较器输入引脚 ( 见 P192“ 模拟比较器 ” ) 有输入捕捉事件产
生 ( 边沿触发 ) 时,当时的 T/C 值被传输到输入捕捉寄存器保存起来。输入捕捉单元包括
一个数字滤波单元 ( 噪声消除器 ) 以降低噪声干扰。
在某些操作模式下, TOP 值或 T/C 的最大值可由 OCR1A 寄存器、 ICR1 寄存器,或一
些固定数据来定义。在 PWM 模式下用 OCR1A 作为 TOP 值时, OCR1A 寄存器不能用
。
1
T
86
ATmega8535(L)
2502E–AVR–12/03
Page 87
作 PWM 输出。但此时 OCR1A 是双向缓冲的, TOP 值可在运行过程中得到改变。当需
要一个固定的 TOP 值时可以使用 ICR1 寄存器,从而释放 OCR1A 来用作 PWM 的输出。
定义 以下定义适用于本节:
Table 44. 定义
BOTTOM
计数器计到 0x0000 时即达到 BOTTOM
ATmega8535(L)
MAX
TOP
兼容性 16位T/C 是从以前版本的16 位AVRT/C 改进和升级得来的。它在如下方面与以前的版本完
全兼容:
• 包括定时器中断寄存器在内的所有 16 位 T/C 相关的 I/O 寄存器的地址
• 包括定时器中断寄存器在内的所有 16 位 T/C 相关的寄存器位定位
• 中断向量
下列控制位名称已改,但具有相同的功能与寄存器单元:
•P W M 1 0改为 WGM10
• PWM11 改为 WGM11
•C T C 1改为 WGM12
16 位 T/C 控制寄存器中添加了下列位:
• TCCR1A 中加入 FOC1A 与 FOC1B
• TCCR1B 中加入 WGM13
16 位 T/C 的一些改进在某些特殊情况下将影响兼容性。
计数器计到 0xFFFF ( 十进制的 65535) 时即达到 MAX
计数器计到计数序列的最大值时即达到 TOP 。 TOP 值可以为固定值 0x00FF 、
0x01FF 或 0x03FF ,或是存储于寄存器 OCR1A 或 ICR1 里的数值,具体有赖于工作
模式
访问 16 位寄存器 TCNT1、OCR1A/B与 ICR1 是 AVR CPU 通过8 位数据总线可以访问的16 位寄存器。读写
16 位寄存器需要两次操作。每个 16 位计时器都有一个 8 位临时寄存器用来存放其高 8 位数
据。每个 16 位定时器所属的 16 位寄存器共用相同的临时寄存器。访问低字节会触发 16
位读或写操作。当 CPU 写入数据到 16 位寄存器的低字节时,写入的 8 位数据与存放在
临时寄存器中的高 8 位数据组成一个 16 位数据,同步写入到 16 位寄存器中。当 CPU 读
取 16 位寄存器的低字节时,高字节内容在读低字节操作的同时被放置于临时辅助寄存器
中。
2502E–AVR–12/03
并非所有的 16 位访问都涉及临时寄存器。对 OCR1A/B 寄存器的读操作就不涉及临时寄
存器。
写 16 位寄存器时,应先写入该寄存器的高位字节。而读 16 位寄存器时应先读取该寄存
器的低位字节。
87
Page 88
下面的例程说明了如何访问 16 位定时器寄存器。前提是假设不会发生更新临时寄存器内
容的中断。同样的原则也适用于对 OCR1A/B 与 ICR1 寄存器的访问。使用 “C” 语言时,
编译器会自动处理 16 位操作。
汇编代码例程
...
;
ldi r17,0x01
ldi r16,0xFF
out TCNT1H,r17
out TCNT1L,r16
; 将 TCNT1 读入 r17:r16
in r16,TCNT1L
in r17,TCNT1H
...
C 代码例程
unsigned int i;
...
/*
TCNT1 = 0x1FF;
/* 将 TCNT1
i = TCNT1;
...
(1)
设置
TCNT1 为0x01FF
(1)
设置
TCNT1 为0x01FF */
读入
i */
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 TCNT1 的返回值在 r17:r16 寄存器对中。
注意到 16 位寄存器的访问是一个基本操作是非常重要的。在对 16 位寄存器操作时,最
好首先屏蔽中断响应,防止在主程序读写 16 位寄存器的两条指令之间发生这样的中断:
它也访问同样的寄存器或其他的 16 位寄存器,从而更改了临时寄存器。如果这种情况发
生,那么中断返回后临时寄存器中的内容已经改变,造成主程序对 16 位寄存器的读写错
误。
88
ATmega8535(L)
2502E–AVR–12/03
Page 89
ATmega8535(L)
下面的例程给出了读取 TCNT1 寄存器内容的基本操作。对 OCR1A/B 或 ICR1 的读操作
可以使用相同的方法。
汇编代码例程
TIM16_ReadTCNT1:
;
in r18,SREG
;
cli
;
in r16,TCNT1L
in r17,TCNT1H
;
out SREG,r18
ret
C 代码例程
unsigned int TIM16_ReadTCNT1( void )
{
unsigned char sreg;
unsigned int i;
/*
sreg = SREG;
/*
_CLI();
/*
i = TCNT1;
/*
SREG = sreg;
return i;
}
(1)
保存全局中断标志
禁用中断
将
TCNT1
读入
r17:r16
恢复全局中断标志
(1)
保存全局中断标志
禁用中断
将
恢复全局中断标志
TCNT1
*/
读入
*/
i */
*/
2502E–AVR–12/03
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 TCNT1 的返回值在 r17:r16 寄存器对中。
89
Page 90
下面的例程给出了写 TCNT1 寄存器的基本操作。对 OCR1A/B 或 ICR1 的写操作可以使
用相同的方法。
汇编代码例程
TIM16_WriteTCNT1:
; 保存全局中断标志
in r18,SREG
;
cli
;
out TCNT1H,r17
out TCNT1L,r16
;
out SREG,r18
ret
C 代码例程
void TIM16_WriteTCNT1 ( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/*
sreg = SREG;
/*
_CLI();
/*
TCNT1 = i;
/*
SREG = sreg;
}
(1)
禁用中断
设置
TCNT1 到r17:r16
恢复全局中断标志
(1)
保存全局中断标志
禁用中断
设置
恢复全局中断标志
*/
TCNT1 到i */
*/
*/
Note: 1. 本代码假定已经包含了合适的头文件。
汇编代码例程中 r17:r16 寄存器对保存的是 TCNT1 的写入数据。
临时寄存器的重用 如果对不只一个 16 位寄存器写入数据而且所有的寄存器高字节相同,则只需写一次高字
节。前面讲到的基本操作在这种情况下同样适用。
90
ATmega8535(L)
2502E–AVR–12/03
Page 91
ATmega8535(L)
T/C 时钟源 T/C 时钟源可以来自内部,也可来自外部,由位于T/C 控制寄存器B(TCCR1B ) 的时钟选择
位 (CS12:0) 决定。时钟源与预分频器的描述见 P83“T/C0 与 T/C1 的预分频器 ” 。
计数器单元 16 位T/C 的主要部分是可编程的 16 位双向计数器单元。Figure 41 给出了计数器与其外围
电路方框图。
Figure 41. 计数器单元方框图
DATA BUS (8-bit)
TOVn
(Int.Req.)
TEMP (8-bit)
Clock Select
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
信号描述 ( 内部信号 ):
Count
Clear
Direction
Control Logic
TOP BOTTOM
clk
Tn
Edge
Detector
( From Prescaler )
Tn
Count TCNT1 加 1 或减 1
Direction 确定是加操作还是减操作
Clear TCNT1 清零
clk
1
T
定时器 / 计数器时钟信号
TOP 表示 TCNT1 计数器到达最大值
BOTTOM 表示 TCNT1 计数器到达最小值 (0)
16 位计数器映射到两个8 位I/O 存储器位置:TCNT1H 为高 8 位, TCNT1L 为低 8 位。 CPU
只能间接访问 TCNT1H 寄存器。 CPU 访问 TCNT1H 时,实际访问的是临时寄存器
(TEMP) 。读 取 TCNT1L 时,临时寄存器的内容更新为TCNT1H 的数值;而对 TCNT1L 执行
写操作时,TCNT1H 被临时寄存器的内容所更新。这就使 CPU 可以在一个时钟周期里通
过 8 位数据总线完成对 16 位计数器的读、写操作。此外还需要注意计数器在运行时的一
些特殊情况。在这些特殊情况下对 TCNT1 写入数据会带来未知的结果。在合适的章节会
对这些特殊情况进行具体描述。
根据工作模式的不同,在每一个 clk
clk
由时钟选择位 CS12:0 设定。当 CS12:0= 0 时,计数器停止计数。不过 CPU 对 TCNT1
1
T
的读取与 clk
是否存在无关。 CPU 写操作比计数器清零和其他操作的优先级都高。
1
T
时钟到来时,计数器进行清零、加 1 或减 1 操作。
1
T
计数器的计数序列取决于寄存器 TCCR1A 和 TCCR1B 中标志位 WGM13:0 的设置。计数
器的运行 ( 计数 ) 方式与通过 OC1x 输出的波形发生方式有很紧密的关系。计数序列与波
形产生的详细描述请参见 P95“ 工作模式 ” 。
通过 WGM13:0 确定了计数器的工作模式之后,TOV1 的置位方式也就确定了。TOV1 可
以用来产生 CPU 中断。
输入捕捉单元 T/C 的输入捕捉单元可用来捕获外部事件,并为其赋予时间标记以说明此时间的发生时
刻。外部事件发生的触发信号由引脚 ICP1 输入,也可通过模拟比较器单元来实现。时间
标记可用来计算频率、占空比及信号的其它特征,以及为事件创建日志。
输入捕捉单元方框图见 Figure 42 。图中不直接属于输入捕捉单元的部分用阴影表示。寄
存器与位中的小写 “n” 表示定时器 / 计数器编号。
91
2502E–AVR–12/03
Page 92
Figure 42. 输入捕捉单元方框图
ICPn
WRITE
TEMP (8-bit)
ICRnH (8-bit)
ICRn (16-bit Register)
ACO*
Analog
Comparator
DATA BUS
ICRnL (8-bit)
ACIC* ICNC ICES
Canceler
Noise
(8-bit)
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
Edge
Detector
ICFn (Int.Req.)
当引脚 ICP1 上的逻辑电平 ( 事件 ) 发生了变化,或模拟比较器输出 ACO 电平发生了变
化,并且这个电平变化为边沿检测器所证实,输入捕捉即被激发:16 位的 TCNT1 数据被
拷贝到输入捕捉寄存器 ICR1 ,同时输入捕捉标志位 ICF1 置位。如果此时 ICIE1 = 1 ,输
入捕捉标志将产生输入捕捉中断。中断执行时 ICF1 自动清零,或者也可通过软件在其对
应的 I/O 位置写入逻辑 "1” 清零。
读取 ICR1 时要先读低字节 ICR1L ,然后再读高字节 ICR1H 。读低字节时,高字节被复制
到高字节临时寄存器 TEMP 。 CPU 读取 ICR1H 时将访问 TEMP 寄存器。
对 ICR1 寄存器的写访问只存在于波形产生模式。此时 ICR1 被用作计数器的 TOP 值。写
ICR1 之前首先要设置 WGM13:0 以允许这个操作。对ICR1 寄存器进行写操作时必须先将
高字节写入 ICR1H I/O 位置,然后再将低字节写入 ICR1L。
请参见 P87“ 访问 16 位寄存器 ” 以了解更多的关于如何访问 16 位寄存器的信息。
输入捕捉触发源 输入捕捉单元的主要触发源是 ICP1 。T/C1 还可用模拟比较输出作为输入捕捉单元的触发
源。用户必须通过设置模拟比较控制与状态寄存器 ACSR 的模拟比较输入捕捉位 ACIC 来
做到这一点。要注意的是,改变触发源有可能造成一次输入捕捉。因此在改变触发源后必
须对输入捕捉标志执行一次清零操作以避免出现错误的结果。
ICP1 与ACO 的采样方式与T1 引脚是相同的(P83Figure 38 ),使用的边沿检测器也一样。但
是使能噪声抑制器后,在边沿检测器前会加入额外的逻辑电路并引入 4 个系统时钟周期的
延迟。要注意的是,除去使用 ICR1 定义 TOP 的波形产生模式外, T/C 中的噪声抑制器
与边沿检测器总是使能的。
输入捕捉也可以通过软件控制引脚 ICP1 的方式来触发。
噪声抑制器 噪声抑制器通过一个简单的数字滤波方案提高系统抗噪性。它对输入触发信号进行 4 次采
样。只有当 4 次采样值相等时其输出才会送入边沿检测器。
置位 TCCR1B 的 ICNC1 将使能噪声抑制器。使能噪声抑制器后,在输入发生变化到 ICR1
得到更新之间将会有额外的 4 个系统时钟周期的延时。噪声抑制器使用的是系统时钟,因
而不受预分频器的影响。
92
ATmega8535(L)
2502E–AVR–12/03
Page 93
ATmega8535(L)
输入捕捉单元的使用 使用输入捕捉单元的最大问题就是分配足够的处理器资源来处理输入事件。事件的时间
间隔是关键。如果处理器在下一次事件出现之前没有读取 ICR1 的数据, ICR1 就会被新
值覆盖,从而无法得到正确的捕捉结果。
使用输入捕捉中断时,中断程序应尽可能早的读取 ICR1 寄存器。尽管输入捕捉中断优先
级相对较高,但最大中断响应时间与其它正在运行的中断程序所需的时间相关。
在任何输入捕捉工作模式下都不推荐在操作过程中改变 TOP 值。
测量外部信号的占空比时要求每次捕捉后都要改变触发沿。因此读取 ICR1 后必须尽快改
变敏感的信号边沿。改变边沿后,ICF1 必须由软件清零 ( 在对应的 I/O 位置写 "1” )。若仅
需测量频率,且使用了中断发生,则不需对 ICF1 进行软件清零。
输出比较单元 16 位比较器持续比较TCNT1 与OCR1x 的内容,一旦发现它们相等,比较器立即产生一个
匹配信号。然后 OCF1x 在下一个定时器时钟置位。如果此时 OCIE1x = 1 , OCF1x 置位
将引发输出比较中断。中断执行时 OCF1x 标志自动清零,或者通过软件在其相应的 I/O
位置写入逻辑 "1” 也可以清零。根据 WGM13:0 与 COM1x1:0 的不同设置,波形发生器用
匹配信号生成不同的波形。波形发生器利用 TOP 和 BOTTOM 信号处理在某些模式下对
极值的操作 (P95“ 工作模式 ” ) 。
输出比较单元 A 的一个特质是定义 T/C 的 TOP 值 ( 即计数器的分辨率 )。此外,TOP 值
还用来定义通过波形发生器产生的波形的周期。
Figure 43 给出输出比较单元的方框图。寄存器与位上的小写 “n” 表示器件编号 (n = 1
T/C1), “x” 表示输出比较单元 (A/B)。框图中非输出比较单元部分用阴影表示。
Figure 43. 输出比较单元方框图
DATA BUS (8-bit)
TEMP (8-bit)
OCRnxH Buf. (8-bit)
OCRnx Buffer (16-bit Register)
OCRnxH (8-bit) OCRnxL (8-bit)
OCRnx (16-bit Register)
OCRnxL Buf. (8-bit)
TCNTnH (8-bit) TCNTnL (8-bit)
TCNTn (16-bit Counter)
= (16-bit Comparator )
OCFnx (Int.Req.)
TOP
BOTTOM
Waveform Generator
OCnx
表示
2502E–AVR–12/03
COMnx1:0 WGMn3:0
当 T/C 工作在 12 种 PWM 模式种的任意一种时, OCR1x 寄存器为双缓冲寄存器;而在
正常工作模式和匹配时清零模式 (CTC ) 双缓冲功能是禁止的。双缓冲可以实现 OCR1x 寄
存器对 TOP 或 BOTTOM 的同步更新,防止产生不对称的 PWM 波形,消除毛刺。
93
Page 94
访问 OCR1x 寄存器看起来很复杂,其实不然。使能双缓冲功能时,CPU 访问的是 OCR1x
缓冲寄存器;禁止双缓冲功能时 CPU 访问的则是 OCR1x 本身。 OCR1x( 缓冲或比较 )
寄存器的内容只有写操作才能将其改变 (T/C 不会自动将此寄存器更新为 TCNT1 或 ICR1
的内容 ),所以 OCR1x 不用通过 TEMP 读取。但是象其他 16 位寄存器一样首先读取低
字节是一个好习惯。由于比较是连续进行的,因此在写 OCR1x 时必须通过 TEMP 寄存器
来实现。首先需要写入的是高字节 OCR1xH 。当 CPU 将数据写入高字节的 I/O 地址时,
TEMP 寄存器的内容即得到更新。接下来写低字节 OCR1xL 。在此同时,位于 TEMP 寄存
器的高字节数据被拷贝到 OCR1x 缓冲器,或是 OCR1x 比较寄存器。
请参见 P87“ 访问 16 位寄存器 ” 以了解更多的关于如何访问 16 位寄存器的信息。
强制输出比较 工作于非 PWM 模式时,可以通过对强制输出比较位 FOC1x 写 ”1” 的方式来产生比较匹
配。强制比较匹配不会置位 OCF1x 标志,也不会重载 / 清零定时器,但是 OC1x 引脚将
被更新,好象真的发生了比较匹配一样 (COMx1:0 决定 OC1x 是置位、清零,还是交替变
化 )。
写 TCNT1 操作阻止比较匹配 CPU对TCNT1寄存器的写操作会阻止比较匹配的发生。这个特性可以用来将OCR1x 初始
化为与 TCNT1 相同的数值而不触发中断。
使用输出比较单元 由于在任意模式下写 TCNT1 都将在下一个定时器时钟周期里阻止比较匹配,在使用输出
比较时改变TCNT1 就会有风险,不管T/C 是否在运行。若写入TCNT1 的数值等于OCR1x ,
比较匹配就被忽略了,造成不正确的波形发生结果。在 PWM 模式下,当 TOP 为可变数
值时,不要赋予 TCNT1 和 TOP 相等的数值。否则会丢失一次比较匹配,计数器也将计
到0xFFFF 。类似地,在计数器进行降序计数时不要对TCNT1 写入等于BOTTOM 的数据。
OC1x 的设置应该在设置数据方向寄存器之前完成。最简单的设置 OC1x 的方法是在普通
模式下利用强制输出比较 FOC1x 。即使在改变波形发生模式时 OC1x 寄存器也会一直保
持它的数值。
COM1x1:0 和比较数据都不是双缓冲的。 COM1x1:0 的改变将立即生效。
94
ATmega8535(L)
2502E–AVR–12/03
Page 95
ATmega8535(L)
比较匹配输出单元 比较匹配模式控制位 COM1x1:0 具有双重功能。波形发生器利用 COM1x1:0 来确定下一
次比较匹配发生时的输出比较 OC1x 状态; COM1x1:0 还控制 OC1x 引脚输出的来源。
Figure 44 为受COM1x1:0 设置影响的逻辑的简化原理图。 I/O 寄存器、I/O 位和 I/O 引脚以
粗体表示。图中只给出了受 COM1x1:0 影响的通用 I/O 端口控制寄存器 (DDR 和 PORT) 。
谈及 OC1x 状态时指的是内部 OC1x 寄存器,而不是 OC1x 引脚的状态。系统复位时
COM1x 寄存器复位为 "0” 。
Figure 44. 比较匹配输出单元原理图
COMnx1
COMnx0
FOCnx
Waveform
Generator
DQ
OCnx
DQ
1
0
OCnx
Pin
PORT
DATA BUS
DQ
DDR
clk
I/O
只要 COM1x1:0 不全为零,波形发生器的输出比较功能就会重载 OC1x 的通用 I/O 口功
能。但是 OC1x 引脚的方向仍旧受控于数据方向寄存器 (DDR) 。从 OC1x 引脚输出有效
信号之前必须通过数据方向寄存器的 DDR_OC1x 将此引脚设置为输出。一般情况下功能
重载与波形发生器的工作模式无关,但也由一些例外,详见 Table 45 、Table 46 与 Table
47 。
输出比较逻辑的设计允许 OC1x 在输出之前首先进行初始化。要注意某些 COM1x1:0 设
置在某些特定的工作模式下是保留的,如 P103“16 位定时器 / 计数器寄存器的说明 ” 。
COM1x1:0 不影响输入捕捉单元。
比较输出模式和波形产生 波形发生器利用 COM1x1:0 的方法在普通模式、 CTC 模式和 PWM 模式下有所区别。对
于所有的模式,设置 COM1x1:0 = 0 表明比较匹配发生时波形发生器不会操作 OC1x 寄存
器。非 PWM 模式的比较输出请参见P103Table 45 ;快速 PWM 的比较输出于 P104Table
46 ;相位修正 PWM 的比较输出于 P104Table 47 。
改变 COM1x1:0 将影响写入数据后的第一次比较匹配。对于非 PWM 模式,可以通过使
用 FOC1x 来立即产生效果。
工作模式 工作模式 - T/C 和输出比较引脚的行为 - 由波形发生模式 (WGM13:0) 及比较输出模式
(COM1x1:0) 的控制位决定。比较输出模式对计数序列没有影响,而波形产生模式对计数
序列则有影响。 COM1x1:0 控制 PWM 输出是否为反极性。非 PWM 模式时 COM1x1:0
控制输出是否应该在比较匹配发生时置位、清零,或是电平取反 (P95“ 比较匹配输出单元
” ) 。
95
2502E–AVR–12/03
Page 96
具体的时序信息请参考 P101“ 定时器 / 计数器时序图 ” 。
普通模式 普通模式 (WGM13:0 = 0) 为最简单的工作模式。在此模式下计数器不停地累加。计到最
大值后 (TOP = 0xFFFF) 由于数值溢出计数器简单地返回到最小值 0x0000 重新开始。在
TCNT1 为零的同一个定时器时钟里T/C 溢出标志TOV1 置位。此时TOV1 有点象第 17 位,只
是只能置位,不会清零。但由于定时器中断服务程序能够自动清零 TOV1 ,因此可以通过
软件提高定时器的分辨率。在普通模式下没有什么需要特殊考虑的,用户可以随时写入新
的计数器数值。
在普通模式下输入捕捉单元很容易使用。要注意的是外部事件的最大时间间隔不能超过
计数器的分辨率。如果事件间隔太长,必须使用定时器溢出中断或预分频器来扩展输入捕
捉单元的分辨率。
输出比较单元可以用来产生中断。但是不推荐在普通模式下利用输出比较来产生波形,因
为会占用太多的 CPU 时间。
CTC( 比较匹配时清零定时器 )
模式
在 CTC 模式 (WGM13:0 = 4 或 12) 里 OCR1A 或 ICR1 寄存器用于调节计数器的分辨率。
当计数器的数值 TCNT1 等于 OCR1A(WGM13:0 = 4) 或等于 ICR1 (WGM13:0 = 12) 时计
数器清零。 OCR1A 或 ICR1 定义了计数器的 TOP 值,亦即计数器的分辨率。这个模式
使得用户可以很容易地控制比较匹配输出的频率,也简化了外部事件计数的操作。
CTC 模式的时序图为Figure 45 。计数器数值TCNT1 一直累加到 TCNT1 与 OCR1A 或 ICR1
匹配,然后 TCNT1 清零。
Figure 45. CTC 模式的时序图
OCnA Interrupt Flag Set
or ICFn Interrupt Flag Set
(Interrupt on TOP)
TCNTn
OCnA
(Toggle)
Period
1 4
2 3
(COMnA1:0 = 1)
利用 OCF1A 或 ICF1 标志可以在计数器数值达到 TOP 时产生中断。 在中断服务程序里可
以更新 TOP 的数值。由于 CTC 模式没有双缓冲功能,在计数器以无预分频器或很低的预
分频器工作的时候将 TOP 更改为接近 BOTTOM 的数值时要小心。如果写入的 OCR1A 或
ICR1 的数值小于当前 TCNT1 的数值,计数器将丢失一次比较匹配。在下一次比较匹配发
生之前,计数器不得不先计数到最大值 0xFFFF ,然后再从 0x0000 开始计数到 OCR1A
或 ICR1 。在许多情况下,这一特性并非我们所希望的。替代的方法是使用快速 PWM 模
式,该模式使用 OCR1A 定义 TOP 值 (WGM13:0 = 15) ,因为此时 OCR1A 为双缓冲。
96
为了在CTC 模式下得到波形输出,可以设置OC1A 在每次比较匹配发生时改变逻辑电平。
这可以通过设置 COM1A1:0 = 1 来完成。在期望获得 OC1A 输出之前,首先要将其端口
设置为输出 (DDR_OC1A = 1)。波形发生器能够产生的最大频率为 f
(OCR1A = 0x0000) 。频率由如下公式确定:
ATmega8535(L)
OCnA
f
=
--------------------------------------------------2 N 1 OCRnA + (
clk_I/O
⋅⋅
= f
OC1A
clk_I/O
2502E–AVR–12/03
/2
Page 97
ATmega8535(L)
变量 N 代表预分频因子 (1 、 8 、 64 、 256 或 1024) 。
在普通模式下,TOV1 标志的置位发生在计数器从 MAX 变为 0x0000 的定时器时钟周期。
快速 PWM 模式 快速 PWM 模式 (WGM13:0 = 5 、 6 、 7、 14 或 15) 可用来产生高频的 PWM 波形。快速
PWM 模式与其他 PWM 模式的不同之处是其单边斜坡工作方式。计数器从 BOTTOM 计到
TOP,然后立即回到 BOTTOM 重新开始。对于普通的比较输出模式,输出比较引脚 OC1x
在 TCNT1 与 OCR1x 匹配时置位,在 TOP 时清零;对于反向比较输出模式,OCR1x 的
动作正好相反。由于使用了单边斜坡模式,快速 PWM 模式的工作频率比使用双斜坡的相
位修正 PWM 模式高一倍。此高频操作特性使得快速 PWM 模式十分适合于功率调节,整
流和 DAC 应用。高频可以减小外部元器件 ( 电感,电容 ) 的物理尺寸,从而降低系统成本。
工作于快速 PWM 模式时,PWM 分辨率可固定为 8、9 或 10 位,也可由 ICR1 或 OCR1A
定义。最小分辨率为 2 比特 (ICR1 或 OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1
或 OCR1A 设为 MAX) 。 PWM 分辨率位数可用下式计算:
TOP 1 + ()log
FPWM
工作于快速 PWM 模式时,计数器的数值一直累加到固定数值 0x00FF、 0x01FF、0x03FF
(WGM13:0 = 5、 6 或 7)、ICR1 (WGM13:0 = 14) 或 OCR1A (WGM13:0 = 15),然后在后
面的一个时钟周期清零。具体的时序图为 Figure 46 。图中给出了当使用 OCR1A 或 ICR1
来定义 TOP 值时的快速 PWM 模式。图中柱状的 TCNT1 表示这是单边斜坡操作。方框
图同时包含了普通的 PWM 输出以及反向 PWM 输出。 TCNT1 斜坡上的短水平线表示
OCR1x 和 TCNT1 的匹配比较。比较匹配后 OC1x 中断标志置位。
------------------------------------ =
2() log
Figure 46. 快速 PWM 模式时序图
OCRnx / TOP Update
and TOVn Interrupt Flag
Set and OCnA Interrupt
Flag Set or ICFn
Interrupt Flag Set
(Interrupt on TOP)
TCNTn
OCnx
OCnx
Period
1 7
2 3 4 5 6 8
(COMnx1:0 = 2)
(COMnx1:0 = 3)
计时器数值达到 TOP 时 T/C 溢出标志 TOV1 置位。另外若 TOP 值是由 OCR1A 或 ICR1
定义的,则 OC1A 或 ICF1 标志将与 TOV1 在同一个时钟周期置位。如果中断使能,可以
在中断服务程序里来更新 TOP 以及比较数据。
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会出现比较匹配。使用固定的 TOP 值时,向任意 OCR1x 寄存器写入数据时未使用的
位将屏蔽为 "0” 。
定义 TOP 值时更新 ICR1 与 OCR1A 的步骤时不同的。 ICR1 寄存器不是双缓冲寄存器。
这意味着当计数器以无预分频器或很低的预分频工作的时候,给 ICR1 赋予一个小的数值
时存在着新写入的 ICR1 数值比 TCNT1 当前值小的危险。结果是计数器将丢失一次比较
匹配。在下一次比较匹配发生之前,计数器不得不先计数到最大值 0xFFFF ,然后再从
0x0000 开始计数,直到比较匹配出现。而 OCR1A 寄存器则是双缓冲寄存器。这一特性决
2502E–AVR–12/03
97
Page 98
定 OCR1A 可以随时写入。写入的数据被放入 OCR1A 缓冲寄存器。在 TCNT1 与 TOP 匹
配后的下一个时钟周期,OCR1A 比较寄存器的内容被缓冲寄存器的数据所更新。在同一
个时钟周期 TCNT1 被清零,而 TOV1 标志被设置。
使用固定 TOP 值时最好使用 ICR1 寄存器定义 TOP 。这样 OCR1A 就可以用于在 OC1A
输出 PWM 波。但是,如果 PWM 基频不断变化 ( 通过改变 TOP 值),OCR1A 的双缓冲
特性使其更适合于这个应用。
工作于快速PWM 模式时,比较单元可以在OC1x 引脚上输出PWM波形。设置COM1x1:0
为 2 可以产生普通的 PWM 信号;为 3 则可以产生反向 PWM 波形 ( 参见 P104Table 46
)。此外,要真正从物理引脚上输出信号还必须将 OC1x 的数据方向 DDR_OC1x 设置为输
出。产生 PWM 波形的机理是 OC1x 寄存器在 OCR1x 与 TCNT1 匹配时置位 ( 或清零 ),
以及在计数器清零 ( 从 TOP 变为 BOTTOM) 的那一个定时器时钟周期清零 ( 或置位 )。
输出的 PWM 频率可以通过如下公式计算得到:
f
clk_I/O
-----------------------------------
OCnxPWM
=
N 1 TOP + ()⋅
变量 N 代表分频因子 (1、 8、 64、 256 或 1024)。
OCR1x 寄存器为极限值时说明了快速 PWM 模式的一些特殊情况。若 OCR1x 等于
BOTTOM(0x0000),输出为出现在第TOP+1个定时器时钟周期的窄脉冲;OCR1x为TOP
时,根据 COM1x1:0 的设定,输出恒为高电平或低电平。
通过设定 OC1A 在比较匹配时进行逻辑电平取反 (COM1A1:0 = 1) ,可以得到占空比为
50% 的周期信号。这只适用于 OCR1A 用来定义 TOP 值的情况 (WGM13:0 = 15) 。 OCR1A
为 0(0x0000) 时信号有最高频率 f
OC1A
= f
/2。这个特性类似于 CTC 模式下的 OC1A
clk_I/O
取反操作,不同之处在于快速 PWM 模式具有双缓冲。
相位修正 PWM 模式 相位修正 PWM 模式 (WGM13:0 = 1 、 2、 3、10 或 11) 为用户提供了一个获得高精度的、
相位准确的 PWM 波形的方法。与相位和频率修正模式类似,此模式基于双斜坡操作。计
时器重复地从 BOTTOM 计到 TOP ,然后又从 TOP 倒退回到 BOTTOM 。在一般的比较输
出模式下,当计时器往 TOP 计数时若 TCNT1 与 OCR1x 匹配,OC1x 将清零为低电平;
而在计时器往 BOTTOM 计数时若 TCNT1 与 OCR1x 匹配, OC1x 将置位为高电平。工
作于反向比较输出时则正好相反。与单斜坡操作相比,双斜坡操作可获得的最大频率要
小。但其对称特性十分适合于电机控制。
相位修正 PWM 模式的 PWM 分辨率固定为 8、9 或 10 位,或由 ICR1 或 OCR1A 定义。
最小分辨率为2 比特(ICR1 或OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1 或 OCR1A
设为 MAX) 。 PWM 分辨率位数可用下式计算:
TOP 1+ ()log
-----------------------------------
PCPWM
=
2() log
工作于相位修正 PWM 模式时,计数器的数值一直累加到固定值 0x00FF、 0x01FF、
0x03FF (WGM13:0 = 1、 2 或 3)、ICR1 (WGM13:0 = 10) 或 OCR1A (WGM13:0 = 11),然
后改变计数方向。在一个定时器时钟里 TCNT1 值等于 TOP 值。具体的时序图为 Figure
47。图中给出了当使用 OCR1A或 ICR1来定义TOP 值时的相位修正PWM 模式。图中柱状
的 TCNT1 表示这是双边斜坡操作。方框图同时包含了普通的 PWM 输出以及反向 PWM
输出。TCNT1 斜坡上的短水平线表示 OCR1x 和 TCNT1 的匹配比较。比较匹配后 OC1x
中断标志置位。
98
ATmega8535(L)
2502E–AVR–12/03
Page 99
Figure 47. 相位修正 PWM 模式的时序图
TCNTn
ATmega8535(L)
OCRnx/TOP Update and
OCnA Interrupt Flag Set
or ICFn Interrupt Flag Set
(Interrupt on TOP)
TOVn Interrupt Flag Set
(Interrupt on Bottom)
OCnx
OCnx
Period
1 2 3 4
(COMnx1:0 = 2)
(COMnx1:0 = 3)
计时器数值达到 BOTTOM 时 T/C 溢出标志 TOV1 置位。若 TOP 由 OCR1A 或 ICR1 定
义,在 OCR1x 寄存器通过双缓冲方式得到更新的同一个时钟周期里 OC1A 或 ICF1 标志
置位。标志置位后即可产生中断。
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会出现比较匹配。使用固定的 TOP 值时,向任意 OCR1x 寄存器写入数据时未使用的
位将屏蔽为 "0” 。在 Figure 47 给出的第三个周期中,在 T/C 运行于相位修正模式时改变
TOP 值导致了不对称输出。其原因在于OCR1x 寄存器的更新时间。由于 OCR1x 的更新时
刻为定时器 / 计数器达到 TOP 之时,因此 PWM 的循环周期起始于此,也终止于此。就
是说,下降斜坡的长度取决于上一个 TOP 值,而上升斜坡的长度取决于新的 TOP 值。若
这两个值不同,一个周期内两个斜坡长度不同,输出也就不对称了。
若要在 T/C 运行时改变 TOP 值,最好用相位与频率修正模式代替相位修正模式。若 TOP
保持不变,那么这两种工作模式实际没有区别。
工作于相位修正 PWM 模式时,比较单元可以在 OC1x 引脚输出 PWM 波形。设置
COM1x1:0 为 2 可以产生普通的 PWM,设置 COM1x1:0 为 3 可以产生反向 PWM ( 参见
P104Table 47 )。要真正从物理引脚上输出信号还必须将OC1x的数据方向DDR_OC1x 设
置为输出。 OCR1x 和 TCNT1 比较匹配发生时 OC1x 寄存器将产生相应的清零或置位操
作,从而产生 PWM 波形。工作于相位修正模式时 PWM 频率可由如下公式获得:
f
f
OCnxPCPWM
clk_I/O
----------------------------- =
2 NTOP⋅⋅
变量 N 表示预分频因子 (1、 8、 64、 256 或 1024)。
OCR1x 寄存器处于极值时表明了相位修正 PWM 模式的一些特殊情况。在普通PWM 模式
下,若 OCR1x 等于 BOTTOM ,输出一直保持为低电平;若 OCR1x 等于 TOP ,输出则
保持为高电平。反向 PWM 模式正好相反。如果 OCR1A 用来定义 TOP 值 (WGM13:0 =
11) 且 COM1A1:0 = 1 , OC1A 输出占空比为 50% 的周期信号。
相位与频率修正 PWM 模式 相位与频率修正 PWM 模式 (WGM13:0 = 8 或 9) - 以下简称相频修正 PWM 模式 - 可以产
生高精度的、相位与频率都准确的 PWM 波形。与相位修正模式类似,相频修正 PWM 模
式基于双斜坡操作。计时器重复地从 BOTTOM 计到 TOP ,然后又从 TOP 倒退回到
BOTTOM 。在一般的比较输出模式下,当计时器往TOP 计数时若 TCNT1 与 OCR1x 匹配,
99
2502E–AVR–12/03
Page 100
OC1x将清零为低电平;而在计时器往 BOTTOM计数时 TCNT1与 OCR1x匹配,OC1x将置
位为高电平。工作于反向输出比较时则正好相反。与单斜坡操作相比,双斜坡操作可获得
的最大频率要小。但其对称特性十分适合于电机控制。
相频修正修正 PWM 模式与相位修正 PWM 模式的主要区别在于 OCR1x 寄存器的更新时
间,详见 Figure 47 与 Figure 48 。
相频修正修正 PWM 模式的 PWM 分辨率可由 ICR1 或 OCR1A 定义。最小分辨率为 2 比
特 (ICR1 或 OCR1A 设为 0x0003) ,最大分辨率为 16 位 (ICR1 或 OCR1A 设为 MAX) 。
PWM 分辨率位数可用下式计算:
TOP 1+ ()log
-----------------------------------
PFCPWM
=
2() log
工作于相频修正 PWM 模式时,计数器的数值一直累加到 ICR1 (WGM13:0 = 8) 或 OCR1A
(WGM13:0 = 9),然后改变计数方向。在一个定时器时钟里TCNT1 值等于 TOP值。具体的
时序图为 Figure 48。图中给出了当使用 OCR1A 或 ICR1 来定义 TOP 值时的相频修正
PWM模式。图中柱状的TCNT1表示这是双边斜坡操作。方框图同时包含了普通的PWM输
出以及反向 PWM 输出。TCNT1 斜坡上的短水平线表示 OCR1x 和 TCNT1 的匹配比较。
比较匹配发生时, OC1x 中断标志将被置位。
Figure 48. 相位与频率修正 PWM 模式的时序图
OCnA Interrupt Flag Set
or ICFn Interrupt Flag Set
(Interrupt on TOP)
OCRnx/TOP Update and
TOVn Interrupt Flag Set
(Interrupt on Bottom)
TCNTn
OCnx
OCnx
Period
1 2 3 4
(COMnx1:0 = 2)
(COMnx1:0 = 3)
在 OCR1x 寄存器通过双缓冲方式得到更新的同一个时钟周期里 T/C 溢出标志 TOV1 置
位。若 TOP 由 OCR1A 或 ICR1 定义,则当 TCNT1 达到 TOP 值时 OC1A 或 CF1 置位。
这些中断标志位可用来在每次计数器达到 TOP 或 BOTTOM 时产生中断。
改变TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值。否则TCNT1 与OCR1x
不会产生比较匹配。
如 Figure 48 所示,与相位修正模式形成对照的是,相频修正 PWM 模式生成的输出在所
有的周期中均为对称信号。这是由于 OCR1x 在 BOTTOM 得到更新,上升与下降斜坡长
度始终相等。因此输出脉冲为对称的,确保了频率是正确的。
100
使用固定 TOP 值时最好使用 ICR1 寄存器定义 TOP 。这样 OCR1A 就可以用于在 OC1A
输出 PWM 波。但是,如果 PWM 基频不断变化 ( 通过改变 TOP 值),OCR1A 的双缓冲
特性使其更适合于这个应用。
ATmega8535(L)
2502E–AVR–12/03