S3C2440的外部中断程序怎么写(用C语言)?

S3C2440的外部中断程序怎么写(用C语言)?,第1张

初始化中断,我一外部中断1-4为例,中断程序请看下方:

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

点亮。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11733806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存