用中斷的方式都控制LED
- #include"2410lib.h"
- #include"Option.h"
- #include"2410slib.h"
- #include"def.h"
- #include"2410addr.h"
- #include"stdlib.h"
- #include"string.h"
- #include"mmu.h"
- #include"timer.h"
- #defineLED_OPEN1~(1<<5)
- #defineLED_OPEN2~(1<<6)
- #defineLED_OPEN3~(1<<7)
- #defineLED_CLOSE1(1<<5)
- #defineLED_CLOSE2(1<<6)
- #defineLED_CLOSE3(1<<7)
- intflag=1;
- staticvoid__irqkey_handler(void);
- //初始化led的端口
- voidled_port_init(void)
- {
- rGPGCON&=0xffff03ff;
- rGPGCON|=0x00005400;
- }
- //初始化按鍵
- voidkey_init(void)
- {
- //initGPIO(F)
- rGPFCON&=0xfffffffC;
- rGPFCON|=0x00000002;
- //initEINT0register初始化控制EINT0這個中斷的外部中斷控制器
- rEXTINT0&=~(0x7);
- //rEINTPEND用來記錄有沒有發(fā)生中斷,如果要清楚就置1即可
- //rEINTMASK用來指示要不要屏蔽這個中斷
- //設(shè)置ISR
- pISR_EINT0=(U32)key_handler;
- EnableIrq(BIT_EINT0);//設(shè)置INTMASk寄存器
- }
- voiddely(inttt)
- {
- inti=0;
- intj=0;
- for(;i
- {
- for(;j<100000000;j++);
- }
- }
- voidled_run(void)
- {
- if(flag)
- {
- rGPGDAT|=LED_CLOSE1|LED_CLOSE2|LED_CLOSE3;
- dely(100);
- flag=0;
- }
- else
- {
- rGPGDAT&=LED_OPEN1&LED_OPEN2&LED_OPEN3;
- dely(100);
- flag=1;
- }
- }
- //按鍵中斷函數(shù)
- staticvoid__irqkey_handler(void)
- {
- if(rINTPND==BIT_EINT0)//去判斷srcpnd這寄存器
- {
- ClearPending(BIT_EINT0);
- led_run();
- }
- }
- intMain()
- {
- MMU_Init();
- led_port_init();
- key_init();
- while(1);
- }
在這里講中斷主要是為了讓自己能搭起一個框架,以后關(guān)于中斷的程序能有一個的模板.
本文引用地址:http://m.butianyuan.cn/article/201611/316752.htm這個程序的主要作用很簡單,就是通過按鍵來產(chǎn)生中斷,從而控制led的亮與滅...
第一步:對中斷引腳的初始化
我的開發(fā)板EINT0這個中斷是有GPF0觸發(fā)的,所以先對這個引腳進(jìn)行初始化,初始化的工作就是工作GPFCON控制器讓引腳為中斷的引腳。通過配置不同的值可以讓引腳有不同的功能,這里的功能就是產(chǎn)生 中斷的功能。
第二步:對于該中斷內(nèi)部的設(shè)置
中斷內(nèi)部的設(shè)置包含了:按鍵怎么樣的情況下算觸發(fā)中斷,內(nèi)部的pnd要清除(pnd寄存器是用來記錄這個中斷是否發(fā)生),還有就是內(nèi)部mask(不能屏蔽該中斷)
當(dāng)然有的中斷不用全部都設(shè)置,就像EINT0~3好像就不用,因為這幾位都是保留的。
第三步:就是設(shè)置中斷處理函數(shù)
這一步應(yīng)該是比較關(guān)鍵的一步,中斷函數(shù)是你自己設(shè)定的,不過你要把你寫的中斷處理函數(shù)賦值給相對應(yīng)的地方,這個講深了就是高級編程與底層之間的聯(lián)系,關(guān)于這個就是arm本身的中斷處理過程了。
最好在之前能先調(diào)用一下clearpending函數(shù),清除一下srcpnd與intpnd兩個寄存器,設(shè)置完處理函數(shù)以后就用enableirq這個函數(shù)去初始化intmsk這個寄存器,讓他不會被屏蔽。
這就是關(guān)于中斷的一個流程,掌握這個的話以后就可以以不變應(yīng)萬變了。
但是關(guān)于這個程序還有一點就是關(guān)于MMU_Init這個函數(shù)是必須的,原因好像是關(guān)于中斷向量表的轉(zhuǎn)移,我查閱了網(wǎng)上的一些資料,而對于具體還不是清楚,但是宏觀上是這樣的。
中斷向量表本身是在0地址處,但是我們在運行程序的時候是在0x30000000處,所以程序產(chǎn)生的中斷其實是不能找到想對應(yīng)的中斷處理程序,而MMU_Init好像有一部分的作用就是講中斷向量表也轉(zhuǎn)移到0x30000000地址處,那樣就可以運行了。不過真正的原因還在想的過程中,不過這樣是可以解決問題的。下次會對這個問題進(jìn)行解答的....
評論