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