您的位置 首页 发布

NEC V850 之 定时器TAB (计数溢出功用)

之前说过了比较简单的TMM0,只有一个溢出功能,简单实用,今天把TAB的溢出功能说明一下。TAB是一个比较高级的定时器,有输入捕获和输出比…

前说过了比较简略的TMM0 ,只要一个溢出功用,简略有用,今日把TAB的溢出功用阐明一下。TAB是一个比较高档的守时器,有输入捕获和输出比较,他的比较溢出功用也比较有特色,这次Kiwi项目便是用了这个特色才完成了距离发送CAN信息的功用。首要TAB是能够主动重装的,别的它有2个守时器单元TAB0和TAB1,每个守时器单元有4个中止源。

守时器的运用仍是蛮简答的,首要初始化守时器,然后把守时器的使能端和屏蔽位全部都翻开,就能够运用了,由于其是主动重装守时器,在中止服务函数里边也不需求进行数值的重装。

守时的初始化有如下进程:(以TAB0为例,TAB1同TAB0)

  1. 封闭守时器一切功用的使能位以及清零相应的中止标志位,这些寄存器仍是在中止里运用xxMKn及xxIFn;
  2. 设置4个中止源的中止优先级,操作对应的寄存器xxICn;
  3. 设置中止的时钟,4个中止源共用一个时钟源,所以这个只需求设置一次,其相关寄存器为TABnCTLx;
  4. 设置4个守时器中止的计数时刻,其相关寄存器为TABnCCRx。

经过上面4步守时器就初始化好了,下面是初始化代码:


代码源自 Timer_TAB.c
void TAB0_Init(void)
{
TAB0CE = 0; /* TAB0 operation disable */
TAB0CCMK0 = 1; /* INTTAB0CC0 interrupt disable */
TAB0CCIF0 = 0; /* clear INTTAB0CC0 interrupt flag */
TAB0CCMK1 = 1; /* INTTAB0CC1 interrupt disable */
TAB0CCIF1 = 0; /* clear INTTAB0CC1 interrupt flag */
TAB0CCMK2 = 1; /* INTTAB0CC2 interrupt disable */
TAB0CCIF2 = 0; /* clear INTTAB0CC2 interrupt flag */
TAB0CCMK3 = 1; /* INTTAB0CC3 interrupt disable */
TAB0CCIF3 = 0; /* clear INTTAB0CC3 interrupt flag */
TAB0OVMK = 1; /* INTTAB0OV interrupt disable */
TAB0OVIF = 0; /* clear INTTAB0OV interrupt flag */

/* Set INTTAB0CC0 level 2 priority */
TAB0CCIC0 &= 0xF8;
TAB0CCIC0 |= 0x02;
/* Set INTTAB0CC1 level 2 priority */
TAB0CCIC1 &= 0xF8;
TAB0CCIC1 |= 0x02;
/* Set INTTAB0CC2 level 2 priority */
TAB0CCIC2 &= 0xF8;
TAB0CCIC2 |= 0x02;
/* Set INTTAB0CC3 level 2 priority */
TAB0CCIC3 &= 0xF8;
TAB0CCIC3 |= 0x02;

/* Interval timer mode setting */
TAB0CTL0 = TAB_INTERNAL_CLOCK6;
TAB0CTL1 = TAB_INTERNAL_CLOCK | TAB_MODE_INTERVAL;
TAB0CCR0 = TAB0_CCR0_VALUE;
TAB0CCR1 = TAB0_CCR1_VALUE;
TAB0CCR2 = TAB0_CCR2_VALUE;
TAB0CCR3 = TAB0_CCR3_VALUE;
}

初始化完守时器后,咱们把咱们用到的中止源给翻开就好了,这儿只运用了4个溢出中止源,下面是代码:


代码源自 Timer_TAB.c
void TAB0_Start(void)
{
TAB0CCIF0 = 0; /* clear INTTAB0CC0 interrupt flag */
TAB0CCMK0 = 0; /* INTTAB0CC0 interrupt enable */
TAB0CCIF1 = 0; /* clear INTTAB0CC1 interrupt flag */
TAB0CCMK1 = 0; /* INTTAB0CC1 interrupt enable */
TAB0CCIF2 = 0; /* clear INTTAB0CC2 interrupt flag */
TAB0CCMK2 = 0; /* INTTAB0CC2 interrupt enable */
TAB0CCIF3 = 0; /* clear INTTAB0CC3 interrupt flag */
TAB0CCMK3 = 0; /* INTTAB0CC3 interrupt enable */
TAB0CE = 1; /* TAB0 operation enable */
}
这两步操作完成后,守时器就在计数了,然后在各自计数值到后,就会进入相应的中止向量,下面是中止向量的代码,也看下:


代码源自:Timer_TAB.c

#pragma vector = INTTAB0CC0_vector
__interrupt void MD_INTTAB0CC0(void)
{/*中止向量0 服务函数*/}
#pragma vector = INTTAB0CC1_vector
__interrupt void MD_INTTAB0CC1(void)
{/*中止向量1 服务函数*/}
#pragma vector = INTTAB0CC2_vector
__interrupt void MD_INTTAB0CC2(void)
{/*中止向量2 服务函数*/}
#pragma vector = INTTAB0CC3_vector
__interrupt void MD_INTTAB0CC3(void)
{/*中止向量3 服务函数*/}
由代码可见,上面的中止向量0~3便是咱们之前说的一个守时器内有4个中止向量分别为CC0,CC1,CC2,CC3。可是这4个中止向量的联系是比较独特的。尽管它有4个中止源,可是只要CC0这个中止来的时分守时计数器才会置零从头计数,CC1~CC3中止都是进程中止,所以CC0~CC3的守时距离都是相同的,比方100ms来一次中止,CC0~CC3都是每隔100ms中止一次,他们的差异在于能够在这个守时距离内的不同的时刻点进行触发中止,如下图时刻轴所示: |________|______________|________________|________________________| 0ms 10ms(CC1) 30ms(CC2) 60ms(CC3) 100ms(CC0)(计数器溢出) 上图显现的CC1,CC2,CC3便是所谓的进程中止。然后结合到实践的运用环境来说,咱们需求的是在不同的时刻段上守时发送不同的CAN信息,这种守时方法正好适用,假如两个CAN信息发送距离都是100ms,我一个信息在第10ms发送别的一个信息在第30ms发送,这个就把整个发送进程在时刻轴上错开,也确保了每个CAN信息安稳的发送出去。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/252139.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部