介紹 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;
}