您的位置:首页 > 其它

OK6410裸机程序(三)——外部中断

2013-03-24 14:17 323 查看

OK6410裸机程序(三)——外部中断

s3c6410具有187个多功能I/O端口,其实有127个可以被配置成外部中断。这127个引脚,可分成10个组。每个中断引脚,都有相对应的中断号,如(GPN0 = Ext.Interrupt[0]).

这里给大家分一下:
EINT0 GPN0--->GPN15 GPL8--->GPL14 GPM0--->GPM4
EINT1 GPA0--->GPA7 GPB0--->GPB6
EINT2 GPC0--->GPC7
EINT3 GPD0--->GPD5
EINT4 GPF0--->GPF14
EINT5 GPG0--->GPG7
EINT6 GPH0--->GPH9
EINT7 GPO0--->GPO15
EINT8 GPP0--->GPP14
EINT9 GPQ0--->GPQ9
每个引脚可以对应一个外部中断。
下面我们就来看看GPIO与中断设置相关的寄存器有哪些:
1.GPxCON:将GPIO配置成外部中断模式。
2.EINTxCON:外部中断触发方式选择:(000=低电平 001=高电平 01x=边沿下降触发 10x=边沿上升触发

11x=边沿触发)。

3.EINTxPEND:外部中断检测寄存器(只读,常用于中断处理函数。来检测哪个外部中断产生,从而对相应 中断处理)。
4.EINTxMASK: 外部中断使能、屏蔽寄存器。
5.EINTxFLCON:滤波器使能寄存器。
6.PRIORITY:外部中断优先控制寄存器(当同一时间有二个或多个外部中断,可设置它们的优先级)。
我们在初始化外部中断的GPIO部分时,只要设置GPXCON ,EINTXCON,EINTXMASK,EINTXFLTCON.
通过上面对GPIO的初始化后。中断信号就可以顺利通过GPIO,去向VIC(向量中断控制器)。

上面说的这些外部中断在GPIO里分成了九组,但是具体反应到VIC里他们占用哪些中断号呢?这里贴一下:
NO SOURCES Description Group
0 INT_EINT0 External interrupt 0 ~ 3 VIC0

1 INT_EINT1 External interrupt 4 ~ 11 VIC0
32 INT_EINT2 External interrupt 12 ~ 19 VIC1

33 INT_EINT3 External interrupt 20 ~ 27 VIC1
53 INT_EINT4 External interrupt Group 1 ~ Group 9 VIC1
注:这里有多个外部中断共用一个中断号情况,这里就要有它们之间的优先级决定,它们执行的先后顺序。
这里我们使用VIC,当然要先开启VIC,这个是在协处理器cp15里设置的 VE位

;开启中断VECT
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0


这样我们的VIC就能用了。
这里就简单了,就这么几个重要的寄存器
1.VICxINTSELECT :选择中断方式FIQ or IRQ(0为IRQ,1为FIQ)。
2.VICxINTENCLEAR:中断禁止,设置寄存器相应位为1。
3.VICxADDRESS:中断清除寄存器,向寄存器中定入任意值,即可清除。
4. VICxVECTADDR : 设置中断处理程序的地址。
5. VICxINTENABLE : 使能GPIO传过来的中断信号,相应位置1,使能。
其实设置到这里外部中断就能正确运行了,但是还有许多别的寄存器,比如设置什么优先级的,大家如果需要就添上去。
ARM得知来了个中断,就和VIC进行一系列的握手,得到VICADDRESS,就开始执行我们的中断处理程序了。
另一个重要的内容,就是中断处理程序里清除中断。
我们要clear 一下EINTXPEND,clear 一下VICXADDRESS。
注:我们在编程的时候一定要开ARM11的总中断。不能中断也还是进不去。
开总中断:

;允许中断,开启CPU总中断
MRS R0, CPSR         ;将CPSR保存至R0寄存器中
BIC R0, R0, #0x80    ;R0 = R0 & ~0x80,清除中断位
MSR CPSR_c, R0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: