PIT定時器(更新中斷)
1、宏定義
#define PIT_CHANNAL kPIT_Chnl_0 //通道0
#define PIT_DELAY 500000 //500MS
#define PIT_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_BusClk)//獲取定時器時鐘源頻率
#define PIT_INTERRUPT_CHANNEL PIT0_IRQn //中斷向量號
#define PIT_INTERRUPTHANDLE PIT0_IRQHandler //中斷服務函數
用宏定義的好處就是,下次要修改中斷通道的時候,只需要修改宏定義就可以了
2、PIT初始化
void PIT_INIT(void)
{
pit_config_t config;//定義初始化句柄
CLOCK_EnableClock(kCLOCK_Pit0);//PIT時鐘初始化
config.enableRunInDebug = true;//調試時PIT正常運行
PIT_Init(PIT,&config);//初始化
PIT_SetTimerPeriod(PIT,PIT_CHANNAL,USEC_TO_COUNT(PIT_DELAY,PIT_SOURCE_CLOCK));//設置定時時間
PIT_EnableInterrupts(PIT,PIT_CHANNAL,kPIT_TimerInterruptEnable);//使能中斷
EnableIRQ(PIT_INTERRUPT_CHANNEL);//使能定時器中斷
PIT_StartTimer(PIT, PIT_CHANNAL);//開啓定時器
}
USEC_TO_COUNT是輸入要延時的時間和時鐘源頻率算出自動重裝載值
#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)((uint64_t)us * clockFreqInHz / 1000000U)
時鐘源頻率可以用CLOCK_GetFreq函數實現
CLOCK_GetFreq(kCLOCK_BusClk) //PIT掛載在BUS時鐘總線上
kPIT_TimerInterruptEnable用source insight跳進去可以看到定義,即中斷使能。
typedef enum _pit_interrupt_enable
{
kPIT_TimerInterruptEnable = PIT_TCTRL_TIE_MASK, /*!< Timer interrupt enable*/
} pit_interrupt_enable_t;
3、中斷服務函數
此中斷函數實現LED燈的翻轉
void PIT_INTERRUPTHANDLE(void)//中斷服務函數
{
PIT_ClearStatusFlags(PIT, PIT_CHANNAL, kPIT_TimerFlag);//清楚中斷標誌位
if(PIT_COUNT>50000)PIT_COUNT = 0;
PIT_COUNT++;
if(PIT_COUNT%2)GPIO_PinWrite(LED_GPIOINSTANCE,LED1,OFF);
else GPIO_PinWrite(LED_GPIOINSTANCE,LED1,ON);
}
編寫中斷函數記得是無返回類型,無形參就可以了。