打印
[DSP编程]

5509中断3的问题

[复制链接]
1321|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我们公司做了一个5509开发板,用CPLD通过TL16C554扩展了四个串口。
现在发送已经调通,查询方式接收也已经搞好,就差中断方式接收了。
CPLD对应说明部分如下:



相关帖子

沙发
wangch_sh|  楼主 | 2014-12-4 14:37 | 只看该作者
要用到中断三。
我的部分程序如下:
interrupt void int3(void);
。。。。。。。。。。。。。。。。。。。。。
Uint16 eventId0;
int old_intm;

//---------Function prototypes---------

/* Reference start of interrupt vector table   */

/* This symbol is defined in file, vectors_IP.s55 */

extern void VECSTART(void);
。。。。。。。。。。。。。。。。。。。。。。。。

//5509A中断设置,使能INT1中断
void INTconfig()
{
    /* Temporarily disable all maskable interrupts */

    IRQ_setVecs((Uint32)(&VECSTART));

        /* Temporarily disable all maskable interrupts */

    old_intm = IRQ_globalDisable();

        /* Get Event Id associated with External INT1(8019), for use with */
        eventId0 = IRQ_EVT_INT0;

        /* Clear any pending INT1 interrupts */

        IRQ_clear(eventId0);

        /* Place interrupt service routine address at */

    /* associated vector location */

    IRQ_plug(eventId0,&int3);

        /* Enable INT1(8019) interrupt */

    IRQ_enable(eventId0);

        /* Enable all maskable interrupts */

    IRQ_globalEnable();   
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
main()
{
        unsigned int i;
        /*初始化CSL库*/       
    CSL_init();
   
    /*EMIF为全EMIF接口*/
    CHIP_RSET(XBSR,0x0a01);
   
    /*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);
   
    /*初始化DSP的外部SDRAM*/
    EMIF_config(&emiffig);

    INTconfig();
        TL16C554_1=(int *)0x200c00;
        TL16C554_2=(int *)0x200e00;
        TL16C554_3=(int *)0x201000;
        TL16C554_4=(int *)0x201200;
        TL16C554_INT=(int *)0x201a00;  
        Init554();

        i=0;
        do
        {
                       
                        //dat=XBYTE[PORT4+LSR];
                        i=i;
                        i=i;
                        zyq.temp=*(TL16C554_4+LSR);
                        i=i;
                        if(zyq.temp&0x01)
                       
                               
                                break;
                       
        }while(1);
        for(;;)
           {
               
               
                       
           }  

}

//External INT1(8019)中断,响应ICMP数据包
interrupt void int3()
{
        unsigned int i;
           i=*TL16C554_INT;
        switch(i)
        {
                case 1:
                        zyq.dat=*(TL16C554_1+RBR);
       
                        *(TL16C554_1+THR)=zyq.dat;
                break;
                case 2:
                        zyq.dat=*(TL16C554_2+RBR);
       
                        *(TL16C554_2+THR)=zyq.dat;
                break;
                case 4:
                        zyq.dat=*(TL16C554_3+RBR);
       
                        *(TL16C554_3+THR)=zyq.dat;
                break;
                case 8:
                        zyq.dat=*(TL16C554_4+RBR);
       
                        *(TL16C554_4+THR)=zyq.dat;
                break;
                default:
                break;
        }
}
调试时发现进不了中断。请高手解惑,谢谢!

使用特权

评论回复
板凳
zhangmangui| | 2014-12-4 21:32 | 只看该作者
你最好确认一下    CPLD有没有给触发电平
例程参考修改一下你的中断初始化试试

#include <csl.h>
#include <csl_irq.h>

#include <csl_pll.h>
#include <csl_chip.h>
#include <stdio.h>

Uint16 old_intm;

interrupt void EVT_INT3(void);
interrupt void EVT_INT4(void);
//---------Function prototypes---------

/* Reference start of interrupt vector table   */

/* This symbol is defined in file, vectors_IP.s55 */

extern void VECSTART(void);


/*锁相环的设置*/
PLL_Config  myConfig      = {
  0,    //IAI
  1,    //IOB
  24,   //PLL
  1     //Divide by 2               
};


void INTconfig()
{
    /* Temporarily disable all maskable interrupts */

    IRQ_setVecs((Uint32)(&VECSTART));

        /* Temporarily disable all maskable interrupts */

    old_intm = IRQ_globalDisable();

        /* Clear any pending INT3&INT4 interrupts */

        IRQ_clear(IRQ_EVT_INT3);
        IRQ_clear(IRQ_EVT_INT4);
        /* Place interrupt service routine address at */

    /* associated vector location */

    IRQ_plug(IRQ_EVT_INT3,&EVT_INT3);
    IRQ_plug(IRQ_EVT_INT4,&EVT_INT4);
        /* Enable INT3&INT4 interrupt */

    IRQ_enable(IRQ_EVT_INT3);
    IRQ_enable(IRQ_EVT_INT4);
        /* Enable all maskable interrupts */

    IRQ_globalEnable();   
}

void main(void)
{
        /*初始化CSL库*/       
    CSL_init();

    /*设置系统的运行速度为144MHz*/
    PLL_config(&myConfig);  

        //设置并使能5509A芯片外部中断3和中断4
        INTconfig();

        while(1);
}

//External INT3(EXINT)中断处理函数
interrupt void EVT_INT3()
{
    printf("EXINT3 Ouccers!\n");
}
//External INT4(EXINT)中断处理函数
interrupt void EVT_INT4()
{
    printf("EXINT4 Ouccers!\n");
}


使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-12-5 09:37 | 只看该作者
经过测试,当从串口发送数据时,INTA-INTD没有波形。

使用特权

评论回复
5
cer1991| | 2014-12-5 20:20 | 只看该作者
你函数名用的int3是用要int3脚么?
函数里面标注写的使能int1
但是代码却打开了int0 。。。。

使用特权

评论回复
6
wangch_sh|  楼主 | 2014-12-6 08:48 | 只看该作者
注释不对。
IRQ_plug(eventId0,&int3);
这不是INT3吗?
是不是这个eventId0 = IRQ_EVT_INT0;
也要改成eventId0 = IRQ_EVT_INT3;

使用特权

评论回复
7
zhangmangui| | 2014-12-6 22:11 | 只看该作者
wangch_sh 发表于 2014-12-6 08:48
注释不对。
IRQ_plug(eventId0,&int3);
这不是INT3吗?

int3是中断函数入口地址  跟你的中断函数命名有关  
eventId0 = IRQ_EVT_INT0很重要  你要确定用的是哪个INT*

使用特权

评论回复
8
wangch_sh|  楼主 | 2014-12-7 16:49 | 只看该作者
谢谢!

使用特权

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

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝