打印
[ARM入门]

请教一个很简单的中断问题

[复制链接]
1939|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fatbobwang|  楼主 | 2014-1-25 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我刚开始学习ARM,对于ARM的中断设置不是很清楚,原来做过51,虽然有差别,但中断的原理还是知道的。
下面这段代码不能工作,就想实现一个按下按钮后改变led的状态,我就知道arm的中断应该如何使用了。
CPU是s3c2440,其中GPG0接按钮,GPB7接led。开发环境为ADS1.2。
请不要给出示例,网上很多都是复制转发的,根本无法编译通过。书上讲的也是好几个按钮和好几个led的示例,没有特别简单能说清楚的。

请各位给予指导,下面的程序要如何修改才能实现利用外部中断实现这个功能,谢谢。

#include "2440addr.h"
#include "2440lib.h"

void __irq int8_int(void);

void __irq int8_int(void)  //按下按钮进入中断程序
{

      rGPBDAT=0<<7;   // //GPB7脚置位,led亮
      rEINTPEND=(1<<8);
      ClearPending(BIT_EINT8_23);
}


void Main()
{
   rSRCPND=rSRCPND;  //清除
   rINTPND=rINTPND;  //同上
   rGPGCON=rGPGCON|(1<<1); //设置GPG0脚为EINT
   //rGPGUP|=|(1<<0);   //引脚使用第二功能
   pISR_EINT8_23=(U32)int8_int;  //中断指针
   rEXTINT1=rEXTINT1&~((1<<0)|(1<<1)|(1<<2));  //设置为下降沿触发
   rGPBCON=0x155555;  //设置GPB为输出
   rINTMSK&=~(1<<5);  //设置中断响应
   rEINTMASK&=~(1<<8);  //同上
   rSRCPND|=1<<5;   //将中断响应指到EINT8
   rINTPND|=1<<5;   //同上
   rEINTPEND=0xFFFFFF;  //挂起中断

   rGPBDAT=1<<7;   //GPB7脚置位,led灭

相关帖子

沙发
guangbiao| | 2014-1-25 10:50 | 只看该作者
楼主为啥还要用ADS,这个开发环境很古老了,而且很多配置都需要手动添加及修改,好是繁琐。
你换成MDK或者IAR这样的开发环境,会达到事半功倍的效果。
关于你上面的代码,你看一下你的启动引导文件及中断向量表是否存在及正确,然后再查一下你的分散加载文件内容是否正确。

使用特权

评论回复
板凳
fatbobwang|  楼主 | 2014-1-25 11:00 | 只看该作者
现在的问题和开发环境没关系,我现在就是想问下这个最简单的功能怎么实现。
你说的向量表是从厂商那里下载的,这些文件内容是正确的。
目前编译本身没任何问题,就是想问下这么个简单的中断功能如何实现而已。。。
我在百度上发了帖子也没人能给出正确明了的答复,真的没人会吗?

使用特权

评论回复
地板
fatbobwang|  楼主 | 2014-1-25 12:12 | 只看该作者
请各位帮着指点一下就行,我现在都不确定中断是不是这样声明的。另外寄存器的设置是不是有错误啊。。。 大家给个明示吧,谢谢!

使用特权

评论回复
5
Small_Road| | 2014-1-27 19:26 | 只看该作者
强烈建议用MDK。。。

使用特权

评论回复
6
fatbobwang|  楼主 | 2014-1-27 19:53 | 只看该作者
这个。。。。其实只是软件设置上有区别吧。。。。
我现在是有点不知道中断代码该怎么用。。。。

使用特权

评论回复
7
xinzha| | 2014-1-27 22:11 | 只看该作者
cpsr中的中断使能没有打开,cpsr中的I位才是总的中断开关。

使用特权

评论回复
8
fatbobwang|  楼主 | 2014-1-27 22:54 | 只看该作者
请问楼上,这个使能是在什么地方设置的,是代码中还是编译器本身的环境中呢。。。我刚刚学这个,很多还不太了解,忘见谅。。。

使用特权

评论回复
9
xinzha| | 2014-1-28 22:25 | 只看该作者
我没见过ide有设置这个的,但是不排除会有,因为我用过的工具很少,只有ads和rvds。
指令是类似于下面的模式,我凭**写的,你自己去查查会有更深的印象,那个0xc0代表bit7和bit6都被清零,fiq和irq使能,具体怎么用自己看需求。如果是嵌在c代码中别忘了__asm关键字。
mrs r0, cpsr
bic r0, 0xc0
msr cpsr, r0

使用特权

评论回复
10
fatbobwang|  楼主 | 2014-1-29 22:48 | 只看该作者
感谢楼上,我再查下

使用特权

评论回复
11
上大人孔乙己| | 2014-2-7 17:52 | 只看该作者
1 用汇编去开中断(寄存器没编制),其实就是写状态寄存器 2 启动代码中的中断向量表决定了中断发生后跳转到哪,所以中断向量表必须正确设置,可以直接跳转到你的中断服务程序,绕过地址寄存器。 3 分散加载文件要正确,就是说中断向量表要从0地址处放置,因为当arm上电后会从0地址处取指令(其实之前还有boot block)

使用特权

评论回复
12
fatbobwang|  楼主 | 2014-2-21 09:28 | 只看该作者
我已经搞定了,这里有人说到点上了,不过也没给出具体办法,我在ADS上MDK上都实现了。
难怪卖板子的说国内玩ARM的不多,懂的更少,找资料很困难。

使用特权

评论回复
13
mj5742356| | 2014-3-3 13:52 | 只看该作者
ARM的中断有几个开关,系统的中断,还有中断源的开关,最后才到具体IO口的中断配置,不知道你都配好了没。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝