近来为了学习Linux嵌入式系统的移植,买了块OK6410A的开发板,当然从裸机程序的开发开始了,然后不可避免遇到了按键中断这样的程序,下面按照思考的过程,写下总结吧!
首先,弄清楚硬件连接,通过查看原理图,得到了这样的硬件连接
KEYINT1-GPN0-EINT_G0_0
KEYINT2-GPN1-EINT_G0_1
KEYINT3-GPN2-EINT_G0_2
KEYINT4-GPN3-EINT_G0_3
KEYINT5-GPN4-EINT_G0_4
KEYINT6-GPN5-EINT_G0_5,然后就去S3C6410datasheet寻找对应的端口说明吧,一看不知道,看了吓一跳,三星这个英文文档写的,感觉忒不严谨了,有叫“External Interrupt Group 1”的,有叫“Ext. Interrupt Group 8”的,还有“Ext. Interrupt Group”的,其实他们都是并列关系,外部中断的9个Group,你说为啥不统一写成“Ext. Interrupt Group0、Ext. Interrupt Group1”这样呢,非要一会儿缩写一会儿把0都省去了,害得我前后看了几遍GPIO部分。
既然端口对应上了外部中断EINT,决定去统一的整理下S3C6410的中断机制。
1、外部中断源控制器EINT,他一共被分为9个组,每组里面对应不同的IO管脚,S3C6410共有127个外部中断,其外接I/O引脚及分组如下:
外部中断组0 EINT_G0 GPN0---GPN15 、GPL8---GPL14、GPM0---GPM4
外部中断组1 EINT_G1 GPA0---GPA7、GPB0---GPB6
外部中断组2 EINT_G2 GPC0---GPC7
外部中断组3 EINT_G3 GPD0---GPD5
外部中断组4 EINT_G4 GPF0---GPF14
外部中断组5 EINT_G5 GPG0---GPG7
外部中断组6 EINT_G6 GPH0---GPH9
外部中断组7 EINT_G7 GPO0---GPO15
外部中断组8 EINT_G8 GPP0---GPP14
外部中断组9 EINT_G9 GPQ0---GPQ9
以上127个引脚每个引脚都可以产生一个外部中断
2、ARM的总中断控制器VIC,他由两个VIC组成,联合起来控制了64个中断源,每个控制32个,因此我们发现VIC的控制寄存器都是对应的有VIC0就有VIC1,其中我们找到了与外部中断有关的127个外部中断在VIC里的中断号的对应关系:
NO. 中断源 说明明 GROUP
0 INT_EINT0 外部中断组0 (EINT_G0)引脚号0-3 VIC0
1 INT_EINT1 外部中断组0 (EINT_G0)引脚号4-11 VIC0
32 INT_EINT2 外部中断组0 (EINT_G0)引脚号12-19 VIC1
33 INT_EINT3 外部中断组0 (EINT_G0)引脚号20-27 VIC1
53 INT_EINT4 外部中断组1-9 (EINT_G1~9) VIC1
我们发现属于外部中断组0的27个中断占用了VIC里的4个中断号,外部中断组1-9只占用了1个中断号,世界就是这么的不公平,努力吧!
3、S3C6410的中断流程,说到这里,大家是不是觉得有点乱(如果使用过STM32应该不会乱,因为STM32的中断也是两级控制的),我们总结下具体的中断流程:
外设(GPIO)——》EINT——》VIC——?,因此对应的我们编程序也就是
外设配置——》EINT配置——VIC配置——?,这是我们现在所能想到的,大家也觉得分析的不错吧,可惜错误也再此埋下了伏笔,即是问号处,我们缺失了一个配置,这个配置有的启动文件里已经帮你写了,所以好多教程也没有怎么提。此处不表,最后会说明。
hzddyx_297768481 2015-4-7 21:00
赞一个!
用户1768597 2014-8-8 22:57