資源簡介
用ADS編譯測試通過,外部中斷按鍵測試程序,可以通過uboot下載至NAND里運行,直接下載到SDRAM無法運行(因為沒有開啟MMU)。
http://blog.csdn.net/forsakening/article/details/8998027
這里是我對S3C2440代碼及中斷的分析。

代碼片段和文件信息
#include?“2440addr.h“
/*?延時?*/
void?Delay1s(void)
{
int?i=0;
for?(;i<1000000;i++);
}
/*?LED部分?*/
#define?Led1_On()??????{rGPBDAT?&=?(~(1?<5));}?
#define?Led1_Off()?????{rGPBDAT?|=?(1?<5);}?
#define?Led2_On()??????{rGPBDAT?&=?(~(1?<6));}?
#define?Led2_Off()?????{rGPBDAT?|=?(1?<6);}?
#define?Led3_On()??????{rGPBDAT?&=?(~(1?<7));}?
#define?Led3_Off()?????{rGPBDAT?|=?(1?<7);}?
#define?Led4_On()??????{rGPBDAT?&=?(~(1?<8));}?
#define?Led4_Off()?????{rGPBDAT?|=?(1?<8);}?
void?Led_Init(void)
{
rGPBCON?&=?~((3?<10)?|?(3?<12)?|?(3?<14)?|(3?<16));
rGPBCON?|=?((1<<10)?|?(1<<12)?|?(1<<14)?|?(1<<16))?;
rGPBUP??&=??~((1?<5)?|?(1?<6)?|?(1?<7)?||?(1?<8)?)?;
rGPBDAT?|=?(1?<5)?|?(1?<6)?|?(1?<7)?|?(1?<8)?;
}
/*?外部中斷:按鍵中斷,控制LED燈的亮滅?*/
/*
?*?1.設置IO口為外中斷模式
?*/
#define?KEY1?(2?<2)?
#define?KEY2?(2?<8)
#define?KEY3?(2?<4)
#define?KEY4?(2?<0)
void?Key_Init(void)
{
rGPFCON?&=?~((3?<0)?|?(3?<2)?|?(3?<4)?|?(3?<8))?;
/*?GPFCON:?00:input?01:output?10:EINT?*/
rGPFCON?|=?KEY1?|?KEY2?|?KEY3?|?KEY4?;
rGPFDAT?|=?(1?<0)?|?(1?<1)?|?(1?<2?)?|?(1?<4)?;//將鍵盤對應的四個引腳置為高電平,完成初始化工作
}
/*
?*?2.使能中斷:打開INTMSK中斷屏蔽
?*???INTMSK有單獨位來屏蔽外部中斷0-3。對于4-7用EINTMASK來區分
?*/
void?Irq_Init(void)
{
rINTMSK???&=?~((1?<0)?|?(1?<1)?|?(1?<2)?|?(1?<4))?;//使能外部中斷0,1?,2?4
rEINTMASK?&=?(~(1?<4))?;//使能外部中斷4
}
/*
?*?SRCPND和INTPND的每一個位代表一個中斷源,當有中斷產生時,對應的位置會自動置1
?*?清除此中斷需要往對應位置寫1
?*?對于外部中斷4-7,由于是由子中斷控制,還需要向EINTPEND中對應位置寫1
?*?對于啟動代碼中所說的INTOFFSET寄存器,其用來標識INTPND的哪種類型中斷發生了,
?*?當SRCPND和INTPND對應的中斷標志位清除后,INTOFFSET對應位會被自動清零
?*/
void?__irq?Eint0_Isr(void)
{
Led1_On();Delay1s()?;Led1_Off()?;
rSRCPND?|=?1?<0?;//清除這一位的話,會自動清除INTOFFSET這一位的;
rINTPND?|=?1?<0?;
}
void?__irq?Eint1_Isr(void)
{
Led2_On();Delay1s()?;Led2_Off()?;
rSRCPND?|=?1?<1?;//清除這一位的話,會自動清除INTOFFSET這一位的;
rINTPND?|=?1?<1?;
}
void?__irq?Eint2_Isr(void)
{
Led3_On();Delay1s()?;Led3_Off()?;
rSRCPND?|=?1?<2?;//清除這一位的話,會自動清除INTOFFSET這一位的;
rINTPND?|=?1?<2?;
}
void?__irq?Eint4_7_Isr(void)
{
if(rEINTPEND?&?(1?<4)?)?//EINTPEND記載著具體是哪個外部中斷發生了
{
Led4_On();Delay1s()?;Led4_Off()?;
rEINTPEND?|=?1?<4?;
}
rSRCPND???|=?1?<4?;
rINTPND???|=?1?<4?;
}
/*
?*?3.中斷服務程序:a)中斷向量表的安裝
?*?????????????????b)中斷處理,記得清除中斷
?*/
/*
?*?#define?pISR_EINT0?(*(unsigned?*)(_ISR_STARTADDRESS+0x20))
?*?_ISR_STARTADDRESS是中斷的入口地址
?*?在啟動代碼中提到,若發生中斷,(以IRQ為例)動作是
?*?1)b?HandlerIRQ?一級查找
?*?2)HandlerIRQ?HANDLER?HandleIRQ,執行HandleIRQ對應的程序
?*?3)根據INTOFFSET確定是哪個中斷源,計算出偏移量,
?*???在HandleEINT0的基礎上偏移,執行中斷程序,二級查找
?*?4)HandleEINT0的地址和pISR_EINT0所在的地址實際上是一樣的,代表的就是中斷服務程序
?*???不過HandleEINT0是一個地址,pISR_EINT0代表地址里存放的數值(實際上是真正服務程序的地址Eint0_Isr)
?*/
#define?_ISR_STARTADDRESS? 0x33ffff00
void?Isr_Init(void)
{
pISR_EINT0?=?(unsigned?int)Eint0_Isr?;
pISR_EINT1?=?(unsigned?int)Eint1_Isr?;
pISR_EINT2?=?(unsigned?int)Eint2_Isr?;
pISR_EINT4_7?=?(unsigned?int)Eint4_7_Isr?;/**/
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????197856??2013-05-31?15:29??EINT0_Test\EINT0_Test.mcp
?????文件???????3450??2013-05-31?15:29??EINT0_Test\EINT0_Test_Data\CWSettingsWindows.stg
?????文件??????18264??2013-05-31?15:26??EINT0_Test\EINT0_Test_Data\DebugRel\EINT0_Test.axf
?????文件???????3156??2013-05-31?15:26??EINT0_Test\EINT0_Test_Data\DebugRel\EINT0_Test.bin
?????文件??????54666??2013-05-31?15:29??EINT0_Test\EINT0_Test_Data\DebugRel\TargetDataWindows.tdt
?????文件??????53120??2013-05-31?15:29??EINT0_Test\EINT0_Test_Data\Release\TargetDataWindows.tdt
?????文件??????54494??2013-05-31?15:29??EINT0_Test\EINT0_Test_Data\Debug\TargetDataWindows.tdt
?????文件??????28550??2011-05-19?15:18??EINT0_Test\startcode\2440addr.h
?????文件???????3908??2011-05-19?15:18??EINT0_Test\startcode\2440addr.inc
?????文件???????7209??2013-05-30?23:58??EINT0_Test\startcode\2440init.s
?????文件????????516??2011-05-19?15:19??EINT0_Test\startcode\config.h
?????文件????????444??2011-08-10?14:15??EINT0_Test\startcode\def.h
?????文件????????548??2011-05-24?19:35??EINT0_Test\startcode\Memcfg.inc
?????文件???????7818??2011-11-10?21:02??EINT0_Test\startcode\nand.c
?????文件???????4204??2011-08-17?13:46??EINT0_Test\startcode\Nand.h
?????文件????????327??2011-05-24?22:23??EINT0_Test\startcode\Option.inc
?????文件???????3604??2013-05-31?15:25??EINT0_Test\main.c
?????目錄??????????0??2013-05-31?15:22??EINT0_Test\EINT0_Test_Data\DebugRel\ob
?????目錄??????????0??2013-05-31?15:09??EINT0_Test\EINT0_Test_Data\DebugRel
?????目錄??????????0??2013-05-31?15:09??EINT0_Test\EINT0_Test_Data\Release
?????目錄??????????0??2013-05-31?15:09??EINT0_Test\EINT0_Test_Data\Debug
?????目錄??????????0??2013-05-31?15:09??EINT0_Test\EINT0_Test_Data
?????目錄??????????0??2013-05-31?15:10??EINT0_Test\startcode
?????目錄??????????0??2013-05-31?15:09??EINT0_Test
-----------?---------??----------?-----??----
???????????????442134????????????????????24
評論
共有 條評論