您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]BF53X中PF中断疑问
本帖共有544个阅读者
发表帖子 发表投票 回复主题
[求助]BF53X中PF中断疑问
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]BF53X中PF中断疑问
我现在有两个外接芯片:
    芯片1中断引脚与PF4连接
    芯片2中断引脚与PF8连接
我想让PF4中断在PF Interrupt A中处理,PF8中断在PF Interrupt B处理,两者互不干扰(即FP4的中断处理在flaga_isr中完成,FP8的中断处理在flagb_isr中完成) 。我要怎么操作呢?
如下是我的连接初始化:
void pf4_connect(void)
{
    *pFIO_DIR       &= ~PF4;
    *pFIO_INEN      |= PF4;
    *pFIO_EDGE      &= ~PF4;
    *pFIO_POLAR     |= PF4;
    *pFIO_MASKA_D   |= PF4;  //MASKA
}

void pf8_connect(void)
{
    *pFIO_DIR       &= ~PF8;
    *pFIO_INEN      |= PF8;
    *pFIO_EDGE      &= ~PF8;
    *pFIO_POLAR     |= PF8;
    *pFIO_MASKB_D   |= PF8;  //MASKB
}

void flaga_isr_init(void)
{
    *pSIC_IAR0 &= 0xffffffff;
    *pSIC_IAR1 &= 0xffffffff;
    *pSIC_IAR2 &= 0xffff5fff;                    // FlagA -> ID5
    
    register_handler(ik_ivg12, flaga_isr);       // flaga_isr-> IVG 12

    // enable FlagA interrupt
    *pSIC_IMASK  |= PFA_IRQ;    
}

void flagb_isr_init(void)
{
    *pSIC_IAR0 &= 0xffffffff;
    *pSIC_IAR1 &= 0xffffffff;
    *pSIC_IAR2 &= 0xfff5ffff;                    // FlagB -> ID5
    
    register_handler(ik_ivg12, flagb_isr);       // flagb_isr-> IVG 12

    // enable FlagA interrupt
    *pSIC_IMASK  |= PFB_IRQ;    
}
但FlagA和FlagB共用中断向量IVG 12的,这要怎么办呢?ik_ivg12只能注册一次啊!


「该帖子被 blackfin 在 2013-06-25 13:40:04 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2013/6/25 9:33:18
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
void pf4_connect(void)
{
    *pFIO_DIR       &= ~(PF4|PF8);
    *pFIO_INEN      |= PF4|PF8;
    *pFIO_EDGE      &= ~(PF4|PF8);
    *pFIO_POLAR     |= PF4|PF8;
    *pFIO_MASKA_D   |= PF4;  
    *pFIO_MASKB_D   |= PF8;
}
void flaga_isr_init(void)
{
    *pSIC_IAR0 &= 0xffffffff;
    *pSIC_IAR1 &= 0xffffffff;
    *pSIC_IAR2 &= 0xfff55fff;                    // FlagA -> ID5
    
    register_handler(ik_ivg12, flaga_isr);       // flaga_isr-> IVG 12
    register_handler(ik_ivg12, flagb_isr);       // flaga_isr-> IVG 12

    // enable FlagA interrupt
    *pSIC_IMASK  |= PFA_IRQ | PFB_IRQ;    
}


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/6/25 9:46:28
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
谢谢andy,但我按你的修改后:

在如下处理程序中设断点查看,发现它只进入flagb_isr中。
EX_INTERRUPT_HANDLER(flaga_isr)
{    
    if (*pFIO_FLAG_D & PF4)    
    {                
        flaga_handle();
        *pFIO_FLAG_C = PF4;      
    }
}

EX_INTERRUPT_HANDLER(flagb_isr)
{    
    if (*pFIO_FLAG_D & PF8)    
    {                
        flagb_handle();
        *pFIO_FLAG_C = PF8;      
    }
}
把下面代码
register_handler(ik_ivg12, flaga_isr);       // flaga_isr-> IVG 12
register_handler(ik_ivg12, flagb_isr);       // flaga_isr-> IVG 12
改为
register_handler(ik_ivg12, flagb_isr);       // flaga_isr-> IVG 12
register_handler(ik_ivg12, flaga_isr);       // flaga_isr-> IVG 12
后,它就只进入flaga_isr中了。



这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2013/6/25 10:38:49
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
改为这样试试


   *pSIC_IAR2 &= 0xfff54fff;                    // FlagA -> ID5
    
    register_handler(ik_ivg11, flaga_isr);       // flaga_isr-> IVG 12
    register_handler(ik_ivg12, flagb_isr);       // flaga_isr-> IVG 12


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/6/25 23:45:57
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159196 Call, 1 Queries, Processed in 0.078125 second(s),