CC3200的定时器可分为四组:
每组又各有A B两个子定时器
官方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);
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))
这里面又有两个宏:
因此上面那个计算公式可以这样理解:
(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);