共2条
1/1 1 跳转至页
mega128,AVR,16 译文:mega128(L)AVR单片机16位定时器1
问
16位定时计数器
1. 16位定时、计数器(定时计数器1、定时计数器3)
16位定时计数器可以用于精确事件定时,波形发生,信号时序测量的方面。它的主要特性
是:
l 真16位设计(也就是可以16PWM)
l 三个独立的输出比较单元
l 双缓冲的输出比较寄存器
l 一个输入捕捉单元
l 输入捕捉具有噪声滤除功能
l 自动重装入功能
l PWM功能
l 可变的PWM周期
l 频率发生器
l 外部事件计数器
l 10个独立中断源
(TOV1,OCF1A,OCF1B,OCF1C,ICF1,TOV3,OCF3A,OCF3B,OCF3C,ICF3)
1. 1在Atmega103兼容模式中的约束
注意在Atmega103兼容模式中只有一个16位定时计数器有效(Timer1/Counter1)。另外还要
注意,在这个模式中Timer1/Counter1只有两个比较寄存器(A、B)
2. 简介
在这章中所提及的寄存器绝大部分拥有相同的结构。通过改变后面的字母n可以选择不同的
定时计数器,通过改变字母x可以改变不同的输出比较单元通道。在程序中必须指明具体的
寄存器或位。例如,TCNT1就是访问定时计数器的内容,依次类推。
图46给出一个16位定时计数器的简单框图,具体IO位置见图2,
2. 1寄存器
定时计数器(TCNTn),输出比较寄存器(OCRnA/B/C)和输入捕捉寄存器(ICRn)都是
16位寄存器,访问16位寄存器必须采用一些特殊的步骤。这些过程将在“访问16位寄存器”
一节介绍。对于控制寄存器(TCCRnA//B/C)这些8位寄存器,没有CPU访问限制。所有的中
断请求都在定时中断标志寄存器(TIFR)和扩展定时中断标志寄存器(ETIFR)中标出。每个
中断也都可以通过定时中断屏蔽寄存器(TIMSK)和扩展定时中断屏蔽寄存器(ETIMSK)分别予
以屏蔽。由于TIMSK和ETIMSK通其他的定时器单元共享,所有没有列出它的具体性能。
定时/计数器可以使用经由分频器的内部时钟,也可以使用由Tn引进的外部时钟。时钟选
择逻辑单元决定那一种时钟和那种边沿用于定时/计数器。如果没有时钟源选定,定时/计数
器处于停止状态。时钟选择逻辑的输出指定为定时器时钟(CLKTn)。
具有双缓冲的输出比较寄存器(OCRnA/B/C/)在所有时间里一直与定时/计数器的内容比
较。比较内容可以用波形发生器在比较输出引脚(OcnA/B/C)上产生PWM或可变频率输出。
具体参见“输出比较单元”一节。输出比较相同事件还可以使比较相同标志(OCFnA/B/C)
置位,它可以生成输出比较中断请求。
通过外部输入捕捉引脚(ICPn)和模拟比较器所触发(边沿触发)的事件,输入捕捉寄
存器可以捕捉定时/计数器的内容。输入捕捉单元含有数字滤波器可以减小捕捉到噪声尖峰
的机会。
定时/计数器的最大值可以有许多方法设定,如通过OCRnA寄存器和ICRnA寄存器,也可以
设定成一个固定值。如果在PWM模式中使用OCRnA作为最大值,OCRnA就不能用在生成PWM输出
中。由于这种双缓冲的方式,可让最大值在运行中随时改变。如果只要固定的最大值,可以
使用ICRnA代替。以使OCRnA可以用于PWM输出。
2. 2 常用定义
下面的定义广泛地应用于整个文档中
底 定时/计数器为0000H称之为底
最大 定时/计数器为0xfff(65535)是称之为最大
顶 定时/计数器设定最大值为顶,它可以是固定值如0x00ff,0x001f,0x003f,也可
以由寄存器OCRnA、ICRnA设定。具体以使用模式而定。
2.3 兼容性
此16定时/计数器对于以前的AVR1的16定时/计数器,进行了改进和提高。它完全兼容以前的
特性:
l 所有16定时/计数器包括的寄存器和中断,包括定时中断寄存器
l 所有16定时/计数器中寄存器中的位地址,包括定时中断寄存器
l 中断向量
下面的位发生了名称改变,但功能还是一样的。
PWMn0改为WGMn0
PWMn1改为WGMn1
CTCn 改为WGMn2
下面是增加的寄存器
定时/计数控制寄存器 C(RCCRnC)
输出比较寄存器 C(OCRnCH、OCRnCL合成OCRnC)
下面是增加的位
COM1C1:0 位添加至TCCRnA
FOCnA ,FOCnB和FOCnC添加到新的寄存器C
增加了有关C的输出比较中断标志和屏蔽单元。
16位定时/计数器的性能提高,在一些特别的应用可能影响兼容性。
3. 1 16位寄存器的访问
AVRCPU可以通过8位数据总线访问象TCNTn、OCRnA/B/BC和ICRn这样的16位寄存器。这些寄存
器必须以两次字节访问来读写操作。每个16位寄存器都有一个8位暂寄存器,它用于高位地
址的访问。同样,暂存寄存器由定时单元中的所有16定时器共享。对寄存器低8位访问会触
发整个16位寄存器的读写操作。当CPU写16位寄存器的低位时,暂存寄存器中内容和要写到
低位的数据在同一时钟写如16位寄存器。CPU读16位寄存器的低位时,16位寄存器的高位内
容会与低位数据同一时钟复制到暂存寄存器中。
不是所有的16位寄存器访问都要借助暂存寄存器,16位寄存器OCRnA/B/C。
对于16位写操作,高字节必须在低字节前写入;对于16位读操作,低字节必须在高字节前读
出。
下面的例子说明如何访问16位寄存器,假设期间没有中断修改暂存寄存器,同样的原则也可
用于OCRnA/B/C、ICRn等16位寄存器的访问。注意使用“C”语言时的访问方法。
Assembly Code Examples(1)
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
C Code Examples(1)
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCNTn = 0x1FF;
/* Read TCNTn into i */
i = TCNTn;
在汇编的例子中TCNTn的返回值在r16:r17中,要特别注意的是,访问16位寄存器是一个自
动连续的操作。在两条指令间有中断发生,并且这个中断也要访问16位寄存器导致暂存寄存
器内容改变的话。那这次访问的结果就可能时错误的。所在进行16位地址访问的时候,要关
闭中断。
下面的例子指出如何自动读取TCNTn,同样的方法也适用于OCRnA//B/C、ICRn。
Assembly Code Example(1)
TIM16_ReadTCNTn:
; Save global interrupt flag
in r18,SREG
; Disable interrupts
cli
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
; Restore global interrupt flag
out SREG,r18
ret
C Code Example(1)
unsigned int TIM16_ReadTCNTn( void )
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Read TCNTn into i */
i = TCNTn;
/* Restore global interrupt flag */
SREG = sreg;
return i;
}
下面例子说明如何自动写TCNTn寄存器,方法也适用于OCRnA/B/C、ICRn
Assembly Code Example(1)
TIM16_WriteTCNTn:
; Save global interrupt flag
in r18,SREG
; Disable interrupts
cli
; Set TCNTn to r17:r16
out TCNTnH,r17
out TCNTnL,r16
; Restore global interrupt flag
out SREG,r18
ret
C Code Example(1)
void TIM16_WriteTCNTn( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Set TCNTn to i */
TCNTn = i;
/* Restore global interrupt flag */
SREG = sreg;
3.2 高字节暂存寄存器的重复使用
如果写多于一个的16位寄存器,它们的高位内容相同。那么高位只需要写一次。
4. 定时/计数器的时钟源
定时/计数器可以被内部或外部的时钟源驱动,时钟控制逻辑可以选择时钟源的类型,它由
定时/计数器 控制寄存器B中的时钟选择位(CSn2:0)决定。关于时钟源和分频器可参看
“定时/计数器1,定时/计数器3的时钟源与预分频器”一节。
5. 计数器单元
16位定时/计数器的主要部分是一个可编程16位加/减计数器单元。图47给出此计数器的框图
和周围的控制环境。
图 47
『图片请对照ATMEL的datasheet(参见doc2467.pdf)』
答 1: good很好的技术资料 答 2: 很好,整个ATMEGA128什么时候全译好!
1. 16位定时、计数器(定时计数器1、定时计数器3)
16位定时计数器可以用于精确事件定时,波形发生,信号时序测量的方面。它的主要特性
是:
l 真16位设计(也就是可以16PWM)
l 三个独立的输出比较单元
l 双缓冲的输出比较寄存器
l 一个输入捕捉单元
l 输入捕捉具有噪声滤除功能
l 自动重装入功能
l PWM功能
l 可变的PWM周期
l 频率发生器
l 外部事件计数器
l 10个独立中断源
(TOV1,OCF1A,OCF1B,OCF1C,ICF1,TOV3,OCF3A,OCF3B,OCF3C,ICF3)
1. 1在Atmega103兼容模式中的约束
注意在Atmega103兼容模式中只有一个16位定时计数器有效(Timer1/Counter1)。另外还要
注意,在这个模式中Timer1/Counter1只有两个比较寄存器(A、B)
2. 简介
在这章中所提及的寄存器绝大部分拥有相同的结构。通过改变后面的字母n可以选择不同的
定时计数器,通过改变字母x可以改变不同的输出比较单元通道。在程序中必须指明具体的
寄存器或位。例如,TCNT1就是访问定时计数器的内容,依次类推。
图46给出一个16位定时计数器的简单框图,具体IO位置见图2,
2. 1寄存器
定时计数器(TCNTn),输出比较寄存器(OCRnA/B/C)和输入捕捉寄存器(ICRn)都是
16位寄存器,访问16位寄存器必须采用一些特殊的步骤。这些过程将在“访问16位寄存器”
一节介绍。对于控制寄存器(TCCRnA//B/C)这些8位寄存器,没有CPU访问限制。所有的中
断请求都在定时中断标志寄存器(TIFR)和扩展定时中断标志寄存器(ETIFR)中标出。每个
中断也都可以通过定时中断屏蔽寄存器(TIMSK)和扩展定时中断屏蔽寄存器(ETIMSK)分别予
以屏蔽。由于TIMSK和ETIMSK通其他的定时器单元共享,所有没有列出它的具体性能。
定时/计数器可以使用经由分频器的内部时钟,也可以使用由Tn引进的外部时钟。时钟选
择逻辑单元决定那一种时钟和那种边沿用于定时/计数器。如果没有时钟源选定,定时/计数
器处于停止状态。时钟选择逻辑的输出指定为定时器时钟(CLKTn)。
具有双缓冲的输出比较寄存器(OCRnA/B/C/)在所有时间里一直与定时/计数器的内容比
较。比较内容可以用波形发生器在比较输出引脚(OcnA/B/C)上产生PWM或可变频率输出。
具体参见“输出比较单元”一节。输出比较相同事件还可以使比较相同标志(OCFnA/B/C)
置位,它可以生成输出比较中断请求。
通过外部输入捕捉引脚(ICPn)和模拟比较器所触发(边沿触发)的事件,输入捕捉寄
存器可以捕捉定时/计数器的内容。输入捕捉单元含有数字滤波器可以减小捕捉到噪声尖峰
的机会。
定时/计数器的最大值可以有许多方法设定,如通过OCRnA寄存器和ICRnA寄存器,也可以
设定成一个固定值。如果在PWM模式中使用OCRnA作为最大值,OCRnA就不能用在生成PWM输出
中。由于这种双缓冲的方式,可让最大值在运行中随时改变。如果只要固定的最大值,可以
使用ICRnA代替。以使OCRnA可以用于PWM输出。
2. 2 常用定义
下面的定义广泛地应用于整个文档中
底 定时/计数器为0000H称之为底
最大 定时/计数器为0xfff(65535)是称之为最大
顶 定时/计数器设定最大值为顶,它可以是固定值如0x00ff,0x001f,0x003f,也可
以由寄存器OCRnA、ICRnA设定。具体以使用模式而定。
2.3 兼容性
此16定时/计数器对于以前的AVR1的16定时/计数器,进行了改进和提高。它完全兼容以前的
特性:
l 所有16定时/计数器包括的寄存器和中断,包括定时中断寄存器
l 所有16定时/计数器中寄存器中的位地址,包括定时中断寄存器
l 中断向量
下面的位发生了名称改变,但功能还是一样的。
PWMn0改为WGMn0
PWMn1改为WGMn1
CTCn 改为WGMn2
下面是增加的寄存器
定时/计数控制寄存器 C(RCCRnC)
输出比较寄存器 C(OCRnCH、OCRnCL合成OCRnC)
下面是增加的位
COM1C1:0 位添加至TCCRnA
FOCnA ,FOCnB和FOCnC添加到新的寄存器C
增加了有关C的输出比较中断标志和屏蔽单元。
16位定时/计数器的性能提高,在一些特别的应用可能影响兼容性。
3. 1 16位寄存器的访问
AVRCPU可以通过8位数据总线访问象TCNTn、OCRnA/B/BC和ICRn这样的16位寄存器。这些寄存
器必须以两次字节访问来读写操作。每个16位寄存器都有一个8位暂寄存器,它用于高位地
址的访问。同样,暂存寄存器由定时单元中的所有16定时器共享。对寄存器低8位访问会触
发整个16位寄存器的读写操作。当CPU写16位寄存器的低位时,暂存寄存器中内容和要写到
低位的数据在同一时钟写如16位寄存器。CPU读16位寄存器的低位时,16位寄存器的高位内
容会与低位数据同一时钟复制到暂存寄存器中。
不是所有的16位寄存器访问都要借助暂存寄存器,16位寄存器OCRnA/B/C。
对于16位写操作,高字节必须在低字节前写入;对于16位读操作,低字节必须在高字节前读
出。
下面的例子说明如何访问16位寄存器,假设期间没有中断修改暂存寄存器,同样的原则也可
用于OCRnA/B/C、ICRn等16位寄存器的访问。注意使用“C”语言时的访问方法。
Assembly Code Examples(1)
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
C Code Examples(1)
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCNTn = 0x1FF;
/* Read TCNTn into i */
i = TCNTn;
在汇编的例子中TCNTn的返回值在r16:r17中,要特别注意的是,访问16位寄存器是一个自
动连续的操作。在两条指令间有中断发生,并且这个中断也要访问16位寄存器导致暂存寄存
器内容改变的话。那这次访问的结果就可能时错误的。所在进行16位地址访问的时候,要关
闭中断。
下面的例子指出如何自动读取TCNTn,同样的方法也适用于OCRnA//B/C、ICRn。
Assembly Code Example(1)
TIM16_ReadTCNTn:
; Save global interrupt flag
in r18,SREG
; Disable interrupts
cli
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
; Restore global interrupt flag
out SREG,r18
ret
C Code Example(1)
unsigned int TIM16_ReadTCNTn( void )
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Read TCNTn into i */
i = TCNTn;
/* Restore global interrupt flag */
SREG = sreg;
return i;
}
下面例子说明如何自动写TCNTn寄存器,方法也适用于OCRnA/B/C、ICRn
Assembly Code Example(1)
TIM16_WriteTCNTn:
; Save global interrupt flag
in r18,SREG
; Disable interrupts
cli
; Set TCNTn to r17:r16
out TCNTnH,r17
out TCNTnL,r16
; Restore global interrupt flag
out SREG,r18
ret
C Code Example(1)
void TIM16_WriteTCNTn( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Save global interrupt flag */
sreg = SREG;
/* Disable interrupts */
_CLI();
/* Set TCNTn to i */
TCNTn = i;
/* Restore global interrupt flag */
SREG = sreg;
3.2 高字节暂存寄存器的重复使用
如果写多于一个的16位寄存器,它们的高位内容相同。那么高位只需要写一次。
4. 定时/计数器的时钟源
定时/计数器可以被内部或外部的时钟源驱动,时钟控制逻辑可以选择时钟源的类型,它由
定时/计数器 控制寄存器B中的时钟选择位(CSn2:0)决定。关于时钟源和分频器可参看
“定时/计数器1,定时/计数器3的时钟源与预分频器”一节。
5. 计数器单元
16位定时/计数器的主要部分是一个可编程16位加/减计数器单元。图47给出此计数器的框图
和周围的控制环境。
图 47
『图片请对照ATMEL的datasheet(参见doc2467.pdf)』
答 1: good很好的技术资料 答 2: 很好,整个ATMEGA128什么时候全译好!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |