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.

关于cc3200的串口空闲接收中断



TI工程师你好,

           我在官方例程“uart_demo”内增加配置了一个串口接收中断和串口接收空闲中断,但只有串口接收中断生效了,空闲中断一直没有生效,请问是我初始化配置的有问题吗?

  串口配置函数如下:

//
// Initialising the Terminal.
//
InitTerm();

MAP_UARTFIFODisable(UARTA0_BASE);
MAP_UARTIntRegister(UARTA0_BASE,uart0_handle);
MAP_UARTIntEnable(UARTA0_BASE,UART_INT_RT|UART_INT_RX);

串口接收中断函数如下:

void uart0_handle(void)
{
 int lRetVal = 0;
 lRetVal = MAP_UARTIntStatus(UARTA0_BASE,true); //读取串口中断源
 if(lRetVal & UART_INT_RT) //串口空闲中断,(已使能此中断,但一直不进)
 {
   UARTRxCplish = 1;
 }
 if(lRetVal & UART_INT_RX) //串口接收中断
 {
   while(UARTCharsAvail(UARTA0_BASE))
   {
   *UART0WtPtr = MAP_UARTCharGet(UARTA0_BASE);
   if(UART0WtPtr < &g_ucUARTBuffer[MaxUART0RxBufLen])
   {
   UART0WtPtr++;
   }
   else
   {
   UART0WtPtr = &g_ucUARTBuffer[0];
   }
 }
 }
 MAP_UARTIntClear(UARTA0_BASE,UART_INT_RT|UART_INT_RX); //清中断
}

  • 我在main函数中如果捕捉到 UARTRxCplish == 1(触发了串口空闲中断),串口就会打印出 Message("\n\rUART_INT_RT\n\r"); ,结果手动串口给3200发数据,3200串口发回了很多的“UART_INT_RT”,像是一直在触发串口空闲中断一样,不明原因,以下为整个main函数,串口接收中断函数如上所示没有修改。请工程师帮我分析一下,谢谢了!

    void main()
    {
    UART0RdPtr = &g_ucUARTBuffer[0];
    UART0WtPtr = &g_ucUARTBuffer[0];
    //
    // Initailizing the board
    //
    BoardInit();
    //
    // Muxing for Enabling UART_TX and UART_RX.
    //
    PinMuxConfig();
    //
    // Initialising the Terminal.
    //
    MAP_UARTIntRegister(UARTA0_BASE,uart0_handle);
    MAP_UARTIntEnable(UARTA0_BASE,UART_INT_RT|UART_INT_RX);
    MAP_UARTFIFODisable(UARTA0_BASE);
    InitTerm();

    DisplayBanner(APP_NAME);
    Message("cmd#\n\r");
    while(1)
    {
    if(UARTRxCplish) //如果串口空闲中断(即接收完一帧数据),就会置位,但串口空闲中断一直不进,只能暂时屏蔽了~
    {
    Message("\n\rUART_INT_RT\n\r");
    while(UART0WtPtr != UART0RdPtr)
    {
    MAP_UARTCharPut(UARTA0_BASE,(*UART0RdPtr));
    if(UART0RdPtr < &g_ucUARTBuffer[MaxUART0RxBufLen])
    {
    UART0RdPtr++;
    }
    else
    {
    UART0RdPtr = &g_ucUARTBuffer[0];
    }
    }
    UARTRxCplish = 0;
    }
    }
    }

  • 你如果要实现UART中断的话,能否参考uart_dma, 这个例程是中断的实现方法。

  • 你好!你对中断理解错了,RT中断是接收超时中断。你的实际使用中没用出现这个情况,当然不会进这个中断。

    串口的功能是比较清晰的,基本上绝大部分的芯片软件代码都是相似的,请自行学习基础知识。

    //*****************************************************************************
    //
    // Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear
    // as the ulIntFlags parameter, and returned from UARTIntStatus.
    //
    //*****************************************************************************
    #define UART_INT_DMATX 0x20000 // DMA Tx Done interrupt Mask
    #define UART_INT_DMARX 0x10000 // DMA Rx Done interrupt Mask
    #define UART_INT_EOT 0x800 // End of transfer interrupt Mask
    #define UART_INT_OE 0x400 // Overrun Error Interrupt Mask
    #define UART_INT_BE 0x200 // Break Error Interrupt Mask
    #define UART_INT_PE 0x100 // Parity Error Interrupt Mask
    #define UART_INT_FE 0x080 // Framing Error Interrupt Mask
    #define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask
    #define UART_INT_TX 0x020 // Transmit Interrupt Mask
    #define UART_INT_RX 0x010 // Receive Interrupt Mask
    #define UART_INT_CTS 0x002 // CTS Modem Interrupt Mask