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;
}
}
}
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;
}
}
}
相关文章推荐
- Linux独立中断栈学习笔记及验证实验(ARM、x86)
- ARM学习笔记015之GPIO(汇编、key、led接线、int main、-wall)
- 【ARM学习笔记】实验一:S3C2440A的GPIO输出实验
- 【ARM学习笔记】实验二:S3C2440A的GPIO输入实验
- ARM学习之LCD实验
- ARM学习之UART实验
- ARM底层学习笔记-裸板实验程序解析-点亮LED
- 【ARM学习笔记】实验三:S3C2440A与内存SDRAM连接实验
- ARM学习之ADC实验
- ARM底层学习笔记-裸板实验程序解析-点亮LED
- 学习 ARM 系列 -- FS2410 开发板上的内存搬移实验
- 【ARM学习笔记】实验四:内存管理单元MMU的虚拟地址映射实验
- ARM学习之触摸屏实验
- ARM学习之GPIO实验
- ARM架构与体系学习(一)——初识启动文件
- ARM学习笔记---串口
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
- 和菜鸟一起深入学习国嵌实验之简单Makefile
- 系统学习ARM之四 --GNU的伪指令集
- 嵌入式学习--step5 实战篇--跑马灯实验