• 大小: 40KB
    文件类型: .rar
    金币: 2
    下载: 0 次
    发布日期: 2024-02-02
  • 语言: 其他
  • 标签: TQ2440  外部中断  

资源简介

用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\objectCode

     目录          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


评论

共有 条评论