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

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 四.ARM中斷程序編寫之外部中斷前言:VIC中斷控制器定義了4個(gè)外部中斷,中斷號(hào)為EINT0(14),EINT1(15),EINT2(16),EINT3(17)用來(lái)給用戶進(jìn)行編寫外部中斷(例如按鍵中斷。。。)1.在編寫外部中斷事先要對(duì)引

四.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è)置

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