介绍 2016定时器设置和计算的方法:
1.定时器采用减一的计数方式,减到0X00时触发中断标志。
2.定时器溢出后会自动重载装载值。
3.定时器计算方法 以8M晶振为例
1>没有使用预分频,则每经过1/8000000秒则计数值减1;
2>使用100预分频,则每经过(1/8000000)*100秒计数值减1,如需要定时500ms,则装载值=0.5/((1/8000000)*100)=0.5*80000=40000。
4.进入中断后软件清除中断标志位
#define TIMER_125MS 10000UL //定时器125MS 装载值
#define TIMER_250MS 20000UL //定时器250MS 装载值
#define TIMER_500MS 40000UL //定时器500MS 装载值
/*********************************************************************************************************
** Function name: timer0Init
** Descriptions: Timer0的初始化函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
** Created By: siw
** Created date: 2009.12.28
*********************************************************************************************************/
void timer0Init( void )
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // 使能定时器模块
TimerDisable(TIMER0_BASE, TIMER_A);
TimerDisable(TIMER0_BASE, TIMER_B);
TimerConfigure( TIMER0_BASE ,TIMER_CFG_16_BIT_PAIR | TIMER_CFG_B_PERIODIC | TIMER_CFG_A_PERIODIC); //设置两个定时器为16位
TimerControlStall(TIMER0_BASE, TIMER_A, true); //设置进入调试模式时,停止计数
TimerControlStall(TIMER0_BASE, TIMER_B, true); //设置进入调试模式时,停止计数
TimerPrescaleSet(TIMER0_BASE , TIMER_A , 99); //预先进行100分频
TimerPrescaleSet(TIMER0_BASE , TIMER_B , 99); //预先进行100分频
TimerLoadSet(TIMER0_BASE , TIMER_A , TIMER_125MS); //125MS中断一次
TimerLoadSet(TIMER0_BASE , TIMER_B , TIMER_500MS); //500MS中断一次
TimerIntEnable(TIMER0_BASE , TIMER_TIMA_TIMEOUT);// 使能TimerA超时中断
TimerIntEnable(TIMER0_BASE , TIMER_TIMB_TIMEOUT);// 使能TimerB超时中断
IntEnable(INT_TIMER0A); // 使能TimerA中断
IntEnable(INT_TIMER0B); // 使能TimerB中断
IntMasterEnable(); // 使能处理器中断
TimerEnable(TIMER0_BASE , TIMER_A);
TimerEnable(TIMER0_BASE , TIMER_B);
}
/*********************************************************************************************************
** Function name: Timer0A_ISR
** Descriptions: Timer0_A定时器中断服务程序 125MS中断一次
** input parameters: 无
** output parameters: 无
** Returned value: 无
** Created By: siw
** Created date: 2009.12.28
*********************************************************************************************************/
void Timer0A_ISR(void)
{
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
//清除定时器中断源,在进入中断后要清除中断标志,否则会不断的进入中断。
timer0ATrick++;
ClkFlagA = BIT0;
}