[ZLG-ARM] 如何开了一个FIQ的情况下再开其它的IRQ

[复制链接]
3452|13
 楼主| w_ang 发表于 2007-3-22 17:34 | 显示全部楼层 |阅读模式
ic, vi, tc, BLE, TE
在只开FIQ或IRQ时,都正常,但同时开时,只有FIQ,却没有IRQ,请高手指教,如何才能让其都产生中断.<br />我的程序如下://T0为匹配0的中断,FIQ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0PR&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;T0MCR&nbsp;=0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;T0MR0&nbsp;=Fpclk/20000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FIQEnable();&nbsp;&nbsp;&nbsp;//快中断使能<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;VICIntSelect|(1&lt&lt4);&nbsp;&nbsp;//FIQ<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VICIntEnable|(1&lt&lt4);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T0TCR&nbsp;=0x01;&nbsp;&nbsp;&nbsp;&nbsp;//开计数器<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//T1为匹配0的中断,IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1TC&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清T1<br />&nbsp;&nbsp;&nbsp;&nbsp;T1PR&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//预分频<br />&nbsp;&nbsp;&nbsp;&nbsp;T1CTCR&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//T1为定时器<br />&nbsp;&nbsp;&nbsp;&nbsp;T1MCR&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;//T1MR0匹配后复位,并产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T1MR0&nbsp;=&nbsp;Fpclk/1000;//初始频率为1000Hz<br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;//复位<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中断使能<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;//分配为IRQ<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x20|0x05;&nbsp;&nbsp;&nbsp;&nbsp;//分配优生级<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0=(uint32)T1MC0;//设置中断地址<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;VICIntEnable|(1&lt&lt5);&nbsp;&nbsp;&nbsp;&nbsp;//开T1匹配0中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=0x01;&nbsp;&nbsp;&nbsp;&nbsp;//开计数器<br /><br /><br />//T1&nbsp;MR0匹配中断函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;__irq&nbsp;T1MC0(void)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1IR&nbsp;=&nbsp;1&lt&lt0&nbsp;;//清中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T1MR0&nbsp;=&nbsp;Fpclk/500;//设定速度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;//向量中断处理结束<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />//FIQ的中断函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;FIQ_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//while(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;change&nbsp;it&nbsp;to&nbsp;your&nbsp;code&nbsp;&nbsp;这一句替换为自己的代码<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LEDON();<br />&nbsp;&nbsp;&nbsp;&nbsp;T0IR&nbsp;=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;LEDOFF();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />
zlgARM 发表于 2007-3-22 18:34 | 显示全部楼层

RE

w_ang&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable()最终是跳到启动文件里的IRQEnable执行;<br />&nbsp;&nbsp;&nbsp;&nbsp;FIQDisable()最终是跳到启动文件里的FIQDisable执行。<br />&nbsp;&nbsp;&nbsp;&nbsp;如您所见,这两个操作是彼此互斥的。<br />&nbsp;&nbsp;&nbsp;&nbsp;您可以自己参照着启动文件和IRQEnable()的写法,写一个软中断,令CPSR使能IRQ和FIQ中断。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />IRQEnable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;R0,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;R0,&nbsp;R0,&nbsp;#NoInt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;R0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />FIQDisable<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;关FIQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;R0,&nbsp;#NoFIQ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;R0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR<br />
 楼主| w_ang 发表于 2007-3-22 20:27 | 显示全部楼层

多谢!我试试

  
 楼主| w_ang 发表于 2007-3-22 23:04 | 显示全部楼层

忙了一晚上,也没搞定,还望周工指教

1.可不可以同时开一个FIQ,多个IRQ?<br />2.FIQ可不可以中断正在执行的IRQ?<br />3.如何实现?<br />是不是在LPC213X的模板下只能采用软中断(IRQ)中修改CPSR?<br />在STARTUP.S中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置系统模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0x0f&nbsp;&nbsp;&nbsp;;开F&I<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP,&nbsp;=StackUsr<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;R0<br />只修改此处,而不再调用IRQ_Enable()和FIQ_Enable()为什么程序只产生前述程序中的T0中断而没有T1的中断,且主程序不能再运行.
zlgARM 发表于 2007-3-23 08:36 | 显示全部楼层

RE

1:可以;如果这都无法实现,那么FIQ相对于IRQ的高优先级还有意义吗?<br />2:可以。<br /><br />首先,如果要求可以同时允许FIQ和IRQ,那么必要条件是CPSR里允许了FIQ和IRQ中断。<br />调试一下您的程序,确保这个必要条件,问题的核心是让CPSR同时令FIQ和IRQ使能,看看是程序哪个地方破坏了这个条件。做了试验才知道,先往这个方向试一下吧。
w_ANG 发表于 2007-3-23 11:12 | 显示全部楼层

解决了.

用两种方式都可以,<br />1.修改STARTUP.S中的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置系统模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0xdf&nbsp;&nbsp;&nbsp;;关F&I<br />为&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0x1f&nbsp;&nbsp;&nbsp;;开F&I<br /><br />2.象1楼的程序,不改.<br />只是编译方式由DebugInFlash改为RelInFlash,就可以了,是不是模板中有BUG?<br />
hotpower 发表于 2007-3-23 12:04 | 显示全部楼层

实际也可以控制VICIntEnable

  
zlgARM 发表于 2007-3-23 17:59 | 显示全部楼层

RE

w_ANG:<br />&nbsp;&nbsp;&nbsp;&nbsp;问题解决九号!或许有BUG。欢迎您调试出来告诉我们,我们好改进!谢谢。
lijing1982 发表于 2007-3-24 09:11 | 显示全部楼层

询问

我想问一下,FIQ和IRQ的区别,楼主能给解释一下吗?
 楼主| w_ang 发表于 2007-3-24 19:31 | 显示全部楼层

lijing1982 :FIQ快中断,主要特点就是一个字:(响应)快.

FIQ快中断,主要特点就是一个字:(响应)快.<br />次要特点:可以中断正在执行的IRQ.<br />IRQ就是没有这两特点的中断了,<br />你能明的吗?
lijing1982 发表于 2007-3-26 15:29 | 显示全部楼层

to w_ang

谢谢你的回答,这个我理解了!!但是ZLG出的一本书上讲,FIQ最好设置成一个,要不会影响时间的,是吗?我觉的一般的中断设置成IRQ就可以了,是不是不用设置成FIQ;在什么情况下需要设置,举个例子好吗?
 楼主| w_ang 发表于 2007-3-28 20:31 | 显示全部楼层

TO:lijing1982

是这样的,在我的应用中有一个信号实时性的要求特别高,我觉着最好的办法就是让一个FIQ来响应它.所以我这样用了.
lijing1982 发表于 2007-3-30 08:54 | 显示全部楼层

to w_ang

好的,谢谢!!有机会向你请教!!
lijing1982 发表于 2007-3-31 10:35 | 显示全部楼层

to w_ang

我想问一下,分布装载描述文件是bootloader吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

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