原创 [博客大赛]S3C6410中断控制,基于OK6410A裸机按键中断程序(3)

2014-4-20 14:19 1279 12 12 分类: MCU/ 嵌入式 文集: S3C6410

S3C6410中断控制,基于OK6410A裸机按键中断程序3

3VIC的配置,对应前面讲的对应前面描述的中断知识,本按键GPN0~5只涉及到了GROUP0的中断EINTEINT_G0,具体说是EINT_G0_0~5。再次对应到VIC,我们看到其中GPN0~3对应了EINT_G0_0~3,对应了INT_EINT0GPN4~5对应了EINT_G0_4~5,对应了INT_EINT1,这两者都是在VIC0中,分属NO0NO1

然后关于VIC我们总结下相应的寄存器:此处仅以VIC0为例,选出了常用的一些寄存器,其他类似于中断优先级,软中断等等,还没有研究,需要共同学习。

1VIC0INTSELECT——中断选择寄存器,可读可写,0-选择IRQ1-选择FIQFIQ更快,一般选IRQ32位分别对应每一个中断源;

2VIC0INTENABLEVIC0INTENCLEAR,这两者是一对的,其中VIC0INTENABLE——系统中断使能寄存器,可读可写,0-中断禁止,1-中断使能,一般只能用来使能中断,不能用来写0禁止中断,禁止中断使用VIC0INTENCLEAR——系统中断清除,可写,写0无效,写1-禁止中断,大家注意配合使用,32位分别对应每一个中断源;

3VIC0VECTADDR[0~31] ——矢量地址寄存器,即对应的中断服务程序的入口地址,一共32个地址,对应VIC032个中断源。可读可写;

4VIC0ADDRESS——又一个矢量地址寄存器,糊涂了吧,记住它的功能就行,通过向其写入任意值,就可以清除中断服务标志,类似于外部中断EINT中的EINT0PEND了,我们可以通过它在中断服务程序中清除系统中断标志,32位分别对应每一个中断源;

 

介绍完了这些VIC对应的寄存器,现在开始说说其配置的流程:

(1)       首先肯定是需要设定中断的类型IRQ还是FIQ,配置之前呢,先把对应的中断关了,因此,先需要禁止对应的系统中断。

//关闭对应的中断,对应位写1关闭系统中断,只能写32位,同rVIC1INTENCLEAR一起与rVIC0INTENABLE/rVIC1INTENABLE配套

rVIC0INTENCLEAR |= (0x01<<0|(0x01<<1));//外部中断0_0~5属于系统中断INT_EINT0/INT_EINT1

2)那其次就是上面说的设定中断的类型IRQ还是FIQ了。

//设置系统中断类型,对应位写0-IRQ,1-FIQ,只能写32位,同rVIC1INTSELECT一起

rVIC0INTSELECT &= ~((0x01<<0)|(0x01<<1));//外部中断0_0~5属于系统中断INT_EINT0/INT_EINT1

3)然后呢清除系统中断标志

/清除系统中断,对应位写0或者1都行,只能写32位,同rVIC1ADDRESS一起

rVIC0ADDRESS &= ~((0x01<<0)|(0x01<<1));//外部中断0_0~5属于系统中断INT_EINT0/INT_EINT1

4)设定中断服务程序的入口地址

//写中断处理程序地址,rVIC0VECTADDR

VIC0VECTADDR[0] = (unsigned)Key1_handler;//unsigned说明是32位地址

VIC0VECTADDR[1] = (unsigned)Key2_handler;//unsigned说明是32位地址,这里需要说明,这边是3232位的数组对应32个中断源的处理地址,因此宏定义的时候需要注意,此处宏定义跟其他寄存器定义有区别。

#define VIC0VECTADDR             (( unsigned *)(0x71200100))

#define VIC1VECTADDR                    (( unsigned *)(0x71300100))

5)使能系统中断

//使能系统中断,对应位写1使能系统中断,只能写32位,同rVIC1INTENABLE一起与rVIC0INTENCLEAR/rVIC1INTENCLEAR配套

rVIC0INTENABLE |= (0x01<<0|(0x01<<1));//外部中断0_0~5属于系统中断INT_EINT0/INT_EINT1

GPIO的配置

这样一个简单的系统中断VIC配置就算完成了。

 

4、接下来就是中断服务程序了,这个大家都弄腻了,需要注意的就是清除中断标志,从上面可以看出,这里需要清除两个中断标志,分别是外部中断EINT和系统中断VIC的标志,例如rVIC0ADDRESS &= ~(0x01<<0);//清除系统中断INT_EINT0

以及rEINT0PEND |= (0x01<<0);//清除外部中断0_0

例外可以通过读rEINT0PEND的某一位,知道具体是外部中断EINT_G0的哪一个口发生中断。

 

大家是不是觉得这样就OK了呢,我也是这么想的,然后就下载程序进行了在线调试,可惜啥效果没有,然后又认真的把每一个寄存器又都检查了一遍,还是没有发现错误,疑惑不解啊。这就又回到了一开始埋下的伏笔那,具体见下一节。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /3 下一条