CC3200——定时器定时时间的计算

CC3200的定时器可分为四组:

每组又各有A  B两个子定时器

CC3200——定时器定时时间的计算_第1张图片

官方SDK中,interrupt例程,涉及三个定时器的定时操作,具体操作步骤如下:

1、使能并复位相应定时器

    //

    // Enable and Reset the timer blocks

    //

    MAP_PRCMPeripheralClkEnable(PRCM_TIMERA0, PRCM_RUN_MODE_CLK);

    MAP_PRCMPeripheralClkEnable(PRCM_TIMERA1, PRCM_RUN_MODE_CLK);

    MAP_PRCMPeripheralClkEnable(PRCM_TIMERA2, PRCM_RUN_MODE_CLK);

    MAP_PRCMPeripheralReset(PRCM_TIMERA0);

    MAP_PRCMPeripheralReset(PRCM_TIMERA1);

    MAP_PRCMPeripheralReset(PRCM_TIMERA2);

2、配置定时器模式,并装载初始值

MAP_TimerConfigure(TIMERA0_BASE, TIMER_CFG_ONE_SHOT);

这句是配置定时器的模式,一共有五种模式可供选择:CC3200——定时器定时时间的计算_第2张图片

MAP_TimerLoadSet(TIMERA0_BASE, TIMER_A,MICROSECONDS_TO_TICKS(SLOW_TIMER_DELAY_uS/4));

这句是装载定时器的初始值,确定到底定时多久触发中断,具体计算过程如下:

上面函数的第三个参数就是需要装载的值,他是一个带参宏:

#define MICROSECONDS_TO_TICKS(us) ((g_ulClockRate / 1000000) * (us))

可以看出他的参数是SLOW_TIMER_DELAY_uS/4

所以其实就是计算:

(g_ulClockRate / 1000000) * (SLOW_TIMER_DELAY_uS/4))

这里面又有两个宏:

CC3200——定时器定时时间的计算_第3张图片

因此上面那个计算公式可以这样理解:

 

(1)系统的主频是80M,他先除以1M,等于80,可以表示系统在1us内能计80个数。

(2)后面乘(2000/4)=500,因此定时器的溢出值为80*500 = 40000,而40000/80M = 0.5ms = 500us。

其实那个500*80也可以理解为重复500次1us。

因此这里定时是500us。

 

3、定时器设置完成后,要为后面定时器溢出时注册一个中断函数

    //

    // Hook our interrupt handlers

    //注册定时器中断函数

    MAP_TimerIntRegister(TIMERA0_BASE, TIMER_A, TimerA0IntHandler);

    MAP_TimerIntRegister(TIMERA1_BASE, TIMER_A, TimerA1IntHandler);

    MAP_TimerIntRegister(TIMERA2_BASE, TIMER_A, TimerA2IntHandler);

    其实这个时候就已经可以编写定时器中断函数了,中断函数的名字就是刚刚注册的那个名字。

 

4、设置中断优先级并且清除之前的定时中断标志

  //

    // Set the appropriate interrupt priorities.

    //

    MAP_IntPriorityGroupingSet(ulPriBits);

    MAP_IntPrioritySet(INT_TIMERA0A, ucPriorityA0);

    MAP_IntPrioritySet(INT_TIMERA1A, ucPriorityA1);

    MAP_IntPrioritySet(INT_TIMERA2A, ucPriorityA2);

   

    //

    // Clear any pending timer interrupts

    //

    ulStatus = MAP_TimerIntStatus(TIMERA0_BASE, false);

    MAP_TimerIntClear(TIMERA0_BASE, ulStatus);

    ulStatus = MAP_TimerIntStatus(TIMERA1_BASE, false);

    MAP_TimerIntClear(TIMERA1_BASE, ulStatus);

    ulStatus = MAP_TimerIntStatus(TIMERA2_BASE, false);

    MAP_TimerIntClear(TIMERA2_BASE, ulStatus);

5、使能定时器中断允许,当定时器溢出时跳到中断函数

    //

    // Enable three timer interrupts

    //

    MAP_TimerIntEnable(TIMERA0_BASE, TIMER_TIMA_TIMEOUT);

    MAP_TimerIntEnable(TIMERA1_BASE, TIMER_TIMA_TIMEOUT);

    MAP_TimerIntEnable(TIMERA2_BASE, TIMER_TIMA_TIMEOUT);

6、最后使能定时器,开始计时

    //

    // Enable Timer A0

    //

    MAP_TimerEnable(TIMERA0_BASE, TIMER_A);

 

你可能感兴趣的:(毕业设计——CC3200)