Tq2440学习笔记之外部中断

虽然对于这样一个简单的程序没必要写的这么复杂,但这对以后函数的调用和模块的移植应该会比较方便。千万要记得初始化MMU(MMU_Init();),原因是——仿真的时候,程序是运行在sdram里面的,也就是0x3000_0000处开始运行,中断向量表通过仿真器已经放在了0x3000_0000处。打开mmu是为了把0x3000_0000地址处的值映射到0x0的地方,因为中断向量表是保存在0x0开始的地方,当中断发生时的第一时间CPU会去0x0地方查中断向量表看是发生了什么中断,是reset还是IRQ还是FIQ还是取数据终止或取指令终止按键外部中断是IRQ中断,然后CPU会去IRQ开始的地方找到中断服务函数,这个时候轮到了中断服务函数运行的时间了,所以不打开MMU就不会进入中断服务函数。


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

File Name : 6-KEY
Description : 这是通过中断判断来控制相对应的开发板
 上的LED灯,LED1-->GPB5,LED2-->GPB6,
 LED3-->GPB7,LED4-->GPB8; KEY1-->GPF1,
 KEY2-->GPF4,KEY3-->GPF2,KEY4-->GPF0;
 (中断程序一定要记得初始化MMU)
Author&Date : jianlibo 2013-10-27 19:37:48
Version : (TQ2440)_ADS1.2_1.0
*************************************************/
#define GLOBAL_CLK 1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"


/* 将要调用的函数进行声明 */


/* 终中断服务函数声明 (记得一定要声明) */
static void __irq Key1_ISR(void);
static void __irq Key2_ISR(void);
static void __irq Key3_ISR(void);
static void __irq Key4_ISR(void);


/* 按键初始化 */
void Key1_init(void);
/* 按键初始化 */
void Key2_init(void);
/* 按键初始化 */
void Key3_init(void);
/* 按键初始化 */
void Key4_init(void);


/* 延时函数 */
void delay(int times);


/* Led1端口初始化 */
void Led1_init(void);
/* Led1运行函数 */
void Led1_run(void);
/* Led2端口初始化 */
void Led2_init(void);
/* Led2运行函数 */
void Led2_run(void);
/* Led3端口初始化 */
void Led3_init(void);
/* Led3运行函数 */
void Led3_run(void);
/* Led4端口初始化 */
void Led4_init(void);
/* Led4运行函数 */
void Led4_run(void);


/**************************************************
Function Name : Main
Parameter : void
Description : 主函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
int Main()
{
/* 初始化Led1端口 */
Led1_init();
/* 初始化Key1端口 */
Key1_init();
/* 初始化Led2端口 */
Led2_init();
/* 初始化Key2端口 */
Key2_init();
/* 初始化Led3端口 */
Led3_init();
/* 初始化Key3端口 */
Key3_init();
/* 初始化Led4端口 */
Led4_init();
/* 初始化Key4端口 */
Key4_init();

/* 进行空循环等待中断 */
while(1);
}


/**************************************************
Function Name : Led1_run
Parameter : void
Description : Led1运行函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led1_run(void)
{
/* GPB5输出低电平点亮LED1*/
rGPBDAT &= ~(1 << 5);
/* 延时 */
delay(1000);
/* GPB5输出高电平熄灭LED1 */
rGPBDAT |= (1 << 5);
/* 延时 */
delay(1000);
}


/**************************************************
Function Name : Led1_init
Parameter : void
Description : 初始化GPB5(对应控制的LED1)
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led1_init(void)
{
/* 配置GPB5为输入模式 */
rGPBCON &= ~(3 << 10);
/* 在配置GPB5为输入模式 */
rGPBCON |= (1 << 10);
}


/**************************************************
Function Name : Led2_run
Parameter : void
Description : Led2运行函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led2_run(void)
{
/* GPB5输出低电平点亮LED1*/
rGPBDAT &= ~(1 << 6);
/* 延时 */
delay(1000);
/* GPB5输出高电平熄灭LED1 */
rGPBDAT |= (1 << 6);
/* 延时 */
delay(1000);
}


/**************************************************
Function Name : Led2_init
Parameter : void
Description : 初始化GPB6(对应控制的LED2)
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led2_init(void)
{
/* 配置GPB5为输入模式 */
rGPBCON &= ~(3 << 12);
/* 在配置GPB5为输入模式 */
rGPBCON |= (1 << 12);
}


/**************************************************
Function Name : Led3_run
Parameter : void
Description : Led3运行函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led3_run(void)
{
/* GPB5输出低电平点亮LED1*/
rGPBDAT &= ~(1 << 7);
/* 延时 */
delay(1000);
/* GPB5输出高电平熄灭LED1 */
rGPBDAT |= (1 << 7);
/* 延时 */
delay(1000);
}


/**************************************************
Function Name : Led3_init
Parameter : void
Description : 初始化GPB7(对应控制的LED3)
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led3_init(void)
{
/* 配置GPB7为输入模式 */
rGPBCON &= ~(3 << 14);
/* 在配置GPB7为输入模式 */
rGPBCON |= (1 << 14);
}


/**************************************************
Function Name : Led4_run
Parameter : void
Description : Led4运行函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led4_run(void)
{
/* GPB8输出低电平点亮LED4*/
rGPBDAT &= ~(1 << 8);
/* 延时 */
delay(1000);
/* GPB8输出高电平熄灭LED4 */
rGPBDAT |= (1 << 8);
/* 延时 */
delay(1000);
}


/**************************************************
Function Name : Led4_init
Parameter : void
Description : 初始化GPB8(对应控制的LED4)
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Led4_init(void)
{
/* 配置GPB8为输入模式 */
rGPBCON &= ~(3 << 16);
/* 在配置GPB8为输入模式 */
rGPBCON |= (1 << 16);
}


/**************************************************
Function Name : Delay
Parameter : void
Description : 延时函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void delay(int times)
{
int i;
for(; times > 0; times--)
for(i = 0; i < 400; i++);
}


/**************************************************
Function Name : Key1_init
Parameter : void
Description : 按键初始化函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Key1_init(void)
{
/* 初始化MMU */
MMU_Init();
/* 将GPF1设置为输入状态 */
rGPFCON &= ~(0x3 << 2);
/* 将GPF1设置为中断状态 */
rGPFCON |= (0x2 << 2);

/* 设置GPF1的中断方式为低电平中断 */
rEXTINT0 &= ~(0x7 << 4);

/* 设置中断服务向量 */
pISR_EINT1 = (U32)Key1_ISR;
/* 使能中断位 */
EnableIrq(BIT_EINT1);
}


/**************************************************
Function Name : Key2_init
Parameter : void
Description : 按键初始化函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Key2_init(void)
{
/* 初始化MMU */
MMU_Init();

/* 将GPF4设置为输入状态 */
rGPFCON &= ~(0x3 << 8);
/* 将GPF4设置为中断状态 */
rGPFCON |= (0x2 << 8);

/* 设置GPF4的中断方式为低电平中断 */
rEXTINT0 &= ~(0x7 << 16);
/* 写1清除pending寄存器 */
rEINTPEND |= (1 << 4);
/* 设置中断方式为不可屏蔽中断 */
rEINTMASK &= ~(1 << 4);

/* 设置中断服务向量 */
pISR_EINT4_7 = (U32)Key2_ISR;
/* 使能中断位 */
EnableIrq(BIT_EINT4_7);
}


/**************************************************
Function Name : Key3_init
Parameter : void
Description : 按键初始化函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Key3_init(void)
{
/* 初始化MMU */
MMU_Init();

/* 将GPF2设置为输入状态 */
rGPFCON &= ~(0x3 << 4);
/* 将GPF2设置为中断状态 */
rGPFCON |= (0x2 << 4);

/* 设置GPF2的中断方式为低电平中断 */
rEXTINT0 &= ~(0x7 << 8);

/* 设置中断服务向量 */
pISR_EINT2 = (U32)Key3_ISR;
/* 使能中断位 */
EnableIrq(BIT_EINT2);
}


/**************************************************
Function Name : Key4_init
Parameter : void
Description : 按键初始化函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
void Key4_init(void)
{
/* 初始化MMU */
MMU_Init();


/* 将GPF0设置为输入状态 */
rGPFCON &= ~(0x3 << 0);
/* 将GPF0设置为中断状态 */
rGPFCON |= (0x2 << 0);

/* 设置GPF0中断方式为低电平中断 */
rEXTINT0 &= ~(0x7 << 0);

/* 设置中断服务向量 */
pISR_EINT0= (U32)Key4_ISR;
/* 使能中断位 */
EnableIrq(BIT_EINT0);
}


/**************************************************
Function Name : Key1_ISR
Parameter : void
Description : 中断服务函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
static void __irq Key1_ISR(void)
{
/* 判断是否有按键K1产生中断 */
if(rINTPND == BIT_EINT1) //中断请求接受
{
/* 设置SRCPND和INTPND */
ClearPending(BIT_EINT1);

/* 在中断函数中进行LED控制处理 */
Led1_run();
}
}




/**************************************************
Function Name : Key2_ISR
Parameter : void
Description : 中断服务函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
static void __irq Key2_ISR(void)
{
/* 判断是否有按键K2产生中断 */
if(rINTPND == BIT_EINT4_7) //中断请求接受
{
/* 设置SRCPND和INTPND */
ClearPending(BIT_EINT4_7);

/* 如果中断位还为1则写1清除中断位 */
if(rEINTPEND & (1 << 4))
rEINTPEND |= (1 << 4);

/* 在中断函数中进行LED控制处理 */
Led2_run();
}
}


/**************************************************
Function Name : Key3_ISR
Parameter : void
Description : 中断服务函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
static void __irq Key3_ISR(void)
{
/* 判断是否有按键K3产生中断 */
if(rINTPND == BIT_EINT2) //中断请求接受
{
/* 设置SRCPND和INTPND */
ClearPending(BIT_EINT2);

/* 在中断函数中进行LED控制处理 */
Led3_run();
}
}




/**************************************************
Function Name : Key4_ISR
Parameter : void
Description : 中断服务函数
Return : NULL
Argement : void
Author & Date : jianglibo 2013-10-26 11:10:53
**************************************************/
static void __irq Key4_ISR(void)
{
/* 判断是否有按键K4产生中断 */
if(rINTPND == BIT_EINT0) //中断请求接受
{
/* 设置SRCPND和INTPND */
ClearPending(BIT_EINT0);

/* 在中断函数中进行LED控制处理 */
Led4_run();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值