用SDK包開發K66FX18學習筆記(2)

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);   
}

編寫中斷函數記得是無返回類型,無形參就可以了。

學習心得:多借助source insight來看代碼,真的能省去很多找函數的時間。
發佈了11 篇原創文章 · 獲贊 12 · 訪問量 2207
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章