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.

多个串口中断响应问题

Other Parts Discussed in Thread: MSP430F6779

msp430f6779芯片,因为有不同的外部设备,所以我开启了两个串口中断用于接收数据,现在的问题是当我同时定义了两个中断服务函数时,不能响应,当注释掉其中一个时,另外一个可以响应,代码如下,还请麻烦指点一下!多谢~

  • 若是可以的话,能否给出完整的代码?另外不要在串口中断中执行耗时较多的任务
  • 您好!中断的代码已经给出了,也没有在串口中断中执行耗时较多的任务吧,就是接受的数据进行储存。

    #pragma vector=USCI_A3_VECTOR    
    __interrupt void USCI_A3_ISR(void)
    {    
      
      
      switch(__even_in_range(UCA3IV,4))
      {
        case 0:break;                             // Vector 0 - no interrupt
        case 2:
          
                                                                                                         
                 *pRXBuffer++ = UCA3RXBUF;    //串口3接受数据
                break;
                  
         case 4: 
          
         break;                              // Vector 4 - TXIFG
        default: break;
      }
     
    
    }
    
    #pragma vector=USCI_A1_VECTOR    
    __interrupt void USCI_A1_ISR(void)
    {    
      
      
      switch(__even_in_range(UCA1IV,4))
      {
        case 0:break;                             // Vector 0 - no interrupt
        case 2:
          
                P5OUT  ^= BIT0;                   //接受闪烁灯                                                                                
                 *pRXBuffer++ = UCA1RXBUF;      //串口1接受数据
                break;
                  
         case 4: 
         break;                              // Vector 4 - TXIFG
        default: break;
      }
     
    }
    
  • 谢谢您的反馈!我指的是完整的代码(包含配置代码)。单纯看您现在的中断代码是没有问题的

    您可以私信给我,我拿板子实际调一下,谢谢

  • 您好,我已经私信代码用文件的方式发给您了,并加了注释,希望得到您的指点!多谢了!
  • 您在程序中定义了

        // Setup P3.0 UCA0RXD, P3.1 UCA0TXD
        P3SEL0 |= BIT0 + BIT1;                    // Set P3.0, P3.1 to non-IO
        P3DIR |=  BIT0 + BIT1;                     // Enable UCA0RXD, UCA0TXD

    所以您现在使用了3个串口?USCI_A0,USCI_A1,USCI_A3?

    另外main函数内的while(1)可以尝试先不要做这么多操作

    USCI_A1,USCI_A3的配置的话,我暂时没有发现问题

  • 您好!对,这里我定义了uart0,但是我实际测试的时候用的是uart1和uart3这两个中断。main里使用while(1),是因为我在串口里为了减少处理时间,直接对接收的数据进行储存到RxBuff里,但是我要判断结束位,所以目前想到的办法就是通过主函数里的死循环来不断检查最后一位,请问您有什么指导建议吗?非常感谢您的帮助!!
  • 请问是不能开启多个中断使能吗,我又进行了uart0,uart1分别测试,同样的数据我移到了uart0上可单独中断响应,单独移到了uart1也可以进行中断响应,但是当我开启uart0的UCRXIE时(仅开启使能,不进行中断处理响应),uart1就不能进入中断处理了。然后我又反过来,仅仅把uart1的UCRXIE打开,不进行中断响应,而把中断处理放在uart0的中断响应里,可以中断响应。现在来看,是uart0响应的优先级高于uart1,且uart0 的UCRXIE可以屏蔽uart1 的UCRXIE,不知道我这样测试的结果哪里不对,希望得到您的指点~多谢~~
  • 您需要使用

    while (!(UCA0IFG&UCTXIFG));           
        UCA0TXBUF = UCA1RXBUF; 

    while (!(UCA1IFG&UCTXIFG));            
         UCA1TXBUF = UCA0RXBUF;

    来判断TXbuffer是否为空。请您尝试添加上面的代码

  • 您好!按照您的建议,现在可以实现中断响应了,但是执行一会后就会出现卡死情况,我想通过提高系统主频到20MHz来加快执行速度,设置完成后示波器测量确实提升到了20M,但程序无法运行,出现警告Wed Dec 16, 2020 16:28:49: The stack pointer for stack 'Stack' (currently Memory:0x9c06) is outside the stack range (Memory:0x9b60 to Memory:0x9c00) .网上查询无果,期望得到您的建议!多谢!

  • 应该是您的堆栈不够用了,可以在CCS内设置增大一些试试