新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > LPC2000系列的向量中斷控制器(VIC)

LPC2000系列的向量中斷控制器(VIC)

作者: 時間:2016-11-23 來源:網(wǎng)絡 收藏
LPC2000系列向量中斷控制器VIC)支持32個中斷請求輸入,也即是支持32個中斷源。這32個中斷按順序稱為VIC通道0,VIC通道1,…,VIC通道31(實際上只使用了18個其他的預留)

每一個VIC通道都支持軟件中斷與硬件中斷,即每個中斷均可由軟件或硬件中斷產生,軟件中斷與對應通道上的硬件中斷是邏輯“或”的關系。軟件中斷可通過置位VICSoftInt寄存器相應位來產生,也可通過置位VICSoftIntClear寄存器相應位來清除。

本文引用地址:http://m.butianyuan.cn/article/201611/320202.htm

LPC2000具有3類中斷:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通過對VICIntSelect和VICVectCntlx(x=0,1,…,15)這兩類寄存器的設置,將以上的32個中斷源設置為FIQ和IRQ中斷的任何一種(向量IRQ和非向量IRQ和在一起)。其中,快速中斷請求FIQ具有最高優(yōu)先級。建議只分配一個中斷請求給FIQ以減少中斷處理程序的延遲。當然,VIC支持多個FIQ中斷。

向量IRQ具有中等優(yōu)先級。該級別最多可分配32個請求中的16個。32個請求中的任何一個都可以分配到16個向量IRQslot中的任意一個。其中,slot0具有最高優(yōu)先級,而slot15則為最低優(yōu)先級。

非向量IRQ具有最低優(yōu)先級。一般也只分配一個中斷源。

VIC中斷設置步驟:

在主程序中:

1、設置VICIntSelect

通過VICIntSelect中斷選擇寄存器將32個中斷請求分配為FIQ或IRQ(包括向量IRQ與非向量IRQ)

相應位為1是FIQ,為0是IRQ。

例如:VICIntSelect = 0x00000000,設置所有中斷都是IRQ

2、設置VICVectCntlx(僅對于IRQ,F(xiàn)IQ不需要此設置)

通過VICVectCntlx(x=0,1,…,15)來選擇32個中斷請求中的某個為向量IRQ并設定此中斷請求為IRQ slotx(x對應于VICVectCntlx中的x)。若某個中斷源被設定為IRQ,但卻未通過VICVectCntlx使能,則該中斷源將被默認為非向量IRQ。

例如:VICVectCntl0 = 0x20 | 15,設置EINT1為向量中斷,使用Slot0。其中0x20是因為VICVectCntlx寄存器第六位是使能,15是通過查周立功那本書P208頁的表得到的EINT1的VIC通道號。

3、設置VICVectAddrx(僅對于IRQ,F(xiàn)IQ不需要此設置)

當有IRQ中斷產生時,VIC將會根據(jù)中斷源設置VICVectAddr寄存器為相應中斷服務程序的地址,切換處理器工作模式為IRQ模式,并跳轉到IRQ中斷入口0x00000018處;

異常中斷向量表中0x00000018處使用“LDR PC, [PC, #-0xFF0]”,使得程序跳轉到(0x00000018+8-0x00000FF0=0xFFFFF030)存儲器處保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是說:通過該指令,程序跳轉到VICVectAddr寄存器所指向的中斷服務程序的地址。

例如:VICVectAddr0 = (uint32)EINT1_Exception,設置EINT1中斷地址。EINT1一般是中斷服務程序函數(shù)名即服務中斷服務程序的首地址,前面要用(uint32)強制類型轉換。

4、設置VICDefVectAddr(當都設置為向量IRQ時可以沒有這個)

若是非向量IRQ中斷,VIC提供默認服務程序地址VICDefVectAddr,IRQ中斷入口程序可通過讀取VIC的向量地址寄存器VICVectAddr來取得該地址,然后跳轉到相應服務程序繼續(xù)執(zhí)行。該默認服務程序由所有非向量IRQ公用,默認服務程序可讀取IRQ狀態(tài)寄存器以確定哪個IRQ被激活。

例如:VICDefVectAddr = (uint32)Default_Entry,設置非向量中斷地址。如果在管理向量中斷的VICVectCntl0~15和VICVectAddr0~15中沒有設置某一個中斷EINTx則此EINTx中斷發(fā)生時,要進入非向量中斷處理程序Default_Entry。

5、設置VICIntEnable使能

例如:VICIntEnable = 0x00018000,使能EINT1和EINT2。因為EINT1和EINT2的VIC通道號分別為15和16,所以15和16兩位置一將EINT1和EINT2使能。

在中斷服務程序中:

1、中斷處理程序。用戶自己編寫的實現(xiàn)某種功能的中斷程序

2、清除相應的中斷標志,以響應下一次中斷,并切換處理器工作模式。建議用__irq關鍵字定義中斷服務程序,這樣的話,該函數(shù)將自動切換處理器工作模式,但該函數(shù)不能返回參數(shù)或者數(shù)值。

3、退出中斷前,一定要對VICVectAddr寄存器寫0,通知VIC中斷結束

具體FIQ、向量IRQ和非向量IRQ的具體設置步驟不完全相同

1、快速中斷FIQ

⑴在主程序中:

1、在VICIntSelect中將中斷分配為FIQ中斷;

2、在VICIntEnable中使能外設中斷。

⑵中斷服務程序中:

1、中斷處理程序;

2、清除相應的中斷標志,以響應下一次中斷。

2、向量IRQ

⑴主程序

1、在VICIntSelect中將中斷分配為IRQ中斷;

2、在VICVectCntlx中分配中斷通道(優(yōu)先級);

3、在VICVectAddrx中設置中斷服務程序的地址;

4、通過VICIntEnable使能外設中斷。

⑵中斷服務程序

1、中斷處理;

2、清除相應的中斷標志,以響應下一次中斷;

3、對VICVectAddr寄存器執(zhí)行寫操作(通常為0x00),結束向量中斷。

3、非向量IRQ

⑴主程序

1、在VICDefVectAddr中設置中斷服務程序的地址;

2、通過VICIntEnable使能外設中斷。

⑵中斷服務程序

1、中斷處理;

2、清除相應的中斷標志,以響應下一次中斷;

3、對VICVectAddr寄存器執(zhí)行寫操作(通常為0x00),結束向量中斷。



評論


技術專區(qū)

關閉