嵌入式導(dǎo)論實驗報告Guo-Lab4
TM4C123GXL Performance
實驗題目
熟悉實驗環(huán)境和實驗工具
熟練使用C語言和GPOI的定義和改變
掌握時鐘分頻和中斷
實驗?zāi)康?/strong>
搭建實驗環(huán)境—Code Compose Studio,熟悉開發(fā)板EK-TM4C123GXL
掌握時鐘分頻和中斷
實驗要求
使系統(tǒng)中斷高于自定義中斷函數(shù)
使系統(tǒng)中斷低于自定義中斷函數(shù)
板級運行程序,實現(xiàn)時鐘分頻
實驗過程
- 使系統(tǒng)中斷高于自定義中斷函數(shù)&使系統(tǒng)中斷低于自定義中斷函數(shù)
系統(tǒng)優(yōu)先級
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x60000000; //priority 2
函數(shù)優(yōu)先級
NVIC_PRI4_R = (NVIC_PRI4_R&0x00FFFFFF)|0x40000000; // 8) priority 3
使用波形觀察當(dāng)中斷同時發(fā)生時,優(yōu)先級不同會發(fā)生什么。
系統(tǒng)中斷的優(yōu)先級比較高時:
由于兩者的頻率有所差別,所以經(jīng)過一定時間后會發(fā)生嵌套中斷,此時由于系統(tǒng)中斷的優(yōu)先級比較高,所以函數(shù)的中斷被掛起,直到系統(tǒng)中斷執(zhí)行完之后才繼續(xù)執(zhí)行。
函數(shù)中斷的優(yōu)先級比較高時:
由于優(yōu)先級的調(diào)整,系統(tǒng)中斷的優(yōu)先級變低,發(fā)生嵌套中斷時,系統(tǒng)中斷被掛起。
// **************SysTick_Init*********************
// Initialize SysTick periodic interrupts
// Input: interrupt period
// Units of period are 20ns (assuming 50 MHz clock)
// Maximum is 2^24-1
// Minimum is determined by length of ISR
// Output: none
volatile uint32_t Counts;
void SysTick_Init(uint32_t period){
Counts = 0;
NVIC_ST_CTRL_R = 0; // disable SysTick during setup
NVIC_ST_RELOAD_R = period - 1; // reload value
NVIC_ST_CURRENT_R = 0; // any write to current clears it
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x60000000; //priority 2
NVIC_ST_CTRL_R = 0x00000007; // enable with core clock and interrupts
}
// ***************** Timer0A_Init ****************
// Activate Timer0A interrupts to run user task periodically
// Inputs: task is a pointer to a user function
// period in usec
// Outputs: none
void Timer0A_Init(unsigned short period){ volatile uint32_t delay;
SYSCTL_RCGCTIMER_R |= 0x01; // 0) activate timer0
delay = SYSCTL_RCGCTIMER_R; // allow time to finish activating
TIMER0_CTL_R &= ~0x00000001; // 1) disable timer0A during setup
TIMER0_CFG_R = 0x00000004; // 2) configure for 16-bit timer mode
TIMER0_TAMR_R = 0x00000002; // 3) configure for periodic mode
TIMER0_TAILR_R = period - 1; // 4) reload value
TIMER0_TAPR_R = 199; // 5) 1us timer0A
TIMER0_ICR_R = 0x00000001; // 6) clear timer0A timeout flag
TIMER0_IMR_R |= 0x00000001; // 7) arm timeout interrupt
NVIC_PRI4_R = (NVIC_PRI4_R&0x00FFFFFF)|0x40000000; // 8) priority 3
NVIC_EN0_R = NVIC_EN0_INT19; // 9) enable interrupt 19 in NVIC
TIMER0_CTL_R |= 0x00000001; // 10) enable timer0A
}
- 板級運行程序,實現(xiàn)時鐘分頻
void Timer0A_Handler(void){
PF2 ^= 0x04;//藍(lán)燈閃爍
TIMER0_ICR_R = TIMER_ICR_TATOCINT;// acknowledge timer0A timeout
}
void SysTick_Handler(void){
PF3 = 0x08; //綠燈閃爍
Counts = Counts + 1;
if(Counts==10){ //延時
PF3 ^= 0x08;
Counts=0;
}
}
int main(void){
DisableInterrupts();
PLL_Init(); // configure for 50 MHz clock
SYSCTL_RCGCGPIO_R |= 0x20; // activate port F
while((SYSCTL_PRGPIO_R&0x20)==0){};
GPIO_PORTF_DIR_R |= 0x0E; // make PF3-1 output (PF3-1 built-in LEDs)
GPIO_PORTF_AFSEL_R &= ~0x0E; // disable alt funct on PF3-1
GPIO_PORTF_DEN_R |= 0x0E; // enable digital I/O on PF3-1
// configure PF3-1 as GPIO
GPIO_PORTF_PCTL_R = (GPIO_PORTF_PCTL_R&0xFFFF000F)+0x00000000;
GPIO_PORTF_AMSEL_R = 0; // disable analog functionality on PF
Timer0A_Init(50000); // 200 kHz 5Hz
SysTick_Init(500000); // 164 kHz 100Hz
EnableInterrupts();
while(1){
}
}
實驗總結(jié)
許多功能都是通過中斷實現(xiàn)的。中斷系統(tǒng)是計算機的重要組成部分。實時控制、故障自動處理、計算機與外圍設(shè)備間的數(shù)據(jù)傳送往往采用中斷系統(tǒng)。中斷系統(tǒng)的應(yīng)用大大提高了計算機效率。
不同的計算機其硬件結(jié)構(gòu)和軟件指令是不完全相同的,因此,中斷系統(tǒng)也是不相同的。計算機的中斷系統(tǒng)能夠加強CPU對多任務(wù)事件的處理能力。中斷機制是現(xiàn)代計算機系統(tǒng)中的基礎(chǔ)設(shè)施之一,它在系統(tǒng)中起著通信網(wǎng)絡(luò)作用,以協(xié)調(diào)系統(tǒng)對各種外部事件的響應(yīng)和處理。中斷是實現(xiàn)多道程序設(shè)計的必要條件。 中斷是CPU對系統(tǒng)發(fā)生的某個事件作出的一種反應(yīng)。 引起中斷的事件稱為中斷源。中斷源向CPU提出處理的請求稱為中斷請求。發(fā)生中斷時被打斷程序的暫停點成為斷點。CPU暫停現(xiàn)行程序而轉(zhuǎn)為響應(yīng)中斷請求的過程稱為中斷響應(yīng)。處理中斷源的程序稱為中斷處理程序。CPU執(zhí)行有關(guān)的中斷處理程序稱為中斷處理。而返回斷點的過程稱為中斷返回。中斷的實現(xiàn)實行軟件和硬件綜合完成,硬件部分叫做硬件裝置,軟件部分成為軟件處理程序。
中斷系統(tǒng)的功能
1)實現(xiàn)中斷響應(yīng)和中斷返回
當(dāng)CPU收到中斷請求后,能根據(jù)具體情況決定是否響應(yīng)中斷,如果CPU沒有更急、更重要的工作,則在執(zhí)行完當(dāng)前指令后響應(yīng)這一中斷請求。CPU中斷響應(yīng)過程如下:首先,將斷點處的PC值(即下一條應(yīng)執(zhí)行指令的地址)推入堆棧保留下來,這稱為保護斷點,由硬件自動執(zhí)行。然后,將有關(guān)的寄存器內(nèi)容和標(biāo)志位狀態(tài)推入堆棧保留下來,這稱為保護現(xiàn)場,由用戶自己編程完成。保護斷點和現(xiàn)場后即可執(zhí)行中斷服務(wù)程序,執(zhí)行完畢,CPU由中斷服務(wù)程序返回主程序,中斷返回過程如下:首先恢復(fù)原保留寄存器的內(nèi)容和標(biāo)志位的狀態(tài),這稱為恢復(fù)現(xiàn)場,由用戶編程完成。然后,再加返回指令RETI,RETI指令的功能是恢復(fù)PC值,使CPU返回斷點,這稱為恢復(fù)斷點。恢復(fù)現(xiàn)場和斷點后,CPU將繼續(xù)執(zhí)行原主程序,中斷響應(yīng)過程到此為止。
2)實現(xiàn)優(yōu)先權(quán)排隊
通常,系統(tǒng)中有多個中斷源,當(dāng)有多個中斷源同時發(fā)出中斷請求時,要求計算機能確定哪個中斷更緊迫,以便首先響應(yīng)。為此,計算機給每個中斷源規(guī)定了優(yōu)先級別,稱為優(yōu)先權(quán)。這樣,當(dāng)多個中斷源同時發(fā)出中斷請求時,優(yōu)先權(quán)高的中斷能先被響應(yīng),只有優(yōu)先權(quán)高的中斷處理結(jié)束后才能響應(yīng)優(yōu)先權(quán)低的中斷。計算機按中斷源優(yōu)先權(quán)高低逐次響應(yīng)的過程稱優(yōu)先權(quán)排隊,這個過程可通過硬件電路來實現(xiàn),亦可通過軟件查詢來實現(xiàn)。
3)實現(xiàn)中斷嵌套
當(dāng)CPU響應(yīng)某一中斷時,若有優(yōu)先權(quán)高的中斷源發(fā)出中斷請求,則CPU能中斷正在進行的中斷服務(wù)程序,并保留這個程序的斷點(類似于子程序嵌套),響應(yīng)高級中斷,高級中斷處理結(jié)束以后,再繼續(xù)進行被中斷的中斷服務(wù)程序,這個過程稱為中斷嵌套。如果發(fā)出新的中斷請求的中斷源的優(yōu)先權(quán)級別與正在處理的中斷源同級或更低時,CPU不會響應(yīng)這個中斷請求,直至正在處理的中斷服務(wù)程序執(zhí)行完以后才能去處理新的中斷請求。