ARM2200下的中斷編程二
掃描二維碼
隨時(shí)隨地手機(jī)看文章
四.ARM中斷程序編寫之外部中斷
前言:VIC中斷控制器定義了4個(gè)外部中斷,中斷號(hào)為EINT0(14),
EINT1(15),EINT2(16),EINT3(17)用來(lái)給用戶進(jìn)行編寫外部中斷(例如按鍵中斷。。。)
1.在編寫外部中斷事先要對(duì)引腳功能選擇寄存器(PINSEL0)進(jìn)行配置
(參照具體型號(hào)的ARM數(shù)據(jù)手冊(cè),此處以LPC2230進(jìn)行配置)在LPC2230中:
Eg:PINSEL1 = 3<<8;//設(shè)置管腳連接,P0.20設(shè)置為EINT3
2第二部外部中斷還要對(duì)外部中斷方式寄存器(EXTMODE)進(jìn)行配置來(lái)選擇每個(gè)EINT腳是電平觸發(fā)還是邊沿觸發(fā)。
A.EXTMODE(外部中斷方式寄存器):總共有8位
第0位:對(duì)第0位寫入1表示對(duì)EINT0使用邊沿觸發(fā),反之,寫入0表示對(duì)EINT0使用電平觸發(fā)。
第1位:功能和上面相似只是對(duì)EINT1進(jìn)行配置
第2位:是對(duì)EINT2進(jìn)行配置
第3位:是對(duì)EINT3進(jìn)行配置
第4~7位:保留
Eg;EXTMODE = 1<<3;//設(shè)置EINT3中斷為邊沿觸發(fā)模式
EXTMODE = 0<<3;//設(shè)置EINT3中斷為電平觸發(fā)模式
3第三部外部中斷還要對(duì)外部中斷極性寄存器進(jìn)行配置(EXTPOLAR)進(jìn)行配置(在電平觸發(fā)方式中,EXTPOLAR寄存器用來(lái)選擇相應(yīng)引腳是高電平或低電平有效。在邊沿觸發(fā)方式中,EXTPOLAR寄存器用來(lái)選擇引腳上升沿或下降沿有效)
A EXTPOLAT(外部中斷極性寄存器)總共有8位
第0位:是對(duì)EINT0進(jìn)行配置,對(duì)該位寫入1表示時(shí)表示
EINT0高電平或上升沿有效。反之,對(duì)該位寫入0表示表示EINT0低電平或下降沿有效
第1位:是對(duì)EINT1進(jìn)行配置。功能和上面類似。
第2位:是對(duì)EINT2進(jìn)行配置。功能和上面類似
第3位:是對(duì)EINT3進(jìn)行配置。功能和上面類似
第4~7位:保留位。
Eg:EXTPOLAR = 0x00;//設(shè)置EINT3中斷為下降沿觸發(fā)
EXTPOLAR = 0x00;//設(shè)置EINT3中斷為低電平有效
4.第四部配置中斷選擇寄存器VICIntSelect
功能和前面的類似
Eg; VICIntSelect = 0x00000000;//設(shè)置所有中斷分配為IRQ中斷
5若外部中斷為向量中斷則對(duì)向量控制寄存器0~15(VICVectCntl0~15)
進(jìn)行配置。若為非向量中斷則此步驟可省掉。
Eg: VICVectCntl0 = 0x20|17; //分配EINT3中斷到向量中斷0,0x20表示向量IRQ使能,1<<17表示EINT3在VIC通道17號(hào)
6配置外部中斷服務(wù)程序的地址:
a.若為向量中斷則配置向量地址寄存器(VICVectAddrx)
a.b.若為非向量中斷則配置默認(rèn)向量地址寄存器VICDefVectAddr
eg:VICVectAddr0 = (int)IRQ_Eint3;//設(shè)置向量中斷服務(wù)程序地址IRQ_Eint3(為函數(shù)名,可隨意起)
VICDefVectAddr = (int)IRQ_Eint3;//設(shè)置非向量中斷服務(wù)程序地址
7.清除外部中斷標(biāo)志
切記要在初始化時(shí)對(duì)EXTINT進(jìn)行初始化。否則程序會(huì)進(jìn)入異常。
配置外部中斷標(biāo)志寄存器(EXTINT)
A.通過(guò)對(duì)EXINT寄存器寫人1來(lái)將其清零來(lái)清除外部中斷標(biāo)志
B.EXTINT總共有8位
第0位:是對(duì)EINT0進(jìn)行配置,寫入1對(duì)外部中斷EINT0中斷進(jìn)行清除
第1位:是對(duì)EINT1進(jìn)行配置,寫入1對(duì)外部中斷EINT1中斷進(jìn)行清除。
第2位:是對(duì)EINT2進(jìn)行配置,寫入1對(duì)外部中斷EINT2中斷進(jìn)行清除。
第3位:是對(duì)EINT3進(jìn)行配置,寫入1對(duì)外部中斷EINT3中斷進(jìn)行清除。
第4~7位:保留位.
Eg:EXTINT = 1<<3;//清除EINT3中斷標(biāo)志
8.對(duì)中斷使能寄存器(VICIntEnable)進(jìn)行配置
功能和前面說(shuō)的類似
Eg:VICIntEnable = 1<<17; //使能EINT3中斷,EINT3在VIC通道17號(hào)
注:編寫外部中斷程序時(shí)初始化實(shí)例:
1.初始化外部中斷3,用向量中斷,為邊沿觸發(fā)。
PINSEL1 = 3<<8; //設(shè)置管腳連接,P0.20設(shè)置為EINT3
EXTMODE = 1<<3;//設(shè)置EINT3中斷為邊沿觸發(fā)模式
EXTPOLAR = 0x00;//設(shè)置EINT3中斷為下降沿觸發(fā)
VICIntSelect = 0x00000000;//設(shè)置所有中斷分配為IRQ中斷
VICVectCntl0 = 0x20|17;//分配EINT3中斷到向量中斷0
VICVectAddr0 = (int)IRQ_Eint3;//設(shè)置中斷服務(wù)程序地址
EXTINT = 1<<3;//清除EINT3中斷標(biāo)志,次步不能少
VICIntEnable = 1<<17;//使能EINT3中斷,EINT3在VIC通道17號(hào)
2.初始化外部中斷為EINT3,用非向量中斷,為電平觸發(fā)
PINSEL1 = 3<<8; //設(shè)置管腳連接,P0.20設(shè)置為EINT3
EXTMODE = 0<<3;//設(shè)置EINT3中斷為電平觸發(fā)模式
EXTPOLAR = 0x00;//設(shè)置EINT3中斷為低電平觸發(fā)
VICIntSelect = 0x00000000;//設(shè)置所有中斷分配為IRQ中斷
VICDefVectAddr = (int)IRQ_Eint3;//設(shè)置中斷服務(wù)程序地址
EXTINT = 1<<3;//清除EINT3中斷標(biāo)志,次步不能少
VICIntEnable = 1<<17;//使能EINT3中斷,EINT3在VIC通道17號(hào)
注:1.在編寫中斷服務(wù)函數(shù)時(shí),外部中斷為電平觸發(fā)和邊沿觸發(fā)有區(qū)別
3.在zlg模版中編寫中斷服務(wù)函數(shù)時(shí),函數(shù)名的前綴是__irq
函數(shù)實(shí)例:
1>用外部中斷3,用向量中斷,為邊沿觸發(fā)的中斷服務(wù)函數(shù)的程序
void__irq IRQ_Eint3(void)
{
uint32i;
i = IO0SET;//讀取當(dāng)前B1控制值
if( (i&BEEPCON)==0 )//控制B1輸出取反
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
EXTINT = 1<<3;//清除EINT3中斷標(biāo)志,1<<3等價(jià)于0x08
VICVectAddr = 0;//向量中斷結(jié)束
}
此中斷函數(shù)實(shí)現(xiàn)的功能時(shí)當(dāng)有按鍵按下時(shí)會(huì)蜂鳴。
注:1.每個(gè)中斷服務(wù)函數(shù)的函數(shù)名前綴必須加__irq
2在中斷服務(wù)程序最后要清除中斷標(biāo)志EXTINT = 1<<3,以及給VICVectAddr寄存器寫入0;
3.切記在初始化外部中斷時(shí)也要對(duì)EXTINT引腳進(jìn)行初始化,否則程序會(huì)出現(xiàn)異常。
2>初始化外部中斷為EINT3,用非向量中斷,為電平觸發(fā)
void__irq IRQ_Eint3(void)
{
uint32i;
i = IO0SET;//讀取當(dāng)前B1控制值
if( (i&BEEPCON)==0 )//控制B1輸出取反
{
IO0SET = BEEPCON;
}
else
{
IO0CLR = BEEPCON;
}
/*等待外部中斷信號(hào)恢復(fù)為高電平(若信號(hào)保持為低電平,中斷標(biāo)志會(huì)一直置位) */
while( (EXTINT&1<<3)!=0 )
{
EXTINT = 1<<3;//清除EINT3中斷標(biāo)志,
}
VICVectAddr = 0;//向量中斷結(jié)束
}
John哥說(shuō)明:
在用電平觸發(fā)時(shí)在中斷服務(wù)程序最后要清除中斷標(biāo)志時(shí),要使用
while( (EXTINT&1<<3)!=0 )
{
EXTINT = 1<<3;//清除EINT3中斷標(biāo)志,
}
(因?yàn)榈却獠恐袛嘈盘?hào)恢復(fù)為高電平(若信號(hào)保持為低電平,中斷標(biāo)志會(huì)一直置位)這一點(diǎn)和邊沿觸發(fā)有區(qū)別。
注:
1.中斷使能清零寄存器VICIntEnClr:那1位置1,則用來(lái)屏蔽該位的中斷。
2. 當(dāng)有多個(gè)中斷源被設(shè)置