电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

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

近来为了学习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配置——?,这是我们现在所能想到的,大家也觉得分析的不错吧,可惜错误也再此埋下了伏笔,即是问号处,我们缺失了一个配置,这个配置有的启动文件里已经帮你写了,所以好多教程也没有怎么提。此处不表,最后会说明。

博主
jsrdzhb1990@yeah.net
水滴石穿,鲲鹏万里
一个刚刚睡醒的菜鸟~~
点击跳转