dsp定时器
第2章 CPU定时器0的驱动
F28x 有3 个32 位的CPU 定时器(TIMER0/1/2),这些定时器具有完全相同的控制结构,如图2.1 所示。其中,CPU 定时器1 及CPU 定时器2 被保留,用做DSP BIOS 或者其他的实时操作系统(RTOS),CPU 定时器0 可供用户使用。
2.1 定时器基本概念
2.1.1 定时器时钟和时钟源
1)定时器时钟
从图2.1 可以看出,当TSS(TIMERxTCR[4])=0 时,CPU 定时器以系统时钟SYSCLKOUT 作为时钟源,此时,预定标计数器(PSCH:PSC)以装载的分频值(TDDRH:TDDR)为基数,对每一个时钟源周期开始减计数。预定标计数器(PSCH:PSC)从分频值(TDDRH:TDDR)减减至0 时,称为一个定时器周期(定时器时钟),其表达式如式(2.1)。
 
 
定时器周期的倒数为定时器时钟频率,其表达式如式(2.2)所示。
 
其中,0 (TDDRH:TDDR) 65 535。
预定标计数器(PSCH:PSC)减至0 时,重新装入定时器分频值(TDDRH:TDDR),且计数器(TIMH:TIM)以装载的周期值(PRDH:PRD)为基数,对每一个定时器时钟周期减1 计数;当计数器(TIMH:TIM)减至0 时,定时器周期值(PRDH:PRD)重新装入计数器(TIMH:TIM)并请求一个TINT中断。
 
图2.1 CPU 定时器

2)定时器时钟源
系统时钟(SYSCLKOUT)与外接晶振频率(OSCCLK)之间的关系受锁相环控制寄存器PLLCR[3:0](即DIV) 的控制,其关系式如式(2.3)所示。其中:
(1)PLL 禁止与否,是通过上电复位期间采样GPIOF14(XPLLDIS)引脚电平来决定的。在上电复位之前,若把GPIOF14 强置为低电平(默认状态下GPIOF14 =1),则PLL 禁止;否则PLL 使能(参见图2.2)。
(2)在PLL 使能的条件下(GPIOF14 =1),当DIV=0 时,称为PLL 旁路。
(3)在PLL 使能的条件下(GPIOF14 =1),当DIV≠0 时,称为PLL 使能。此时DIV整数值允许范围为1 DIV 10。尽管在理论上DIV 最大值可达1111b,但是大于10 的值都予以保留。在DIV=10 时,外部晶振最大只能选择30 MHz。由此可以算出SYSCLKOUT=150 MHz。
 
图2.2 明晰地表述了系统时钟的来源。由振荡器及锁相环产生的送至CPU 的CLKIN时钟,通过CPU 之后直接成为系统输出时钟(SYSCLKOUT),同时作为外设的时钟源,即SYSCLKOUT =CLKIN。
 
怎么做
 
图2.2 振荡器及锁相环模块
2.1.2 定时器寄存器
1.定时器寄存器简介
1)计数寄存器(TIMERxTIM)(其中,x=0,1,2,下同)
32 位计数寄存器(TIMH:TIM)中,TIM 为计数寄存器低16 位,TIMH 为计数寄存器高16 位。每一个定时器时钟周期(TDDRH:TDDR+1)/ SYSCLKOUT,TIM 减1,其中,(TDDRH:TDDR)是定时器预定标分频值。当(TIMH:TIM)减到0 时,(TIMH:TIM)重装定时器周期值(PRDH: PRD),同时产生定时器中断TINT。
2)周期寄存器(TIMERxPRD)
32 位周期寄存器(PRDH:PRD)中,PRD 为周期寄存器低16 位,PRDH 为周期寄存器高16 位。当(TIMH:TIM)减到0 时,在下一个定时器输入时钟周期开始时,(TIMH:TIM)将重装(PRDH:PRD)的周期值;或者当定时器控制寄存器(TCR)的TRB 置位时,(PRDH:PRD)的周期值也装入(TIMH:TIM)。
3)定时器分频寄存器(TDDRH:TDDR)
16 位分频寄存器(TDDRH:TDDR)中,TDDR 为分频寄存器低8 位,TDDRH 为分频寄存器高8 位。每过一个定时器时钟周期,定时器计数器寄存器(TIMH:TIM)减1。当预定标器计数器(PSCH:PSC)减到0,一个系统时钟周期后,(TDDRH:TDDR)的值重装(PSCH:PSC),同时(TIMH:TIM)减1。无论何时,用软件置定时器重装位(TRB)为
1,(TDDRH:TDDR)重装(PSCH:PSC)。
4)预定标计数器低位及高位寄存器(TIMERxTPR,TIMERxTPRH)
定时器预定标计数器低位及高位寄存器结构及位域定义见图2.3 及图2.4,它由16位分频寄存器(TDDRH:TDDR)和16 位预定标器计数器(PSCH:PSC)组合而成。
 
照片怎么拼图合成一张
 
5)控制寄存器(TIMERxTCR)
TCR 是一个16 位的寄存器,为了便于讨论和查阅,将其位域定义标注在图2.5 中。
 
怎样添加空间背景音乐
6)定时器预定标计数器(PSCH:PSC)
16 位预定标计数器(PSCH:PSC)中,PSC 为预定标计数器低8 位,PSCH 为预定标计数器高8 位。对每一个系统时钟周期,(PSCH:PSC)减1,(PSCH:PSC)从分频值减到0 为一个定时器时钟周期,减到0 时(TDDRH:TDDR)装入(PSCH:PSC),且(TIMH:TIM)减1。无论何时,用软件置定时器重装位(TRB)为1,也重装(PSCH:PSC)。
该计数器可读,但不可直接设置,复位值为0。
2.CPU 定时器列表
CPU 定时器0/1/2 的配置和控制寄存器列表如表2.1 所示。
表2.1 CPU 定时器0/1/2 的配置和控制寄存器
 
2.1.3 控制定时器速率的几个因素
1)定时器时钟
定时器时钟源即为系统时钟SYSCLKOUT,改变系统时钟SYSCLKOUT 可控制定时器速率。
2)定时器周期值的设置
定时器周期寄存器(PRDH:PRD)的周期值用于重装定时器计数器(TIMH:TIM)。周期值的大小决定了(TIMH:TIM)减1~0 的快慢。
3)定时器分频器值的设置
定时器分频器(TDDRH:TDDR)的值起到了对系统时钟分频的作用。当(TDDRH:TDDR)=0 时,定时器时钟源时钟直接采用系统时钟,不分频,否则分频为:定时器时钟=SYSCLKOUT/((TDDRH:TDDR)+1),参见式(2.2)。
2.1.4 启动定时器0 步骤
在通过InitCpuTimers()函数对定时器0 进行初始化(默认状态)之后,按ConfigCpuTimer 函数中的步骤进行。
1)CPU 定时器0 时钟配置
CPU 定时器的时钟源与系统时钟SYSCLKOUT 同步。因此,对定时器时钟源的配置实际上就是对系统时钟SYSCLKOUT 的配置。具体配置可参见DSP281x_ SysCtrl.c 文件中的InitPll()函数及式(2.3)。
2)设置定时器分频值
通过ConfigCpuTimer 函数中下面的指令设置分频值(TDDRH:TDDR)。
1. CpuTimer0Regs.TPR.all = 0x0080梦见山崩地裂; //TDDR = 0x 0080 
2. CpuTimer0Regs.TPRH.all = 0x0000; //TDDRH0x 0000 
以上两个值的低8 位构成一个16 位分频值(TDDRH:TDDR)。根据式(2.2)的计算可得到定时器时钟。
3)周期寄存器(PRDH:PRD)的设置
这个可通过对ConfigCpuTimer函数中后两个形参float Freq及 float Period的设置完成。注意:这里Freq 及Period 并不表示定时器频率及周期,实际定义是两参数的乘积才是定时器0 的周期。
4)使能定时器中断
由于本例采用的是定时器0 中断,因此,在ConfigCpuTimer 函数中必须添加一条使能定时器中断的指令:
1. Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断 
主程序中通过以下4 条指令进行相应的中断配置,详细说明参见主程序。
1. IER |= M_INT1; //使能连接 CPU-Timer 0 的INT1 中断 
2. PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能PIE 中的TINT0,1 组第7 个中断 
3. EINT; //使能全局中断 
4. ERTM; //使能实时中断 
之后,计数器(TIMH:TIM)以每一个定时器时钟周期递减,当(TIMH:TIM)减到0 时,就会发生一个定时器中断请求。
5)启动CPU 定时器0
该步骤通过ConfigCpuTimer 函数中的如下指令完成:
1. StartCpuTimer0();//等价于指令:CpuTimer0Regs.TCR.bit.TSS = 0,立即启动 
2. CPU 定时器0 
2.2 定时器0 中断设置
定时器0 中断设置由以下几个步骤组成。
1)定时器0 中断的基本条件
除了对周期寄存器(PRDH:PRD)及定时器分频器(TPRH:TPR)进行必要的设置之外,
使能定时器0 中断有两条必须的指令:
1. CpuTimer0Regs.TCR.bit.TSS = 0; //启动定时器 
2. Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断 
如果缺少上面两条指令中的一条,将不会产生中断。
2)确定中断向量的入口地址
主程序通过“DSP281x_PieVect.c”文件中的InitPieVectTable()函数,已经为PIE 向量表中的所有中断向量配置了对应向量的入口地址。如果针对某一个外设中断专门有一个中断服务程序,则这个中断服务程序的入口地址必须取代前面配置的入口地址,它由下面的指令完成:
1. EALLOW; //允许访问受保护的寄存器 
常见的收集数据的方法有
2. PieVectTable.TINT0 = &cpu_timer0_isr; //取cpu_timer0_isr 地址赋值给  白凤九和东华帝君
3. //TINT0中断向量 
4. EDIS; //禁止访问受保护的寄存器 
上面指令中,cpu_timer0_isr()函数是针对TINT0 中断向量的一个中断服务程序,&cpu_timer0_isr 是该程序的入口地址。
3)使能PIE 级及CPU 级中断向量

这个步骤由下面4 类指令完成:
先出中断向量在PIE 向量表中所在的组及在这组中所处的优先级。经查TINT0是第1 组第7 个中断,因此先通过PIE 级指令“PieCtrlRegs.PIEIER1.bit.INTx7 =1;”,使能PIE 第1 组第7 个TINT0 中断(INTx7 由头文件定义为PIE 中断使能寄存器(PIEIER)的第7 位)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。