lxpkaka的笔记 https://bbs.21ic.com/?565798 [收藏] [复制] [RSS]

日志

学习2440外部按键中断后的理解和疑问

已有 1072 次阅读2011-5-5 00:44 |系统分类:ARM| 中断

一、2440按键中断的步骤
1,初始化寄存器GPGCON,设置对应的GPG0,GPG3,GPG5,GPG6,GPG7,GPG11为外部中断的功能接口,它们分别对应外部中断EINT8,EINT11,EINT13,EINT14,EINT15,EINT19

2,设置外部按键中断的触发方式
这里包括EXTINT1和EXTINT2两个寄存器的配置,分别对EINT8,EINT11,EINT13,EINT14,EINT15,EINT19六个外部中断设定!按键没按下时为高电平,被按下后为低电平;所以设定为低电平触发!

3,设定各个按键的中断源不屏蔽!
这里就是设置寄存器EINTMASK,将对应EINT8,EINT11,EINT13,EINT14,EINT15,EINT19的位,置0!也就是不屏蔽! 置1表示屏蔽,初始化时为屏蔽的!

4,设定寄存器EINTPEND,SRCPND,INTPND(2440官方代码中设置了,个人觉得没必要,测试通过了)
官方设置是这样的: 将EINTPEND,SRCPND,INTPND中对应的EINT8,EINT11,EINT13,EINT14,EINT15,EINT19位全部置1处理;根据2440文档9-33,14-8,14-15的说明,1=Occur interrupt.表示中断发生!It is cleard by writing “1” PS:因为是中断的初始化,复位后怎么会立马有中断请求呢?可能我没能理解这里置1的意思.所以,我对这三个寄存器初始化时 没有设置,取默认的复位值,即0x00

5,将中断服务函数的地址传给对应的中断向量处(重点理解,解释pISR_EINT8_23=(U32)extint8_23)
代码为pISR_EINT8_23=(U32)extint8_23;//extint8_23为中断服务函数的地址!pISR_EINT8_23为指向中断向量表的HandleEINT8_23(2440init.s中). //#define pISR_EINT8_23 (_ISR_STARTADDRESS+0x34) 这里的_ISR_STARTADDRESS=0x33ffff00,为什么是这个数呢,在网上查了很多,有位网友是这样解释的:_ISR_STARTADDRESS=_RAM_ENDADDRESS-0x100,那么_RAM_ENDADDRESS又是多少呢(参考2440用户手册1.3.2),因为2440采用了2片32M的SDRAM芯片并接形成32位总线数据宽度。物理起始地址为0x30000000,再加上64M的空间,就是_RAM_ENDADDRESS的值0x34000000,那这里为什么是_RAM_ENDADDRESS-0x100呢,为什么是减去0x100(256字节的空间)呢?谁能帮我解释下,谢谢

答:
 _RAM_ENDADDRESS的值不是0x34000000,而是比其小一些。_RAM_ENDADDRESS之后还要存放MMU所需的一些数据。不一定要减去0x100,可以少一些的,但对齐0x100不是很好吗?而且以后也可以扩展。

6,设定外部按键总中断源EINT8_23不屏蔽!注意这里设置的是寄存器INTMSK,而不是EINTMASK;我把INTMSK称为中断源的总屏蔽寄存器,EINTMASK称为各个中断的屏蔽寄存器,不知道叫起来晕不晕,呵呵

7,等待中断发生,或者结束

8,最后关闭总中断源,设置寄存器INTMSK

二、疑问
有点不理解:外部按键中断中,当中断发生时,寄存器INTPND,SRCPND,EINTPEND为什么是置1来清除中断请求而不是写0来清除呢?当外部按键没有中断时,寄存器INTPND,SRCPND,EINTPEND中对应的按键中断位会自动写0吗?寄存器INTPND,SRCPND,EINTPEND中各个位的"0=Not occur,1=Occur interrupt"该怎样理解呢
keyscan.c中的部分代码
if(rINTPND==BIT_EINT8_23)             
    {
        ClearPending(BIT_EINT8_23);    //这里为什么不是写0来清除中断请求呢

        if(rEINTPEND&(1<<8)) 
        {
            //Uart_Printf("eint11\n");
            rEINTPEND |= 1<< 8;        //这里也是
        }
        ……
    }

三、关于中断提示:超级终端提示Dummy_isr error, interrupt number: 5, INTMSK = 0xffffffdf  
论坛里面有人求助,看了贴说要把MMU加进去,是这样做的,在Main.c中包含头文件#include "mmu.h" 把
mmu.c和mmu.h加到工程中,接着在主函数中调用MMU_Init();初始化MMU,好像就解决了,不过自己也不知道为什么要这样做,呵呵。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)