我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1479|回复: 0

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

[复制链接]

该用户从未签到

1万

主题

1292

回帖

936

积分

管理员

积分
936

社区居民最爱沙发原创达人社区明星终身成就奖优秀斑竹奖宣传大使奖特殊贡献奖

QQ
发表于 2013-7-30 19:11:01 | 显示全部楼层 |阅读模式
一、2440按键中断的步骤1,初始化寄存器GPGCON,设置对应的GPG0,GPG3,GPG5,GPG6,GPG7,GPG11为外部中断的功能接口,它们分别对应外部中断EINT8,EINT11,EINT13,EINT14,EINT15,EINT192,设置外部按键中断的触发方式这里包括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的意思.所以,我对这三个寄存器初始化时 没有设置,取默认的复位值,即0x005,将中断服务函数的地址传给对应的中断向量处(重点理解,解释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("eint11n");rEINTPEND |= 1<< 8;//这里也是}……}三、关于中断提示:超级终端提示Dummy_isr error, interrupt number: 5, INTMSK = 0xffffffdf论坛里面有人求助,看了贴说要把MMU加进去,是这样做的,在Main.c中包含头文件#i nclude "mmu.h" 把mmu.c和mmu.h加到工程中,接着在主函数中调用MMU_Init();初始化MMU,好像就解决了,不过自己也不知道为什么要这样做,呵呵。</div
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表