www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀] 四.ARM中斷程序編寫之外部中斷前言:VIC中斷控制器定義了4個外部中斷,中斷號為EINT0(14),EINT1(15),EINT2(16),EINT3(17)用來給用戶進行編寫外部中斷(例如按鍵中斷。。。)1.在編寫外部中斷事先要對引

四.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. 當有多個中斷源被設置

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉