LPC2000系列的向量中斷控制器(VIC)
非向量IRQ具有最低優(yōu)先級。一般也只分配一個中斷源。
VIC中斷設(shè)置步驟:
在主程序中:
1、設(shè)置VICIntSelect
相應(yīng)位為1是FIQ,為0是IRQ。
例如:VICIntSelect = 0x00000000,設(shè)置所有中斷都是IRQ
2、設(shè)置VICVectCntlx(僅對于IRQ,F(xiàn)IQ不需要此設(shè)置)
例如:VICVectCntl0 = 0x20 | 15,設(shè)置EINT1為向量中斷,使用Slot0。其中0x20是因?yàn)閂ICVectCntlx寄存器第六位是使能,15是通過查周立功那本書P208頁的表得到的EINT1的VIC通道號。
3、設(shè)置VICVectAddrx(僅對于IRQ,F(xiàn)IQ不需要此設(shè)置)
當(dāng)有IRQ中斷產(chǎn)生時,VIC將會根據(jù)中斷源設(shè)置VICVectAddr寄存器為相應(yīng)中斷服務(wù)程序的地址,切換處理器工作模式為IRQ模式,并跳轉(zhuǎn)到IRQ中斷入口0x00000018處;
異常中斷向量表中0x00000018處使用“LDR PC, [PC, #-0xFF0]”,使得程序跳轉(zhuǎn)到(0x00000018+8-0x00000FF0=0xFFFFF030)存儲器處保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是說:通過該指令,程序跳轉(zhuǎn)到VICVectAddr寄存器所指向的中斷服務(wù)程序的地址。
例如:VICVectAddr0 = (uint32)EINT1_Exception,設(shè)置EINT1中斷地址。EINT1一般是中斷服務(wù)程序函數(shù)名即服務(wù)中斷服務(wù)程序的首地址,前面要用(uint32)強(qiáng)制類型轉(zhuǎn)換。
4、設(shè)置VICDefVectAddr(當(dāng)都設(shè)置為向量IRQ時可以沒有這個)
若是非向量IRQ中斷,VIC提供默認(rèn)服務(wù)程序地址VICDefVectAddr,IRQ中斷入口程序可通過讀取VIC的向量地址寄存器VICVectAddr來取得該地址,然后跳轉(zhuǎn)到相應(yīng)服務(wù)程序繼續(xù)執(zhí)行。該默認(rèn)服務(wù)程序由所有非向量IRQ公用,默認(rèn)服務(wù)程序可讀取IRQ狀態(tài)寄存器以確定哪個IRQ被激活。
例如:VICDefVectAddr = (uint32)Default_Entry,設(shè)置非向量中斷地址。如果在管理向量中斷的VICVectCntl0~15和VICVectAddr0~15中沒有設(shè)置某一個中斷EINTx則此EINTx中斷發(fā)生時,要進(jìn)入非向量中斷處理程序Default_Entry。
5、設(shè)置VICIntEnable使能
例如:VICIntEnable = 0x00018000,使能EINT1和EINT2。因?yàn)镋INT1和EINT2的VIC通道號分別為15和16,所以15和16兩位置一將EINT1和EINT2使能。
在中斷服務(wù)程序中:
1、中斷處理程序。用戶自己編寫的實(shí)現(xiàn)某種功能的中斷程序
2、清除相應(yīng)的中斷標(biāo)志,以響應(yīng)下一次中斷,并切換處理器工作模式。建議用__irq關(guān)鍵字定義中斷服務(wù)程序,這樣的話,該函數(shù)將自動切換處理器工作模式,但該函數(shù)不能返回參數(shù)或者數(shù)值。
3、退出中斷前,一定要對VICVectAddr寄存器寫0,通知VIC中斷結(jié)束
具體FIQ、向量IRQ和非向量IRQ的具體設(shè)置步驟不完全相同
1、快速中斷FIQ
⑴在主程序中:
1、在VICIntSelect中將中斷分配為FIQ中斷;
2、在VICIntEnable中使能外設(shè)中斷。
⑵中斷服務(wù)程序中:
1、中斷處理程序;
2、清除相應(yīng)的中斷標(biāo)志,以響應(yīng)下一次中斷。
2、向量IRQ
⑴主程序
1、在VICIntSelect中將中斷分配為IRQ中斷;
2、在VICVectCntlx中分配中斷通道(優(yōu)先級);
3、在VICVectAddrx中設(shè)置中斷服務(wù)程序的地址;
4、通過VICIntEnable使能外設(shè)中斷。
⑵中斷服務(wù)程序
1、中斷處理;
2、清除相應(yīng)的中斷標(biāo)志,以響應(yīng)下一次中斷;
3、對VICVectAddr寄存器執(zhí)行寫操作(通常為0x00),結(jié)束向量中斷。
3、非向量IRQ
⑴主程序
1、在VICDefVectAddr中設(shè)置中斷服務(wù)程序的地址;
2、通過VICIntEnable使能外設(shè)中斷。
⑵中斷服務(wù)程序
1、中斷處理;
2、清除相應(yīng)的中斷標(biāo)志,以響應(yīng)下一次中斷;
3、對VICVectAddr寄存器執(zhí)行寫操作(通常為0x00),結(jié)束向量中斷。
評論