arm中断小程序为为什么不行呢?

[复制链接]
2481|6
 楼主| cainiao402 发表于 2008-1-16 08:47 | 显示全部楼层 |阅读模式
各位大虾:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我是个大菜鸟。现在刚接触ARM,买了快easy2104学习板回来。但学到中断的时候按照书上的中断例子在ADS1.2中仿真。但都每成功。不知道是什么问题书上的例子是这样的。<br />我在建立工程时是用ARM&nbsp;Executable&nbsp;image&nbsp;for&nbsp;lpc21xx<br />书中设置的为非向量中断,但没有设到地址。书上的程序如下,请问各位大虾<br />这样的程序为什么会入不到中断呢?<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br />#define&nbsp;&nbsp;ledcon&nbsp;0x00002000&nbsp;&nbsp;&nbsp;//led4口为输出<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;//P0.14为EINT0<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;<br />void&nbsp;&nbsp;__irq&nbsp;IRQ_Eint1(void)&nbsp;&nbsp;&nbsp;//外部中断0入口地址<br />{<br />&nbsp;uint32&nbsp;i;<br />&nbsp;i=VICIRQStatus;<br />&nbsp;i=IOSET;<br /><br />&nbsp;if((i&ledcon)==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指示灯取反<br />&nbsp;&nbsp;&nbsp;&nbsp;{IOSET=ledcon;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{IOCLR=ledcon;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;while((EXTINT&0x02)!=0);&nbsp;//等待EINT1变高<br />&nbsp;EXTINT=0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清中断标志位&nbsp;&nbsp;&nbsp;<br />}&nbsp;<br />/*************主程序****************/<br />int&nbsp;main()<br />{<br />&nbsp;PINSEL0=0x20000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将KEY1(p0.14)设置为EXINT1方式输入<br />&nbsp;PINSEL1=0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其他口为普通IO口<br />&nbsp;IODIR=ledcon;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P0.13即LED4为输出<br />&nbsp;<br />&nbsp;//打开EINT1中断(不设置向量控制器,即使用非向量IRQ)<br />&nbsp;VICIntSelect=0x00000000;&nbsp;//设置所有中断为IRQ中断<br />&nbsp;VICIntEnable=0x00008000;&nbsp;//使能EXINT0<br />&nbsp;EXTINT=0x07;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清中断标志位<br />&nbsp;while(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待中断<br />&nbsp;return(0);<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;
 楼主| cainiao402 发表于 2008-1-16 13:08 | 显示全部楼层

问题是不是问得太没水平了?

问题是不是问得太没水平了?<br />大家给点意见吧!刚碰这ARM这东西,问得太菜各位大虾们不要见笑啊。呵呵。
dld2 发表于 2008-1-16 13:27 | 显示全部楼层

貌似常用的是向量中断

人家怎么找到你的中断服务程序呢?<br />你加一句:<br />&nbsp;&nbsp;&nbsp;&nbsp;VICDefVectAddr&nbsp;=&nbsp;(int)IRQ_Eint1;<br />试一下。<br />
 楼主| cainiao402 发表于 2008-1-16 15:54 | 显示全部楼层

我也试过了。

我刚开始怀疑是这样。但我加了VICDefVectAddr=(uint32)IRQ_Eint1。<br />结果也是一样的。<br />我想会不会是编译器设置的问题呢?<br />我是否应该把&nbsp;RO设为:0x40000000&nbsp;RW为:0x40003000。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序入口为:0x40000000<br />我设置了和不设置RO&nbsp;.RW都是不行的。我还漏了什么步骤吗?<br /><br />
dld2 发表于 2008-1-16 16:03 | 显示全部楼层

有可能IRQ就没有打开

看看有没有startup.s这个文件。里面有没有IRQEnable这个子程序。有就调用一下。
阿南 发表于 2008-1-16 18:11 | 显示全部楼层

比较笨,但是挺有效的方法

楼主请用光盘现成的例子试一下,看行不行.如果可以,再将您和它的进行比较,应该就可以找到问题的原因了
biao.l 发表于 2008-1-16 21:05 | 显示全部楼层

dld2说得对

IRQEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />VICIntSelect=0x00000000;<br />VICVectCntl0=0x20|0x0f;<br />VICVectAddr0=(uint32)IRQ_EINT1;<br />VICIntEnable=(1&lt&lt15);<br /><br />我用的是外中断1,改一下就行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

240

帖子

2

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