我最近在学华恒ARM9,用的是三星S3C2410当做到中断这个问题的时候,遇到了问题,还请各位大虾帮忙
问题如下:
1、不管我把中断置一还是置零都没看到区别,和芯片资料有出入,为什么会这样
2、我把中断待决寄存器和源待决寄存器的值读出来,发现有中断的时候值也不变
3、如果把中断待决寄存器和源待决寄存器置一,按理说应该是一直触发中断吧,可是为什么只有一次中断
PS:初次接触嵌入式,很多东西不懂,还请各位发点时间帮我解决下,谢谢了
你的第一个问题我不知道是什么意思。。。你置位的是什么寄存器。中断寄存器很多。有使能寄存器,有状态寄存器,有mask寄存器。你说你置位就会有中断吗?你置的哪一个。我的理解是当状态为1时我才判断有中断来了。
还有你翻译很是不好。。中断待决寄存器
中断源我想应该不是你来触发他的吧。。我觉得。。呵呵。。
呵呵,那个翻译是根据华恒光盘资料里的翻译的。
现在说那个中断问题,可能我表述不清楚吧,因为刚接触所以很多概念还是有点不清楚,不好意思啊
“中断屏蔽寄存器INTMSK
每个中断源对应一个位,如果某位被置1,CPU 不会响应相应的中断请求(注
意即使这种情况下,SRCPND 的位还是会置1),如果被置0,相应中断请求可以
被响应。”这是华恒光盘资料的,其中有一个外部中断EXIT5是直接由引脚出来的,我把中断屏蔽寄存器的EXIT5位置一和置零都没发现有区别
另外一个问题是那个SRCPND 和INTPND(就是我翻译成源待决和中断待决的寄存器,呵呵)好像触发中断时也没变化啊
那么你想有什么变化,你试试键盘user_key(如果有的话),应该会从串口打印一行
UserKeyProcessThread Processing! -K2
::: SYSINTR_USER_KEY OEMInterruptDone
之类的信息。这就说明有IST响应中断了。
也不知道你说的EINT5关联的是哪个逻辑中断号,怎么看变化
我把中断屏蔽寄存器的EXIT5位置一和置零都没发现有区别
你把这一位置为1,就不会有中断来了。。你把这位置为0,如果有中断肯定在状态为中有显示。
SRCPND INTPND。。这两个寄存器要看你在什么位置打印的。。可能在你打印的时候很快就被置位了。。你在仔细找找
系统模式堆栈程序状态寄存器CPSR??我没考虑到这个,我试试!
键盘程序我试过,我是把EXIT5脚引出来控制外部中断,可以看到变化。可是在一个华恒实验指导书中的一个关于中断的实验中却发现不管我是否将其置位都可以出发中断
具体程序:
void testirq_interrupt(int irq,void *d,struct pt_regs *regs)
{
/*clear interrupt register for EINT5*/
SRCPND &= (~0x00000010); //bit4
INTPND = INTPND;
EINTPEND &= (~0x00000020); //bit5我用的EXIT5现在是置零,我把它置一效果一样
printk("Entered an interrupt! Beginning interrupt service!\n");
}
SRCPND的第四位是控制外部中断EXIT4-EXIT7的,
“源请求寄存器SRCPND 由32 位组成,每一位与一个中断源相关。如果某个中断源产生中断请求并等待中断服务,某位将会被置1。相应地,寄存器也指出了哪个中断源在请求服务。注意SRCPND 中的每个位是由中断源自动置位的,与INTMASK 寄存器无关。此外,
///SRCPND 寄存器不会被优先级逻辑影响。在中断服务函数中必须清零SRCPND 的相应位,否则,中断控制器会认为同一个源的另一个中断///(我没有将它清零也只中断一次)
换句话说,如果SRCPND 的某个位仍然为1,中断控制器会认为又有一个有效的新的中断在请求服务。清零相应位的时机由用户需求决定。如果想要从同一个中断源接收另外一个有效的中断,应该在刚进入ISR 的时候清零,然后使能中断。可以通过SRCPND 写入数据来清零某位,但是注意只有SRCPND 中为1 的位会被写成写入数据中的位,而SRCPND 中为0 的位不会改变”
刚接触,可能问题很白痴,还请各位大侠帮忙,小女子谢过啦