C55x DSP
片内有两个
2通用
定时器,利用定时器可向
CPU
产生周期性中断或向
DSP
片外的器件提供周期信号。其中TMS320VC5503/5507/5509/5510 DSP提供的是2个20位通用定时器.
1 结构框图
20
位的定时器由两部分组成:一个
4
位的预定标器(
PSC
)和一个
16
位的主计数器(
TIM
)。
定时器有两个计数寄存器(
PSC
,
TIM
)和两个周期寄存器(
TDDR
,
PRD
),在定时器初始化过程中,周期寄存器的内容拷
贝到计数寄存器中。
2 工作原理
定时器的工作时钟可以来自
DSP
内部的
CPU
时钟,也可以来自引
脚
TIN/TOUT
。
定时器控制寄存器(
TCR
)中的字段
FUNC
可以确
定时钟源和
TIN/TOUT
引脚的功能,这样定时器的工作模式包括
以下几种:
当
FUNC=00b
时,
TIN/TOUT
为高阻态,时钟源是内部时钟(
CPU
时钟)。
当
FUNC=01b
时,
TIN/TOUT
为定时器输出,时钟源是内部时钟
(
CPU
时钟)。
当
FUNC=10b
时,
TIN/TOUT
为通用输出,时钟源是内部时钟(
CPU
时钟)。
当
FUNC=11b
时,
TIN/TOUT
为定时器输入,时钟源是外部时钟
。
在定时器中,预定标器由输入时钟驱动,
PSC
在每个输入时钟周
期减
1
,当其减到
0
时,
TIM
减
1
,当
TIM
减到
0
,定时器向
CPU
发
送一个中断请求(
TINT
)或向
DMA
控制器发送同步事件。定时
器发送中断信号或同步事件信号的频率可用下式计算:
TINT频率 = 输入时钟频率 / (TDDR + 1) * (PRD+1)
通过设置
TCR
中的自动重装控制位
ARB
,可使定时器工作于自动
重装模式,当
TIM
减到
0
,重新将周期寄存器(
TDDR
,
PRD
)的
内容拷贝到计数寄存器(
PSC
,
TIM
)中,继续定时。
每个定时器包括
4
个寄存器,即定时器预定标寄存器
PRSC
、主计
数寄存器
TIM
、主周期寄存器
PRD
和定时器控制寄存器
TCR
。
3 使用方法
在定时器的工作过程中,要注意以下因素对定时器的影响。
1
.初始化定时器
通用定时器的初始化过程如下:
(
1
)停止计时(
TSS=1
),定时器装载使能(
TLB=1
),
并将
周期寄存器(
TIM
,
PSC
)的内容拷贝到计数寄存器(
PRD
,
TDDR
);
(
2
)将预定标计数周期数写入
TDDR
;
(
3
)将主计数器周期数装入
PRD
;
(
4
)关闭定时器装载(
TLB=0
),启动计时(
TSS=0
)。
2
.停止
/
启动定时器
利用时钟控制寄存器中的
TSS
位可以停止或启动定时器。
TSS=1
,停止计时
TSS=0
,启动计时
DSP
复位后定时器的寄存器将按照如下规则复位:
l
停止定时(
TSS=1
);
预定标计数器值为
0
;
主计数器值为
FFFFh
;
定时器不进行自动重装(
ARB=0
);
idle
指令不能使定时器进入省电模式;
仿真时遇到软件断点定时器立即停止工作;
TIN/TOUT
为高阻态,时钟源是内部时钟(
FUNC=00b
)。
4 通用定时器的应用
如果使用芯片支持库函数对通用定时器进行编程,则必须包含头
文件
csl_timer.h
。
首先定义通用定时器句柄和配置结构:
TIMER_Handle hTimer;
TIMER_Config Config_TIMER = {
0X0310,
/*;
载入
TCR0t:
; IDLE_EN = 0 (
不允许空闲状态
)
; FUNC = 00b (
引脚为高阻态
)
; TLB = 0 (TLB
被清除
)
; FREE = 1 (
遇到断点时时钟不停止
)
; PWID = 00b (
脉冲延迟一个
CPU
时钟周期
)
; ARB = 1 (
当
TIM
计数到
0
时重新载入
TIM
和
; PSC)
; TSS = 1 (停止计数器)
; C/P = 0 (
引脚输出为脉冲模式
)
; POLAR = 0 (
引脚信号开始为
低
)
;
其他为
0
*/
0X197,
/* prd = 407 */
0X0007
/* prsc = 7 TDDR=7 */
//;
计数器每
3264(408*8)
个时钟周期输出
:
};
接下来打开句柄:
hTimer = TIMER_open(TIMER_DEV0,0);//设置计数器0,中断20K/s
调用定时器配置函数对计数器初始化:
TIMER_config(hTimer,&Config_TIMER);
调用定时器开始函数使定时器开始工作:
TIMER_start(hTimer);
如果在程序中需要暂时停止定时器计数可以调用定时器停止函数:
TIMER_stop(hTimer);
当使能定时器中断时,则当定时中断发生时将运行定时中断服务程序:
interrupt void Timer0_Isr()
{
……
}
5 通用定时器的调试
通用定时器可以产生定时中断,或者作为
DMA
同步事件来同步
DMA
传送,如
果将通用定时器的输出从通用定时器引脚引出,也可以为系统的其他部分
提供定时。
通用定时器的调试步骤如下:
设定通用定时器的时钟源,通用定时器的时钟源可以是
CPU
时钟,也可由
外部信号提供,如果选择外部时钟,则需要将这个信号从
TIN/TOUT
引脚
引入,应当注意此时
TIN/TOUT
引脚将不能够作为定时器输出使用;
正确设置定时器寄存器值,使定时器开始工作;
在定时器中断服务程序中设置断点,看能否进入定时中断,如果定时器的
时钟源是
CPU
时钟,这时也可以将定时器信号从
TIN/TOUT
引脚输出,通
过示波器检测定时器输出是否正常。