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.

C5509A中断函数与中断向量表关联的问题



我是想通过定时器0实现中断定时

void PLL_init()
{
CLKMD = 0x2cd4; //fclk = 100MHz, clkout = 50MHz
}

void timer0_init()
{
PRD0 = 9999;
PRSC0 = 9;
TCR0 = 0x0D38; //TOUT = 500Hz
}
void INT_init()
{
ST1_55 |= 1<<11; //失能所有中断
IER0 |= 1<<4; //使能定时器0,  是这样设置吗?,
ST1_55 &= ~(1<<11); //开所有中断
}
interrupt void timer0(void)  //中断函数就是为了控制一个引脚的电平
{
cnt++;
if(1000 == cnt)
{
if(flag&0x01)
{
ST1_55 |= (1<<13);
cnt = 0;
flag = ~flag;
}
else
{
ST1_55 &= ~(1<<13);
cnt = 0;
}
}
}
main()
{
PLL_init();
timer0_init();
INT_init();
TCR0 &= ~(1<<10);      TCR0 的TLB = 0
TCR0 &= ~(1<<4);          //启动定时器
ST1_55 &= ~(1<<13);   //
while(1);

}

中断向量表的设置:

_VECSTART:
.ivec _c_int00, C54X_STK 
nmi .ivec no_isr 
nop_16
int0 .ivec no_isr 
nop_16
int1 .ivec no_isr 
nop_16
int2 .ivec _timer0  //这里是这样设置对吗?
nop_16
int3 .ivec no_isr 
nop_16
int4 .ivec no_isr 
nop_16
int5 .ivec no_isr
nop_16
int6 .ivec no_isr

上面的设置之后能关联中断函数和中断向量表吗?还需要其他的设置吗?

我就是不太明白,当定时器0发生中断后怎么找到我的中断函数呢?

  • 你好,

    参考一下附件的定时器中断例程。

  • 您好:

          在中断向量表中,编程手册不是说,引入中断函数后;占用了4个字节的空间,但是中断向量表每个中断有8个字节的空间,

    在剩余的4个字节中不是填充NOP指令么。

    rint1 .ivec _McBSP1RintIsr

              nop

             nop

             nop

            nop

    xint1 .ivec no_isr

            nop_16

    而结束部分这两行代码求详解?

          .text

    no_isr   B   no_isr

    这是声明了一个代码的标识,然后程序一直在这里循环么?求解释?

    但是你们的向量表里面写法:

    SINT30:  .ivec    no_isr             ; Software Interrupt #30

    SINT31:  .ivec    no_isr             ; Software Interrupt #31

     

    按照你们的例子:我的向量表调用了spi的接收中断应该是:

    rint1 .ivec _McBSP1RintIsr
    xint1 .ivec no_isr

    不需要添加4个nop指令了。求详解?

     

     

  • 有新问题的话,麻烦另起新帖,这样方便其他客户查看,谢谢配合。

  • 你的这个问题,可以看一下.ivec伪指令的用法,它会自动加nop指令,所以不需要额外添加。

    .ivec伪指令的用法见下面的汇编手册第160页。
    http://www.ti.com/lit/ug/spru280h/spru280h.pdf