[ZLG-ARM] 看看这个程序,LPC2214的EINT0中断怎样才能进去啊?

[复制链接]
2933|5
 楼主| mcuduoduo 发表于 2008-2-14 15:04 | 显示全部楼层 |阅读模式
我用周工的ARM&nbsp;Executable&nbsp;Image&nbsp;for&nbsp;lpc2100模板,在ADS1.2中建了一个项目,然后添加如下文件main.c,模板其他文件未做任何改动.&nbsp;<br />该程序简单至极,仅仅测试EINT0中断响应并设置一个标志而已.我用示波器看到EINT0输入变低,在easy&nbsp;JTAG调试时也确实看到IRQstatus&nbsp;EINT0标志位起来了,可是程序就是进不了中断,奇怪死了.我后来用GPIO方式查询EINT0是完全没问题的.<br />下面是完整的main.c文件,请问哪里还需要设置一下呢?<br /><br />#include&nbsp;&quot;config.h&quot;<br /><br />unsigned&nbsp;int&nbsp;iIntHappened;<br /><br /><br />//EINT0&nbsp;service<br />void&nbsp;&nbsp;__irq&nbsp;&nbsp;IRQ_EINT0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;iIntHappened&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;=&nbsp;0x00004000;&nbsp;&nbsp;&nbsp;&nbsp;//关中断,待主程序循环中处理后再开启<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />//main&nbsp;program<br />int&nbsp;main&nbsp;(void)<br />{//&nbsp;add&nbsp;user&nbsp;source&nbsp;code&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//interrupt&nbsp;config<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;PINSEL1;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;&=&nbsp;0x3bfffffc;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;|=&nbsp;0x00000001;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P0.16&nbsp;作为中断输入<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;//EINT0&nbsp;低电平有效<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;=&nbsp;0x00000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;0x0000000f;&nbsp;&nbsp;&nbsp;&nbsp;//清除此前可能的中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//all&nbsp;interrupt&nbsp;source&nbsp;as&nbsp;IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x2e;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EINT0&nbsp;as&nbsp;IRQ&nbsp;slot0<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_EINT0;&nbsp;&nbsp;&nbsp;&nbsp;//EINT0&nbsp;sservice&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00004000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//enable&nbsp;EINT0<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//----------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(iIntHappened)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIntHappened&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00004000;&nbsp;//再开启中断&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}
hxl2008 发表于 2008-2-14 15:41 | 显示全部楼层

需使能IRQ中断

使用2100的模板,需在主程序中调用IRQEnable()使能IRQ中断。
zlgarm 发表于 2008-2-14 16:00 | 显示全部楼层

mcuduoduo,您好!

您的程序没有开启IRQ中断。请在中断初始化中加入以下代码。<br /><br />IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;使能IRQ中断&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_zhangxiaomeng
zlgarm 发表于 2008-2-15 08:58 | 显示全部楼层

中断

mcuduoduo&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;对于您的问题及程序有一下两点需要注意:<br />&nbsp;&nbsp;&nbsp;&nbsp;1、中断服务程序结束要清楚中断标志EXTINT&nbsp;=&nbsp;0X01及结束向量中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;2、在LPC2100系列模版中是没有IRQEnable()这个函数的,如果需要使能中断,可以把Startup.s中的设置系统模式堆栈&nbsp;MSR&nbsp;CPSR_c,&nbsp;#0xdf&nbsp;改为<br />MSR&nbsp;CPSR_c,&nbsp;#0x5f&nbsp;这样就可以打开中断。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_lijintao
armecos 发表于 2008-2-15 10:26 | 显示全部楼层

这样写太乱了

&nbsp;&nbsp;&nbsp;&nbsp;一大堆寄存器,思路混乱,抽象程度不够,不符合人的思维习惯,换一种CPU又要重来。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;下面是一个万能中断模板,适合各种CPU,符合人类思维习惯。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<b>万能中断写法</b>
 楼主| mcuduoduo 发表于 2008-2-15 11:45 | 显示全部楼层

非常感谢

非常感谢楼上几位大牛,新手这就去仔细看看然后再试.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

41

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部