您的位置:首页 > 其它

ARM学习之KEY_ENT实验

2011-10-20 22:24 204 查看
/***************************************************

Project: KEY按键中断实验

Writer: SHOW

Time: 2011/10/13

Hareware: 硬件平台:mini2440 , J-link.

硬件连接:GPG0~EINT8,

GPG3~EINT11,

GPG5~EINT13,

GPG6~EINT14。

Direction:1.查询外部中断的方式控制对应的灯亮灭。

2.需要设置的寄存器:GPBCON,GPGCON,SRCPND,INTMSK,INTPND,EXTINT1,EINTPEND,INTMASK。

3.烧写程序过程中,经常跑飞,后来发现是没有对DebugReg进行设置,原来每个工程都需要设置。




***************************************************/

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "def.h"

#include "mmu.h"

#include "Option.h"

#define LED1_OFF (1<<5)

#define LED2_OFF (1<<6)

#define LED3_OFF (1<<7)

#define LED4_OFF (1<<8)

void Delay1ms(int times);

void Init_LED(void);

void __irq EintHandler(void);

void Init_Interrupt_Control(void);

//========================================================================

// 函数名称: 主函数

// 实现功能: 函数入口

// 参数: void

// 返回值: void

//========================================================================

void Main(void)

{

Init_LED();
//初始化LED。

while(1);

}

//========================================================================

// 函数名称: 外部中断初始化设置函数

// 实现功能: 对外部中断EINT的设置

// 参数: void

// 返回值: void

//========================================================================

void Init_Interrupt_Control(void)

{

rGPGCON |= (1<<1 | 1<<7 | 1<<11 | 1<<13); //设置按键对应的GPIO为EINT。

rEXTINT1 = 0; //低电平触发。

rEINTPEND |= (1<<8 |1<<11 | 1<<13 | 1<<14); //清中断挂起寄存器,写1则clear。

rEINTMASK &= ~(1<<8 | 1<<11 | 1<<13 |1<<14);//关掉中断屏蔽寄存器,使能中断。

ClearPending(BIT_EINT8_23); // 清中断源挂起寄存器SRCPND与使能中断挂起寄存器INTPND防止有其他中断干扰。

pISR_EINT8_23=(unsigned)EintHandler;
//外部中断8_23中断服务子程序入口地址。pISR_EINT8_23在2440addr.h中有定义。

EnableIrq(BIT_EINT8_23);
// 关中断屏蔽寄存器INTMSK,使能中断。

}

//========================================================================

// 函数名称: 延时1ms子函数

// 实现功能: 延时

// 参数: times为延时的ms数。

// 返回值: void

//========================================================================

void Delay1ms(int times)

{

int i;

for( ; times > 0; times-- )

for(i=400; i>0 ; i--);

}

//========================================================================

// 函数名称: IO口初始化子函数

// 实现功能: 初始化IO口 设置GPIO为输出口。

// 参数: void

// 返回值: void

//========================================================================

void Init_LED(void)

{

// rGPBCON = 0; 复位即为0可不用先给0。

rGPBCON |= (1<<10) | (1<<12) | (1<<14) | (1<<16); // 设置GPB5~GPB8 为输出口。

rGPBDAT |= (LED1_OFF | LED2_OFF | LED3_OFF | LED4_OFF);// 初始化熄灭。

}

//========================================================================

// 函数名称: 中断服务函数

// 实现功能: 判断是那个 外部中断,点亮对应的LED。__irp是中断服务函数标志必须有。

// 参数: void

// 返回值: void

//========================================================================

void __irq EintHandler(void)

{



if(rINTPND == BIT_EINT8_23)

{

ClearPending(BIT_EINT8_23);

if(rEINTPEND & (1<<8))

{

rGPBDAT &= ~LED1_OFF;

Delay1ms(1000);

rGPBDAT |= LED1_OFF;

rEINTPEND |= 1 << 8;

}

if(rEINTPEND & (1<<11))

{

rGPBDAT &= ~LED2_OFF;

Delay1ms(1000);

rGPBDAT |= LED2_OFF;

rEINTPEND |= 1 << 11;

}

if(rEINTPEND & (1<<13))

{

rGPBDAT &= ~LED3_OFF;

Delay1ms(1000);

rGPBDAT |= LED3_OFF;

rEINTPEND |= 1<< 13;

}

if(rEINTPEND & (1<<14))

{

rGPBDAT &= ~LED4_OFF;

Delay1ms(1000);

rGPBDAT |= LED4_OFF;

rEINTPEND |= 1 << 14;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: