ARM中断分析之二:裸机下面的中断处理
EINT4中斷的裸機處理
這是基于S3C2410的EINT4中斷的裸機處理,當(dāng)中斷發(fā)生時就把LED燈取反顯示。下面是電路圖。
上面是外部KEY連接到CPU的EINT4引腳上面,即:按下鍵就會產(chǎn)生一個中斷。
?
按照先前介紹的,中斷處理流程來介紹,包括:初始化中斷、處理中斷、處理完畢恢復(fù)中斷。
一、引導(dǎo)代碼
int main(void)
{
? ? EINT_init(); ? // 外部中斷初始化、中斷控制器初始化
? ? IRQEnable(); // 使能IRQ中斷 (清零CPSR寄存器的I位)
? ? while(1); ? ? ? // 等待外部中斷
}
二、初始化代碼函數(shù):EINT_init。
? ? EINT_init包括:外部中斷初始化、中斷控制器初始化。設(shè)置GPF4引腳為外部中斷EINT4功能,下降沿觸發(fā)模式,并使能中斷允許。
void EINT_init(void)
{
? ? rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 設(shè)置GPF4引腳為外部中斷EINT4功能
? ??rEXTINT0 = (0x2<<16); // 外部中斷EINT4設(shè)置為下降沿觸發(fā)
? ??VICVectAddr[4] = (uint32) IRQ_Eint4; // 中斷向量地址設(shè)置
? ??rPRIORITY = 0x00000000; // 使用默認(rèn)的固定的優(yōu)先級
? ??rINTMOD = 0x00000000; // 所有中斷均為IRQ中斷
? ??rINTMSK = ~0x0000010; // 使能EINT4中斷(第一級)
? ??rEINTMASK = ~0x0000010; // 使能第二級中斷
}
三、使能IRQ中斷函數(shù):IRQEnable。
? ? 功能是:使能IRQ中斷 (清零CPSR寄存器的I位),代碼如下:
; 開IRQ中斷
MRS R0, SPSR
BIC R0, R0, #I_BIT
MSR SPSR_c, R0
MOVS PC, LR
四、IRQ_Exception中斷異常處理程序(實現(xiàn)向量中斷處理),用戶無需改動,代碼如下:
void __irq IRQ_Exception(void) ? ? // 注意這個函數(shù)名之前的 __irq ,編譯器會有特別動作。
{
? ? void (*__Handler)(void);
? ??int irq_no;
? ??uint32 bak;
? ??// 找出當(dāng)前中斷號
? ??bak = rINTPND; // 讀取INTPND的值
? ??for(irq_no=0; irq_no<32; irq_no++)
? ??{
? ? ? ??bak = bak>>1;
? ??? ??if(bak == 0) break; // 獲得最高的優(yōu)先級
? ??}
? ??// 取得中斷服務(wù)程序地址并執(zhí)行
? ??__Handler = (void (*)(void)) VICVectAddr[irq_no];
? ??__Handler();
}
五、EINT4的中斷處理函數(shù):IRQ_Eint4。
? ? 功能:把LED1控制口輸出信號取反。
void IRQ_Eint4(void)
{
? ? // 把LED1控制口輸出信號取反
? ??// 省略...
? ??// 清除中斷標(biāo)志
? ??rEINTPEND = (1<<4); // 清除第二級的中斷標(biāo)識
? ??rSRCPND = (1<<4); // 清除第一級的中斷標(biāo)識
? ??rINTPND = rINTPND; // 清除mask過濾后的中斷標(biāo)識
}
從上面的代碼中,大約可以得出每個階段的流程:初始化時要一級一級的設(shè)置好mask,中斷服務(wù)之后要一級一級的清理中斷標(biāo)識。
總結(jié)
以上是生活随笔為你收集整理的ARM中断分析之二:裸机下面的中断处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矿难猛如虎!NVIDIA无奈 显卡价格一
- 下一篇: GetAdaptersInfo获取MAC