“简简单单DSP”系列学习活动———通用定时器

2019-07-15 16:06发布

通用定时器

事件管理器(EV)强大的功能使它特别适用于运动控制和电机控制领域。DSP有两个相同的事件管理器EVAEVB。每个事件管理器模块包括通用定时器CP、全比较单元、可编程的死区发生器,PWM波形发生器、捕获单元CAP和和正交编码单元,A/D转换器的外部启动信号,功率驱动保护单元、EV寄存器以及EV中断等多个部分。每一个EV还包含两路单独的PWM输出。
       事件管理器的接口框图下图所示:



从图中我们可以看出,每一个事件管理器模块都包含有:两个通用定时器、3个比较单元、三个捕获单元、一个正交编码电路,还可以有外部时钟、外部触发功率保护模块等。常用的就是通用定时器、全比较PWM单元、和输入捕获单元,下面重点介绍这三个单元。
一、
通用定时器CP
1、通用定时器有四个中断:
A、
通用定时器1上溢中断
B、
通用定时器下溢中断
C、
通用定时器比较中断
D、通用定时器周期中断
这四个中断标志位在EVA中断标志寄存器AEVAIFRA)中,这四个中断的使能位在EVA屏蔽寄存器EVAIMRA中设置。
2、通用定时器有三个16位的和定时比较有关的寄存器:
A、
通用定时器计数寄存器TXCNT
B、

通用定时器周期寄存器TxPR
C、
通用定时器比较寄存器TXCMPR
通用定时器计数寄存器TxCNT根据通用定时器的时钟和计数模式开始计数,不停的和周期寄存器和比较寄存器从而产生中断或者各种事件。
当工作在定时器的模式时,TxCNT得值和TxPR中设置的值比较,当比较匹配后的一个时钟后,产生相应的事件
当工作在比较的模式时,TxCNT得值和TxCMPR中设置的值比较,当比较匹配后的一个时钟后,产生相应的比较事件
TxPRTxCMPR都是带有影子寄存器的,在一个周期的任何时刻都可以对这两个寄存器进行读写,读写的是他们的影子寄存器。对于TxCMPR,只有当TxCON寄存器指定的特定条件满足时,影子寄存器中的值才加载到比较寄存器中;对于周期寄存器,只有当计数寄存器为0时,影子寄存器的值才能重新加载到周期寄存器。
3、通用定时器的计数模式
       通用定时器有四种计数模式
A、
停止/保持吧、模式(TxCON.TMODE1~TMODE0=00
B、
连续增计数模式(TxCON.TMODE1~TMODE0=01
C、
定向增/减计数模式(有外部引脚决定,xCON.TMODE1~TMODE0=11
D、连续增减计数模式(TxCON.TMODE1~TMODE0=10
通过定时器控制寄存器TxCON12~11位决定,
4、时钟
       可以是外部时钟也可以是内部时钟,一般用内部时钟,内部时钟是HSPCLK经过预分频后得到的。由TxCON5~4位决定,TxCONTCLKS1~TCLKS0=00选择内部时钟;预分频由TxCON10~8位决定,CLK=HSPCLK/2TxCONTPS2~TPS0次方。
5、工作在周期匹配下
       这里用到的中断是通用定时器周期中断,需要设置的有以下内容:
(1)
通用定时器1的时钟,包括选择内部还是外部时钟以及与分频系数
在设置这个之前要保证EVA的时钟开启;


SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;// EVA
的时钟开启
EvaRegs.T1CON.bit.TCLKS10=0;//选择内部时钟EvaRegs.T1CON.bit.TPS=3;//预分频8倍,如果HSPCLK=150M,那么通用定时器时钟频率是150/8M.2)计数工作模式选择EvaRegs.T1CON.bit.TMODE=2;//连续增计数模式(3)通用定时器1的计数器和周期寄存器的
通用定时器的完整周期是TxPR+1个时钟周期,如果初始化的时候TxCNT=0的话那么从第一个周期就是一个完整的周期,所以一般初始化的时候设置TxCNT=0
EvaRegs.T1CNT=0x0000;EvaRegs.T1PR = 0xFFFF;
//
周寄存器的值最大为65535
4)通用定时器1周期匹配中断配置EvaRegs.EVAIFRA.bit.T1PINT=1;//周期中断标志位清0EvaRegs.EVAIMRA.bit.T1PINT=1;//周期中断使能5通用定时器1使能
EvaRegs.T1CON.bit.TENABLE=1;//使能定时器16PIE级中断使能
PieCtrlRegs.PIEIER2.bit.INTx4 = 1;//周期匹配中断时INT2.4
(7)使能CPU级中断
IER |= M_INT2;
EINT;
//
开全局中断
ERTM;
//
仿真中断
6、中断函数处理
interrupt void T1PINT_ISR(void)
// EV-A

{

USER
……
EvaRegs.EVAIFRA.bit.T1PINT=1;//外设级中断标志位清0PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
// Acknowledge interrupt to PIE

}

0条回答

一周热门 更多>