void Key_Init(void)
{
rGPFCON&=~((3<<2)|(3<<4)|(3<<6)|(3<<8))//初始化GPF1,GPF2,GPF3,GPF4(分别对应KEY2,KEY3,KEY4,KEY5)
rGPFCON|=(2<<2)|(2<<4)|(2<<6)|(2<<8)//将GPF1,GPF2,GPF3,GPF4分别设置为EINT
}
然后设置中断控制寄存器:
void Irq_Init(void)
{
rINTMSK &= ~((1<<2)|(1<<3)|(1<<4)|(1<<5))//将INTMSK(中断屏蔽寄存器)中的EINT1-4_7设置为可服务状态
rEINTMASK &= ~((1<<4))//外部中断屏蔽寄存器(KEY1,KEY2,KEY3和KEY4分别对应EINT4)
}
然后就要写中断服务函数了。
void Isr_Init(void)
{
pISR_EINT1=(unsigned int)Eint1_Isr
}
void __irq Eint1_Isr(void)
{
unsigned long val
val=rEINTPEND
if(val&(1<<1))
{
rEINTPEND |=1<<8
Led1_On()
Delay1s()
Led1_Off()
}
rSRCPND |=1<<1
rINTPND |=1<<1
}
不明白的可以追问我。
看完中断控制系统后决定写一个按键中断程序,四个按键对应四个外部中断,每个按键按下时对于led
亮。
主函数中我们需要做以下工作:
1
,配置
I/O
口为外部中断模式
(rGPGCON)
,配置
led
引脚为输出
(rGPBCON)
,灭
led(rGPBDAT)
。这些工作我们可以
直接
#define
一下然后在主函数中引用。如
GPG0,1,2,4
分别对于
EINT8,11,13,14
。需要配置为外部中断模式,我们可
以这样写:
#define GPG0_eint (2<<(0*2))
#define GPG1_eint (2<<(1*2))
#define GPG2_eint (2<<(2*2))
#define GPG4_eint (2<<(4*2))
然后主函数中这样写:
rGPGCON=GPG0_eint | GPG1_eint | GPG2_eint | GPG4_eint
;为什么要用
“|”
符号,是因为我
们要保证
1
能被正常写进相应位。其他寄存器的 *** 作相信大家也能写出来了吧。
2
,初始化
MMU
,直接调用函数
MMU_Init()
为什么调用这个函数我也不是很明白,似乎需要进行地址映射什么的,大
家自己百度之就
ok
,相信学到后面再回过来看这个初始化,应该问题不大了。
3
,
清寄存器相应位。
S3C2440
支持
60
个中断源,
其中有
EINT0-EINT23
这
24
个外部中断,
EINT0-3
为系统保留,
EINT4-7
为子中断,对应中断源为
EINT4_7
,
EINT8-23
,对应中断源为
EINT8_23
;其他的为内部中断,内部中断也分带子中断
和不带子中断。外部中断(
0-3
)需要清
rSRCPND,rINTPND,
直接往相应位写
1
即可清除。也可以直接调用函数
ClearPending(bit)
括号内的
bit
为对应的中断值。如若中断为
EINT8-23
,则这样写:
ClearPending(EINT8-23)
。带子
中断的也需要清子中断。道理和前面一样。然后就要使能中断
(EINTMASK&rINTMSK)
这里又涉及到两个函数:
EnableIrq(bit)&EnableSubIrq(bit)
,这里的
bit
与上相同。然后再根据情况设定中断触发方式和中断优先级。我这里
EINT8_23
中断默认为低电平触发而且优先级都一样,所以不需要设置。然后装入中断服务函数地址:
pISR_EINT8_23=(U32)KEY_handle
加入这句话后
2440
才会找到相应中断地址进入服务函数。当然,
key_handle()
函
数需要在
main
之前进行声明,这和
51
不一样,需要注意。
4
,进入中断服务函数处理。中断服务函数格式为:
void __irq
KEY_handle
(),
红色部分可根据函数名改变,前面的必须
这样写。不然
2440
不能识别出这是个中断服务函数。进入函数后,首先应清各中断寄存器的相应位。与之前在
main
里面处理的一样。之后再进行其他的处理。
至此,程序完成,在线调试,按键按下,相应
led
点亮。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)