S3C6410中断控制,基于OK6410A裸机按键中断程序3
3、VIC的配置,对应前面讲的对应前面描述的中断知识,本按键GPN0~5只涉及到了GROUP0的中断EINT即EINT_G0,具体说是EINT_G0_0~5。再次对应到VIC,我们看到其中GPN0~3对应了EINT_G0_0~3,对应了INT_EINT0;GPN4~5对应了EINT_G0_4~5,对应了INT_EINT1,这两者都是在VIC0中,分属NO0和NO1。
然后关于VIC我们总结下相应的寄存器:此处仅以VIC0为例,选出了常用的一些寄存器,其他类似于中断优先级,软中断等等,还没有研究,需要共同学习。
(1)VIC0INTSELECT——中断选择寄存器,可读可写,0-选择IRQ,1-选择FIQ,FIQ更快,一般选IRQ,32位分别对应每一个中断源;
(2)VIC0INTENABLE与VIC0INTENCLEAR,这两者是一对的,其中VIC0INTENABLE——系统中断使能寄存器,可读可写,0-中断禁止,1-中断使能,一般只能用来使能中断,不能用来写0禁止中断,禁止中断使用VIC0INTENCLEAR——系统中断清除,可写,写0无效,写1-禁止中断,大家注意配合使用,32位分别对应每一个中断源;
(3)VIC0VECTADDR[0~31] ——矢量地址寄存器,即对应的中断服务程序的入口地址,一共32个地址,对应VIC0的32个中断源。可读可写;
(4)VIC0ADDRESS——又一个矢量地址寄存器,糊涂了吧,记住它的功能就行,通过向其写入任意值,就可以清除中断服务标志,类似于外部中断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位地址,这里需要说明,这边是32个32位的数组对应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了呢,我也是这么想的,然后就下载程序进行了在线调试,可惜啥效果没有,然后又认真的把每一个寄存器又都检查了一遍,还是没有发现错误,疑惑不解啊。这就又回到了一开始埋下的伏笔那,具体见下一节。
文章评论(0条评论)
登录后参与讨论