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