[ARM入门] 请教一个很简单的中断问题

[复制链接]
2363|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 | 显示全部楼层
请各位帮着指点一下就行,我现在都不确定中断是不是这样声明的。另外寄存器的设置是不是有错误啊。。。 大家给个明示吧,谢谢!
Small_Road 发表于 2014-1-27 19:26 | 显示全部楼层
强烈建议用MDK。。。
 楼主| fatbobwang 发表于 2014-1-27 19:53 | 显示全部楼层
这个。。。。其实只是软件设置上有区别吧。。。。
我现在是有点不知道中断代码该怎么用。。。。
xinzha 发表于 2014-1-27 22:11 | 显示全部楼层
cpsr中的中断使能没有打开,cpsr中的I位才是总的中断开关。
 楼主| fatbobwang 发表于 2014-1-27 22:54 | 显示全部楼层
请问楼上,这个使能是在什么地方设置的,是代码中还是编译器本身的环境中呢。。。我刚刚学这个,很多还不太了解,忘见谅。。。
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
 楼主| fatbobwang 发表于 2014-1-29 22:48 | 显示全部楼层
感谢楼上,我再查下
上大人孔乙己 发表于 2014-2-7 17:52 | 显示全部楼层
1 用汇编去开中断(寄存器没编制),其实就是写状态寄存器 2 启动代码中的中断向量表决定了中断发生后跳转到哪,所以中断向量表必须正确设置,可以直接跳转到你的中断服务程序,绕过地址寄存器。 3 分散加载文件要正确,就是说中断向量表要从0地址处放置,因为当arm上电后会从0地址处取指令(其实之前还有boot block)
 楼主| fatbobwang 发表于 2014-2-21 09:28 | 显示全部楼层
我已经搞定了,这里有人说到点上了,不过也没给出具体办法,我在ADS上MDK上都实现了。
难怪卖板子的说国内玩ARM的不多,懂的更少,找资料很困难。
mj5742356 发表于 2014-3-3 13:52 | 显示全部楼层
ARM的中断有几个开关,系统的中断,还有中断源的开关,最后才到具体IO口的中断配置,不知道你都配好了没。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

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