SAM4E單片機(jī)之旅——7、LED閃爍之TC中斷
RTT主要用做一個(gè)全局的定時(shí)器,而且不太通用。現(xiàn)在嘗試使用一個(gè)更為通用的定時(shí)器進(jìn)行定時(shí):定時(shí)計(jì)數(shù)器(Timer Counter, TC)。
TC提供了廣泛的功能,主要可以分為對(duì)輸入的測(cè)量,以及波形的輸出。同樣,它可以產(chǎn)生一系列的中斷。這一次將使TC以一個(gè)固定的周期產(chǎn)生中斷,以達(dá)到定時(shí)的目的。
一、TC配置1. 在PMC中使能TC時(shí)鐘。
2.時(shí)鐘選擇。
TC的每個(gè)通道內(nèi)部都有一個(gè)32位的計(jì)數(shù)器??梢詾檫@個(gè)計(jì)數(shù)器選擇一個(gè)時(shí)鐘,使其以固定頻率步進(jìn)。為使LED的閃爍頻率較低,需要選擇較小的時(shí)鐘周期。
3.波形及中斷選擇。
當(dāng)TC工作在波形輸出模式下時(shí),可以為輸出選擇若干種波形。在這里,不需要關(guān)心具體的波形,而是要關(guān)注每個(gè)波形模式下,計(jì)數(shù)器的工作方式,以及產(chǎn)生中斷的時(shí)機(jī)。
選擇的波形如下:
在當(dāng)計(jì)數(shù)器的值和RC寄存器里的值相等時(shí),會(huì)產(chǎn)生一個(gè)觸發(fā),使計(jì)數(shù)器重置,并重新開始計(jì)數(shù)。
在輸出模式下,可以選擇在計(jì)數(shù)器的值在與RA、RB、和(或)RC相等時(shí),產(chǎn)生中斷。這里選擇與RC值相同時(shí)中斷。
4. 使能通道。
首先需要使能(enable)通道時(shí)鐘,并且需要啟動(dòng)(start)這個(gè)時(shí)鐘。可以通過訪問TC_CCR寄存器使能時(shí)鐘,同時(shí)可以產(chǎn)生一個(gè)軟觸發(fā),以啟動(dòng)時(shí)鐘。
5. NVIC中使能中斷。
該部分相關(guān)代碼如下,使用的通道是TC0的通道0,計(jì)時(shí)器頻率為MCK/128,RC值為31250,即每一秒產(chǎn)生一次中斷。
12345678910111213141516171819202122232425#define gUseTc TC0->TC_CHANNEL[0]voidConfigTC(void){PMC->PMC_PCER0 = (1 << ID_TC0);gUseTc.TC_CMR =TC_CMR_WAVE /* 波形模式 */| TC_CMR_TCCLKS_TIMER_CLOCK4 /* 時(shí)鐘4: MCK/128 */| TC_CMR_WAVSEL_UP_RC; /* 波形,僅上升,且RC比較時(shí)自動(dòng)觸發(fā) */;/* 設(shè)置 RC */gUseTc.TC_RC = TC_RC_RC(31250);/* RC 比較時(shí)產(chǎn)生中斷 */gUseTc.TC_IER = TC_IER_CPCS;/* 使能TC時(shí)鐘 */gUseTc.TC_CCR = TC_CCR_CLKEN | TC_CCR_SWTRG;/* NVIC */NVIC_DisableIRQ(TC0_IRQn);NVIC_ClearPendingIRQ(TC0_IRQn);NVIC_SetPriority(TC0_IRQn, 1);NVIC_EnableIRQ(TC0_IRQn);}1二、TC中斷服務(wù)函數(shù)
僅需改變LED引腳的電平即可。
1234567891011121314151617voidTC0_Handler(void){uint32_t status = gUseTc.TC_SR;/* 判斷中斷是否為RC比較觸發(fā)的 */if(status & TC_SR_CPCS){if((LED_PIOC->PIO_ODSR & LED_PIO)){LED_PIOC->PIO_CODR = LED_PIO;}else{LED_PIOC->PIO_SODR = LED_PIO;}}}