DSP

DSP之时钟与定时器之一时钟发生器

2019-07-13 10:35发布

时钟与定时器包括时钟产生器、通用定时器、实时时钟以及看门狗定时器等。     时钟产生器的功能是产生CPU的工作时钟,并提供CLKOUT时钟输出;通用定时器、实时时钟及看门狗定时器的功能是通过计数器为系统提供定时时钟和年、月、日、时、分、秒等时钟信号,以及监控系统正常运行的看门狗时钟,并能发出相应中断。     1 . 时钟发生器      1.1 时钟模式寄存器 CLKMD            时钟发生器可以从CLKIN引脚接收输入的时钟,将其变换为CPU及其外设所需要的工作时钟,工作时钟经过分频也能够通过引脚CLKOUT输出,供其他器件使用,如图1所示。时钟发生器内有一个数字锁相环(Digital Phase Lock LoopDPLL)和一个时钟模式寄存器(CLKMD)。时钟模式寄存器用于控制时钟发生器的工作状态

在时钟模式寄存器中的PLL ENABLE位控制PLL的两种工作模式 1.旁路模式(BYPASS 如果PLL ENABLE=0PLL工作于旁路模式,PLL对输入时钟信号进行分频,分频值由BYPASS DIV确定:                如果BYPASS DIV=00,输出时钟信号的频率与输入信号的频率相同,即一分频。         如果BYPASS DIV=01,输出时钟信号的频率是输入信号频率一半,即二分频。         如果BYPASS DIV=1x,输出时钟信号的频率是输入信号频率1/4,即四分频。 2.锁定模式(LOCK 如果PLL ENABLE=1PLL工作于锁定模式,输出的时钟频率由下面公式确定:          输入时钟即可乘以或者除以一个系数来获得期望的输出频率,并且输出时钟相位与输入信号锁定。   为了降低功耗,时钟发生器也有Idle模式,可以通过关闭CLKGEN Idle模块,使时钟发生器工作在Idle模式。 1.2 CLKOUT引脚 CPU时钟也可以通过一个时钟分频器提供CLKOUT信号,CLKOUT的频率由系统寄存器(SYSR)中的CLKDIV确定: 如果CLKDIV=000b CLKOUT的频率等于CPU时钟的频率。 如果CLKDIV=001b CLKOUT的频率等于CPU时钟的频率的1/2 如果CLKDIV=010b CLKOUT的频率等于CPU时钟的频率的1/3 如果CLKDIV=011b CLKOUT的频率等于CPU时钟的频率的1/4 如果CLKDIV=100b CLKOUT的频率等于CPU时钟的频率的1/5 如果CLKDIV=101b CLKOUT的频率等于CPU时钟的频率的1/6 如果CLKDIV=110b CLKOUT的频率等于CPU时钟的频率的1/7 如果CLKDIV=111b CLKOUT的频率等于CPU时钟的频率的1/8   1.3 使用方法:
通过对时钟模式寄存器的操作,可以根据需要设定时钟发生器的工作模式和输出频率,在设置过程中除了工作模式、分频值和倍频值以外,还要注意其他因素对PLL的影响。 1.省电(IDLE 为了节省功耗,可以使时钟发生器处于省电状态,当时钟发生器退出省电状态时,PLL自动切换到旁路模式,进行跟踪锁定,锁定后返回到锁定模式, 时钟模式寄存器中与省电有关的位是IAI 2DSP复位         DSP复位期间和复位之后,PLL工作于旁路模式,输出的时钟频率由CLKMD引脚上的电平确定。 如果CLKMD引脚为低电平,输出频率等于输入频率; 如果CLKMD引脚为高电平,输出频率等于输入频率的一半。 3.失锁         锁相环对输入时钟跟踪锁定之后,由于其他原因使其输出时钟发生偏移,即失锁。出现失锁现象后,PLL的动作由时钟模式寄存器中的IOB确定   调用时钟发生器库函数首先要在头文件中包含csl_pll.h文件,接下来介绍利用库函数配置时钟发生器的方法。         首先要声明PLL配置结构,具体声明如下: PLL_Config Config_PLL = { 1, /*iai 休眠后重新锁相 */ 1, /*iob 失锁后进入旁路模式并重新锁相 */ 6, /*pllmult   CLKIN * pllmult = DSP主时钟*/ 0   /*div   CLKOUT= DSP主时钟/div+1 */ };         之后运行配置函数: PLL_config&Config_PLL;         也可以通过函数设置PLL频率:        PLL_setFreq6, 1;          通过PLL_setFreq函数可以复位PLL锁相环,并改变倍频和分频数从而得到所需的频率。   1.4 时钟发生器的调试 时钟发生器所产生的DSP工作时钟,如果时钟产生器没有正常工作,DSP将无法正常运行,而调试DSP也是不可能的。         调试时钟发生器应遵循以下步骤:       1)检查DSP的时钟输入引脚CLKIN、时钟输出引脚CLKOUT和时钟模式引脚CLKMD连接是否正确,正常情况下CLKIN应接时钟源,而CLKMD应拉高或降低, CLKOUT应是信号输出引脚。       2)系统加电后测量CLKIN引脚时钟输入是否正常,信号的高低电平及占空比是否满足需要。       3)在没有进行软件设置的情况下,DSP在复位后CLKOUT的输出直接受CLKMD控制,当CLKMD为高,CLKOUT的输出频率将等于CLKIN的频率,CLKMD为低, CLKOUT输出将等于CLKIN的频率的1/2       4)如果以上步骤运行正常,则利用软件设置CLKMD寄存器,使时钟产生器工作于PLL锁相环模式下,此
C55x DSP片内有两个2通用定时器,利用定时器可向CPU产生周期性中断或向DSP片外的器件提供周期信号。其中TMS320VC5503/5507/5509/5510 DSP提供的是2个20位通用定时器. 1 结构框图 20位的定时器由两部分组成:一个4位的预定标器(PSC)和一个16位的主计数器(TIM)。 定时器有两个计数寄存器(PSCTIM)和两个周期寄存器(TDDRPRD),在定时器初始化过程中,周期寄存器的内容拷贝到计数寄存器中。
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时,TIM1,当TIM减到0,定时器向CPU送一个中断请求(TINT)或向DMA控制器发送同步事件。定时器发送中断信号或同步事件信号的频率可用下式计算:     TINT频率 = 输入时钟频率 /  (TDDR + 1) * (PRD+1)     通过设置TCR中的自动重装控制位ARB,可使定时器工作于自动重装模式,当TIM减到0,重新将周期寄存器(TDDRPRD)的内容拷贝到计数寄存器(PSCTIM)中,继续定时。 每个定时器包括4个寄存器,即定时器预定标寄存器PRSC、主计数寄存器TIM、主周期寄存器PRD和定时器控制寄存器TCR   3 使用方法 在定时器的工作过程中,要注意以下因素对定时器的影响。 1.初始化定时器 通用定时器的初始化过程如下: 1)停止计时(TSS=1),定时器装载使能(TLB=1),  并将周期寄存器(TIMPSC)的内容拷贝到计数寄存器(PRDTDDR); 2)将预定标计数周期数写入TDDR 3)将主计数器周期数装入PRD 4)关闭定时器装载(TLB=0),启动计时(TSS=0)。 2.停止/启动定时器 利用时钟控制寄存器中的TSS位可以停止或启动定时器。 TSS=1,停止计时 TSS=0,启动计时 3DSP复位 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引脚输出,通过示波器检测定时器输出是否正常。