ARM2200下的中斷編程一
掃描二維碼
隨時隨地手機看文章
一.前言
中斷的基本概念:
1.在ARM中最多有32個中斷請求
2.16個向量IRQ中斷(16個向量中斷的VIC中斷號已經(jīng)有系統(tǒng)定義好了。在p208中可查看)
(16個向量中斷有16個優(yōu)先級,可動態(tài)分配給中斷請求)
3.可產(chǎn)生軟件中斷。
4.中斷的優(yōu)先級資源:中斷的優(yōu)先級資源就是CPU的中斷系統(tǒng)。以ARM7體系的CPU為例,最多可以有32個中斷資源。對于每個具體的中斷源可以將其設(shè)定為FIQ,使其具有最高優(yōu)先級,但FIQ最好是分配給唯一的中斷源,否則就失去意義;也可以設(shè)定為向量IRQ,使其具有中等優(yōu)先級,但向量IRQ的總數(shù)不能超過16個,這些中斷源優(yōu)先級的高低按向量編號從0(最高)到15(最低)排序;如果中斷源的個數(shù)超過17個,則剩余的中斷源只能設(shè)定為非向量IRQ,其優(yōu)先級最低。操作系統(tǒng)本身必須使用一個定時器中斷源來作為系統(tǒng)節(jié)拍中斷,它是操作系統(tǒng)工作的基礎(chǔ)。
二VIC向量中斷控制器
1.向量中斷控制器(VIC)具有32個中斷請求輸入
a.可以將其分為3類:
FIQ,向量IRQ中斷和非向量IRQ.
b.快速中斷請求(FIQ)要求具有最高優(yōu)先級。當(dāng)如果只有一個中斷被分配為FIQ時,可現(xiàn)實最短的FIQ等待時間,因為FIQ服務(wù)程序只要簡單地啟動對該中斷處理就可以了。
c.向量IRQ中斷具有中等優(yōu)先級。該優(yōu)先級可分配32個請求中的16個。32個請求中的任意一個都可以分配到16個向量IRQslot中的任意一個,其中slot()具有最高優(yōu)先級,而slot15則為最低優(yōu)先級。
d.非向量IRQ中斷的優(yōu)先級最低。
2在編寫中斷程序時最常用的寄存器
a.中斷使能寄存器(VICIntEnable)
(1)VICIntEnable寄存器有32為:從0~31給每一位寫1表示時該為對應(yīng)的中斷時能,寫入0表示禁止該位的中斷。(每一位對應(yīng)的中斷和VIC通道號對應(yīng)。
Eg:VICIntEnable=1<<6;表示使UART0能中斷,因為UART0對應(yīng)的中斷號即為6.
b.中斷選擇寄存器VICIntSelect
(1) VICIntSelect:該寄存器有32位(0~31)將32個中斷請求分別分配為FIQ或IRQ ,
(2)給對應(yīng)位寫入1表示給對應(yīng)的中斷請求分配為FIQ
(3)給對應(yīng)位寫入0表示給對應(yīng)的中斷請求分配為IRQ
C.向量控制寄存器0~15(VICVectCntl0~15)
(1)如果給一個中斷指定的向量控制寄存器為VICVectl0則表示該中斷具有最高中斷優(yōu)先級。反之,如果給一個中斷指定的向量控制寄存器為VICVectl15則表示該中斷具有最低優(yōu)先級。
(2)VICVectCntlx(x指0~15)該寄存器為6位。
0~4:用來指定中斷編號
5:為1表示向量使能
Eg;VICVectCntl0=0x20|6(表示給UART0分配向量控制寄存器,且它的優(yōu)先級是最高的(0表示最高優(yōu)先級)
D.向量地址寄存器(VICVectAddrx)
(1)當(dāng)發(fā)生一個IRQ中斷時,VIC會將對應(yīng)的IRQ服務(wù)程序地址存入該寄存器,IRQ中斷入口處的程序可讀寄存器并跳轉(zhuǎn)到讀出的地址,執(zhí)行相應(yīng)的中斷服務(wù)程序
(注:該寄存器應(yīng)該在ISR快結(jié)束時執(zhí)行一次些操作(寫入的值一般為0)以遍更新優(yōu)先級硬件。)
(2)在發(fā)生中斷時,給中斷分配中斷地址時應(yīng)該和給該中斷分配的中斷控制寄存器的號一致
Eg: VICVectCntl0=0x20|6;
VICVectAddr0=(uint32)UART0_IRQ(自己編寫的終端函數(shù)的地址)
注:在編寫向量中斷程序時,必須對他進行初始化。一般的程序過程是:首先:用VICIntSelect寄存器對該中斷進行選擇時IRQ中斷還是FIQ中斷。
其次:用VICVectCntlx給該中斷分配向量終端控制寄存器(其中x的值越小,中斷優(yōu)先級越高。
再次:用VICVectAddrx給該中斷分配中斷地址:
最后:用VICIntEnable使該中斷使能:
程序事例:
VICIntSelect = 0x00000000;//設(shè)置所有中斷為IRQ中斷
VICVectCntl0 = 0x26; // UART0中斷分配到IRQ slot 0,即優(yōu)先級最高
VICVectAddr0 = (int)IRQ_UART0;//設(shè)置UART0向量地址
VICIntEnable = 0x00000040;//使能UART0中斷
三非向量中斷:
1.常用寄存器:
a中斷使能寄存器(VICIntEnable)
VICIntEnable寄存器有32為:從0~31給每一位寫1表示時該為對應(yīng)的中斷時能,寫入0表示禁止該位的中斷。(每一位對應(yīng)的中斷和VIC通道號對應(yīng)。
Eg:VICIntEnable=1<<6;表示使UART0能中斷,因為UART0對應(yīng)的中斷號即為6.
b中斷選擇寄存器VICIntSelect
(1) VICIntSelect:該寄存器有32位(0~31)將32個中斷請求分別分配為FIQ或IRQ ,
(2)給對應(yīng)位寫入1表示給對應(yīng)的中斷請求分配為FIQ
(3)給對應(yīng)位寫入0表示給對應(yīng)的中斷請求分配為IRQ
注:以上和向量中斷的用法一致,一下是不同點
c.默認向量地址寄存器VICDefVectAddr
該寄存器保存了非向量IRQ中斷服務(wù)程序IRQ的地址
注:在編寫非向量中斷程序時,必須對他進行初始化。一般的程序過程是:
a.首先:用VICIntSelect寄存器對該中斷進行選擇時IRQ中斷還是FIQ中斷。
b.其次:用VICDefVectAddr寄存器存放非向量中斷的地址
c.最后:用VICIntEnable使該中斷使能
程序事例:
VICIntSelect = 0x00000000;//設(shè)置所有中斷為IRQ中斷
VICDefVectAddr0 = (int)IRQ_UART0; //設(shè)置UART0非向量中斷的地址
VICIntEnable = 0x00000040;//使能UART0中斷
四綜合:一個程序中既有向量中斷和非向量中斷
Eg;假設(shè)UART0和SPI0產(chǎn)生中斷請求,它們被分配為向量IRQ(UART0的優(yōu)先級高于SPI0),而UARTI和I2C產(chǎn)生非向量IRQ,
程序:
VICIntSelect = 0x00000000; //設(shè)置所有中斷為IRQ中斷
VICVectCntl0=0x26//UART0通道號為6優(yōu)先級為0(最高)
VICVectCntl1=0x2A//SPI0通道號為10優(yōu)先級為1
VICVectAddr0=(int)UART0_IRQ;
VICVectAddr1=(int)SPI0_IRQ;
VICDefAddr=//保存非向量UART1和I2C終端服務(wù)的地址;
VICIntEnable=0x6c0//SPI0,I2C,UART1,UART0在bit10,bit9,bit7和bit6=1