打印
[ZLG-ARM]

如何开了一个FIQ的情况下再开其它的IRQ

[复制链接]
2443|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
w_ang|  楼主 | 2007-3-22 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ic, vi, tc, BLE, TE
在只开FIQ或IRQ时,都正常,但同时开时,只有FIQ,却没有IRQ,请高手指教,如何才能让其都产生中断.
我的程序如下://T0为匹配0的中断,FIQ
         T0PR = 0;
    T0MCR =0x03;
    T0MR0 =Fpclk/20000;
     
    FIQEnable();   //快中断使能
    VICIntSelect = VICIntSelect|(1<<4);  //FIQ
    VICIntEnable = VICIntEnable|(1<<4);

    T0TCR =0x01;    //开计数器
    
         //T1为匹配0的中断,IRQ
         T1TC = 0;        //清T1
    T1PR = 0;        //预分频
    T1CTCR = 0;        //T1为定时器
    T1MCR = 0x03;    //T1MR0匹配后复位,并产生中断
    T1MR0 = Fpclk/1000;//初始频率为1000Hz
    T1TCR = 0x03;    //复位

    IRQEnable();            //中断使能
    
    VICIntSelect = 0x00;    //分配为IRQ
    VICVectCntl0 = 0x20|0x05;    //分配优生级
    VICVectAddr0=(uint32)T1MC0;//设置中断地址
    VICIntEnable = VICIntEnable|(1<<5);    //开T1匹配0中断
    T1TCR =0x01;    //开计数器


//T1 MR0匹配中断函数
         void __irq T1MC0(void)
     {    
    
    T1IR = 1<<0 ;//清中断
    T1MR0 = Fpclk/500;//设定速度
        
    VICVectAddr=0x00;//向量中断处理结束
    
    }

//FIQ的中断函数
        void FIQ_Exception(void)
{
    //while(1);                   // change it to your code  这一句替换为自己的代码
    
    LEDON();
    T0IR =0x01;        //清中断标志
    LEDOFF();    
        
}

相关帖子

沙发
zlgARM| | 2007-3-22 18:34 | 只看该作者

RE

w_ang :
    IRQEnable()最终是跳到启动文件里的IRQEnable执行;
    FIQDisable()最终是跳到启动文件里的FIQDisable执行。
    如您所见,这两个操作是彼此互斥的。
    您可以自己参照着启动文件和IRQEnable()的写法,写一个软中断,令CPSR使能IRQ和FIQ中断。      



    
IRQEnable
        ;开IRQ中断
        MRS   R0, SPSR
        BIC   R0, R0, #NoInt
        MSR   SPSR_c, R0
        MOVS    PC, LR
        
FIQDisable
        ;关FIQ中断
        MRS     R0, SPSR
        ORR     R0, R0, #NoFIQ
        MSR     SPSR_c, R0
        MOVS    PC, LR

使用特权

评论回复
板凳
w_ang|  楼主 | 2007-3-22 20:27 | 只看该作者

多谢!我试试

使用特权

评论回复
地板
w_ang|  楼主 | 2007-3-22 23:04 | 只看该作者

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

1.可不可以同时开一个FIQ,多个IRQ?
2.FIQ可不可以中断正在执行的IRQ?
3.如何实现?
是不是在LPC213X的模板下只能采用软中断(IRQ)中修改CPSR?
在STARTUP.S中
       ;设置系统模式堆栈
        MSR     CPSR_c, #0x0f   ;开F&I
        LDR     SP, =StackUsr

        MOV     PC, R0
只修改此处,而不再调用IRQ_Enable()和FIQ_Enable()为什么程序只产生前述程序中的T0中断而没有T1的中断,且主程序不能再运行.

使用特权

评论回复
5
zlgARM| | 2007-3-23 08:36 | 只看该作者

RE

1:可以;如果这都无法实现,那么FIQ相对于IRQ的高优先级还有意义吗?
2:可以。

首先,如果要求可以同时允许FIQ和IRQ,那么必要条件是CPSR里允许了FIQ和IRQ中断。
调试一下您的程序,确保这个必要条件,问题的核心是让CPSR同时令FIQ和IRQ使能,看看是程序哪个地方破坏了这个条件。做了试验才知道,先往这个方向试一下吧。

使用特权

评论回复
6
w_ANG| | 2007-3-23 11:12 | 只看该作者

解决了.

用两种方式都可以,
1.修改STARTUP.S中的
       ;设置系统模式堆栈
        MSR     CPSR_c, #0xdf   ;关F&I
为      MSR     CPSR_c, #0x1f   ;开F&I

2.象1楼的程序,不改.
只是编译方式由DebugInFlash改为RelInFlash,就可以了,是不是模板中有BUG?

使用特权

评论回复
7
hotpower| | 2007-3-23 12:04 | 只看该作者

实际也可以控制VICIntEnable

使用特权

评论回复
8
zlgARM| | 2007-3-23 17:59 | 只看该作者

RE

w_ANG:
    问题解决九号!或许有BUG。欢迎您调试出来告诉我们,我们好改进!谢谢。

使用特权

评论回复
9
lijing1982| | 2007-3-24 09:11 | 只看该作者

询问

我想问一下,FIQ和IRQ的区别,楼主能给解释一下吗?

使用特权

评论回复
10
w_ang|  楼主 | 2007-3-24 19:31 | 只看该作者

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

FIQ快中断,主要特点就是一个字:(响应)快.
次要特点:可以中断正在执行的IRQ.
IRQ就是没有这两特点的中断了,
你能明的吗?

使用特权

评论回复
11
lijing1982| | 2007-3-26 15:29 | 只看该作者

to w_ang

谢谢你的回答,这个我理解了!!但是ZLG出的一本书上讲,FIQ最好设置成一个,要不会影响时间的,是吗?我觉的一般的中断设置成IRQ就可以了,是不是不用设置成FIQ;在什么情况下需要设置,举个例子好吗?

使用特权

评论回复
12
w_ang|  楼主 | 2007-3-28 20:31 | 只看该作者

TO:lijing1982

是这样的,在我的应用中有一个信号实时性的要求特别高,我觉着最好的办法就是让一个FIQ来响应它.所以我这样用了.

使用特权

评论回复
13
lijing1982| | 2007-3-30 08:54 | 只看该作者

to w_ang

好的,谢谢!!有机会向你请教!!

使用特权

评论回复
14
lijing1982| | 2007-3-31 10:35 | 只看该作者

to w_ang

我想问一下,分布装载描述文件是bootloader吗?

使用特权

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

本版积分规则

4

主题

13

帖子

0

粉丝