中断初始化
1.设置引脚为中断模式(如设置按键1对应的eint8,应设置GPGCON[1:0]=10
2.设置中断触发方式(如eint8禁止滤波,应设置EXTINT1[3:0]=0000)
3.清除相应的中断标志位(往rEINTPEND相应位写1,即rEINTPEND |= (1<<8)
4.设置EINTMASK相应位,使能中断
5.将中断处理函数首地址赋给中断入口地址(如rISR_EINT8_23 = (U32)key_handler,其key_hangdler()位中断服务程序)、
中断处理函数
1.清除中断标志位(ClearPending(BIT_EINT8_23))
2.判断中断号
3.做出相应处理
具体事例如下
mini2440 按键1按下蜂鸣器响一声,按键2按下点亮led1
/*************************************************
Function name: 这是基础实验的一个模版
Parameter : 无
Description : 做基础实验,直接调用该模板即可
Return : 无
Argument : 无
Autor & date : Daniel
**************************************************/
#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"
//int Wait_key(void);
void key_init(void);
//void Led1_run(void);
//void Led1_init(void);
static void __irq key_handler(void);
void beep_init(void);
void beep_run(void);
void Led1_run(void);
void Led1_init(void);
/*************************************************
Function name: delay
Parameter : times
Description : 延时函数
Return : void
Argument : void
Autor & date :
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
Function name: Main
Parameter : void
Description : 主功能函数
Return : void
Argument : void
Autor & date :
**************************************************/
void Main(void)
{
Led1_init();
beep_init();
MMU_Init();
key_init();
while(1);
}
/*************************************************
Function name: key_init()
Parameter : void
Description : key的初始化函数,其中K1连接的是GPG0
初始化GPG0为输入模式
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void key_init(void)
{
rGPGCON &= ~((3<<0)|(3<<6)); //设置eint8为中断模式GPGCON[1:0]=10,eint11为中断模式
rGPGCON |= (0x2<<0)|(0x2<<6);
rEXTINT1 &= ~((0xf<<0)|(0xf<<12));//设置eint8,eint11为低电平触发,禁止滤波EXTINT1[3:0]=0000
rEINTPEND |= (1<<8)|(1<<11);//eint8清除外部中断,eint11清除,
// rEINTMASK &= ~((1<<8)|(1<<11));//相应中断位清零,使能eint8中断
rEINTMASK &= ~((1<<8)|(1<<11));
pISR_EINT8_23 = (U32)key_handler;//将中断处理子函数名,即函数的首地址赋给子函数处理程序入口
EnableIrq(BIT_EINT8_23);//允许eint8中断
}
/*************************************************
Function name: beep_init()
Parameter : void
Description : Led1的初始化函数,其中Led1连接的是GPB5
初始化GPB5为输出模式
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Led1_init(void)
{
rGPBCON &= ~(3<<10);
rGPBCON |= (1<<10);
}
void Led1_run(void)
{
rGPBDAT &=~(1<<5); /*LED亮还是灭?*/
delay(1000);
rGPBDAT |=(1<<5);
delay(1000);
}
static void __irq key_handler(void)
{
if(rINTPND == BIT_EINT8_23)
{
ClearPending(BIT_EINT8_23);// 清除中断标志位
if(rEINTPEND & (1<<8))
{
rEINTPEND |= 1<<8; //清除外部中断未决寄存器的位
beep_run();
}
else if(rEINTPEND & (1<<11))
{
rEINTPEND |= 1<<11;
Led1_run();
}
}
}
void beep_init(void)
{
rGPBCON &= ~(0x3<<0);
rGPBCON |= (0x1<<0);
}
void beep_run(void)
{
rGPBDAT |= (0x1<<0);
delay(50);
rGPBDAT &= (0X0<<0);
delay(50);
}