This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于6747 中断



您好! 我想利用定时器0计数中断并将其设置为INT4 。以下是中断的初始化函数:

void int_interupt ()
{
      CSR&=0xfffe;//disable global interrupt
      INTmux1=0x3604;//映射GPIO_BANK4 interrupt to INT4
      asm(" NOP 2");
      ISTP=0x80000000;//将中断向量表首地址发送给ISTP的ISTB 位
      asm(" NOP 2");
      ICR=0xfff0;//clear all the interrupt flag
      asm(" NOP 2");
      IER=0x0033;//enable INT4
}

现在的问题是 我在软件仿真(simulator)中可以进入中断,单步执行可以切入中断服务子程序中,但是用XDS100V2 仿真时就无法进入中断子函数,求教???

  • 不好意思,上面程序中的INTmux1=0x3604 的解释 我是笔误写错了,但这不影响结果。

  • 看一下Timer寄存器INTCTLSTAT.PRDINTEN12有没有设成1--Enable interrupt?

  • 这些都没有问题,硬件仿真时寄存器IF 已经为1。 INTCTLSTAT.PRDINTEN12经设置为enable ,并且INTCTLSTAT.PRDINTSTAT12 也已经为1。

    我的思路是这样的:我设置了全局变量flag=1,在中断子程序中 令flag=0,在主程序中while(flag)等待定时器中断 ; 可是程序就一直卡在这里。

    我在软件仿真的情况下,按setp into 能够进入中断服务子程序中,但跳出来后程序还是卡在while(flag) 那里。

    在硬件仿真时,按setp into 也没有显示进入中断函数(是不是硬件仿真时直接跳过的不显示 但是 是执行过的)因为我看到IF 寄存器从1置成0 了。

    您帮我看看CMD 文件和vectors.asm 文件是否有问题?

    CMD

    -stack 0x00001000 /* Stack Size */
    -heap 0x00001000 /* Heap Size */

    MEMORY
    {
    VECS: o = 0x80000000 l = 0x00000f00


    DSPL2RAM: o = 0x00800800 l = 0x00040000
    DSPL1PRAM: o = 0x00E00000 l = 0x00008000
    DSPL1DRAM: o = 0x00F00000 l = 0x00008000

    DSPL2RAM2: o = 0x11800000 l = 0x0003FFFF
    DSPL1PRAM2: o = 0x11E00000 l = 0x00008000
    DSPL1DRAM2: o = 0x11F00000 l = 0x00008000


    SHAREDRAM: o = 0x80000f00 l = 0x0001ffff
    SDRAM: o = 0xC0000000 l = 0x20000000

    }

    SECTIONS
    { ".vectors" > VECS
    .bss > DSPL2RAM
    .cinit > DSPL2RAM
    .cio > DSPL2RAM
    .const > DSPL2RAM
    .stack > DSPL2RAM
    .sysmem > DSPL2RAM
    .text > DSPL2RAM
    .switch > DSPL2RAM
    .far > DSPL2RAM
    .calcbuffer > DSPL2RAM
    .compxbuf > DSPL2RAM

    .bufs > SHAREDRAM

    .buffer > SDRAM
    .buffertemp > SDRAM
    .compxbuffer> SDRAM
    }

    这个CMD 程序把程序都放在SHARERAM中运行, 我想问问这样有问题吗?

    (根据物理地址查看datasheet 知道 上面 CMD 的DSPL2RAM 也是在shareram 的空间内);

    vectors.asm

    .global _vectors
    .global _c_int00
    .global _T64P0_TINT12_ISR

     .ref _c_int00

    VEC_ENTRY .macro addr
    STW B0,*--B15
    MVKL addr,B0
    MVKH addr,B0
    B B0
    LDW *B15++,B0
    NOP 2
    NOP
    NOP
    .endm

    _vec_dummy:
    B B3
    NOP 5

    .sect ".vectors"
    .align 1024

    _vectors:
    _vector0: VEC_ENTRY _c_int00 ;RESET
    _vector1: VEC_ENTRY _vec_dummy ;NMI
    _vector2: VEC_ENTRY _vec_dummy ;RSVD
    _vector3: VEC_ENTRY _vec_dummy
    _vector4: VEC_ENTRY _T64P0_TINT12_ISR
    _vector5: VEC_ENTRY _vec_dummy
    _vector6: VEC_ENTRY _vec_dummy
    _vector7: VEC_ENTRY _vec_dummy
    _vector8: VEC_ENTRY _vec_dummy
    _vector9: VEC_ENTRY _vec_dummy
    _vector10: VEC_ENTRY _vec_dummy
    _vector11: VEC_ENTRY _vec_dummy
    _vector12: VEC_ENTRY _vec_dummy
    _vector13: VEC_ENTRY _vec_dummy
    _vector14: VEC_ENTRY _vec_dummy 
    _vector15: VEC_ENTRY _vec_dummy

    谢谢!!

  • 程序可以放在shared RAM运行。

    你在_vector4: VEC_ENTRY _T64P0_TINT12_ISR处设断点,看能否停在该处。

  • 按您所说 我在中断向量程序中加了断点  硬件仿真是可以进入中断的,只是仿真时跳过了没有显示。谢谢您的回答。

    现在还有1个问题:

    void main()

    {....

    .....

    runtime=1;
    while(runtime);

    ....

    ....

    }

    interrupt void T64P0_TINT12_ISR()
    {
    CSR&= 0xfffe; // 关中断 GIE=0
    asm(" NOP 2 ");
    ICR = 0xFFF0; // 清除中断标志ICR
    TIMER0_INTCLSTAT=0x3;//clear time interrupt flag
    CLK_HIGH;
    asm(" NOP 2 ");
    CLK_LOW;
    asm(" NOP 1 ");
    CSR=CSR|0x1; // 开中断
    runtime=0;
    }

    runtime 在中断程序 运行后 我添加了watch 窗口观察了runtime 的值已经变为0了,为什么程序还是卡在while(runtime) 处,点击step into 就会的跳入定时器中断中程序中, 如此反复下去。

  • main函数和中断子程序在一个文件里吧?

    你的意思是如果单步跳入到定时器中断后,再执行程序,就能跳出while语句?

  •  

    mian 和中断子函数是放在一个文件里的。

    对,我想实现这个功能。等待定时器中断完成后再继续执行下面的程序,所以设置了while(runtime)循环等待。但实际情况是,在执行完中断程序返回主函数后 还是一直卡在while(runtime) 语句那,runtime 在 中断子程序里已经被赋值为0了,为什么还会一直卡在while(runtime)那?求教。

    还有用DSP/BIOS 进行TSK 的配置 执行 是不是更好一些?

  • 试试用volatile定义一下runtime变量,看行不行。

  • volatile 定义变量后程序可以执行,非常感谢您的答复。

  • 您好!我想问一下您配置中断映射INTmux1=0x3604;//映射GPIO_BANK4 interrupt to INT4,这是参考的手册哪里?我看到关于配置INTMUXn寄存器都没有提到,谢谢!!!

  • 对应的事件号可以参考数据手册第75页上的表

    Table 6-6. C6745/6747 DSP Interrupts
    http://www.ti.com/lit/ds/symlink/tms320c6747.pdf