社区导航

 

搜索
查看: 124|回复: 0

[资料分享] DSP之时钟与定时器的通用定时器

[复制链接]

6412

TA的帖子

19

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-5-6 19:22 | 显示全部楼层 |阅读模式

C55x DSP片内有两个2通用定时器,利用定时器可向CPU产生周期性中断或向DSP片外的器件提供周期信号。其中TMS320VC5503/5507/5509/5510 DSP提供的是2个20位通用定时器。
1 结构框图
20位的定时器由两部分组成:一个4位的预定标器(PSC)和一个16位的主计数器(TIM)。
定时器有两个计数寄存器(PSC,TIM)和两个周期寄存器(TDDR,PRD),在定时器初始化过程中,周期寄存器的内容拷贝到计数寄存器中。

image-20200506192159-1.png

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,启动计时
3.DSP复位
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引脚输出,通过示波器检测定时器输出是否正常。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-29 11:11 , Processed in 0.095238 second(s), 21 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表