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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2001725 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1233775/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

我正在研究商用声纳的操作系统。
此测试阶段使用 TM4C1294XL LaunchPad 作为平台。
我正在将4800波特的串行端口的 UART3_base 用于接收来自主机操作系统的指令。
端口中断设置为接收中断和接收超时中断:
UARTIntEnable (UART3_BASE、UART_INT_RX | UART_INT_RT);
在命令接收阶段、系统捕获~40字节的命令信息、然后跳转到接收阶段。 在接收周期内、系统将接收包含5字节稳定性信息的数据包。 这两句话都使用0x9F 作为终止字符。
我遇到了系统在几个范围内无法同步的问题。
通过一些分析、我发现在接收到完整的消息之前、命令段从收集循环中跳出。 我想是当它进入命令时串行端口抓住了稳定消息的末尾。
我禁用了 FIFO、然后通过在进入稳定阶段时禁用 UART_INT_RX 来找到该 FIFO、然后在我离开例程后使系统正常运行。
这看起来不错、但我想知道这为什么起作用。 文档内容有点少。 默认情况下 FIFO 的大小是多少?
感谢大家提供的所有信息、
拜伦

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Byron:

    默认情况下 FIFO 的大小是多少?

    FIFO 是16x8深。 RX 中断可以配置为根据 FIFO 已满的特定百分比生成。 默认情况下、当一半 RXFIFO 满时、产生中断。 您可以更改 FIFO 级别以生成中断。 请参阅以下 API。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢查尔斯

    以下是我用于故障排除的带有一些代码位的中断处理程序:

    空隙
    HOST_MSG_ISR (空)

    静态 int i、j;
    uint32_t ui32Status;
    int32_t tempChar;
    静态 bool stabMessage = false;


    /*获取中断的状态... */
    ui32Status = UARTIntStatus (UART3_base、true);

    /*清除产生的中断... */
    UARTIntClear (UART3_base、ui32Status);
    stabMessage =错误;

    //*仅在接收中断时运行... */
    IF (ui32Status &(UART_INT_RX | UART_INT_RT))

    PULSE_Message_LED ();

    while (UARTCharsAvail (UART3_base))

    tempChar = UARTCharGetNonBlocking (UART3_base);
    /*检查字符是否为0x95... */
    if ((tempChar == REC_STAB_HDR)&&(duringReceive))

    MSG_READY = false;
    STAB_READY = false;
    stabMessage = true;
    MSG_NOT_STRETIVED = FALSE;
    J = 0;
    }

    if (!duringReceive)

    stabMessage =错误;
    }

    if (!stabMessage)

    STAB_READY = false;
    MSG_NOT_STRETIVED = true;

    receiveBuffer[ i++]= tempChar;

    if (tempChar == REC_BREAK_HDR)/* 0x96…… */
    breakreceive = true;

    if ( receiveBuffer[ i - 1]== TERM_CHR)
    /*如果我们已经达到0x9F... */

    i = 0;/*重新启动缓冲区中的位置... */

    MSG_READY = true;/*设置 msg_READY 标志... */
    }
    方案
    MSG_READY = false;
    }
    方案

    stab_buf[ j++]= tempChar;

    if (stab_buf[ j - 1]== term_chr)/* If we has reached the 0x9F... */

    STAB_READY = true;
    stabMessage =错误;
    /*将俯仰和翻滚到临时存储中... */
    potValue = stab_buf[1];
    rollValue = stab_buf[2];
    J = 0;/*重新启动缓冲区中的位置... */
    }
    }
    }
    返回;
    }
    }

    现在、我已经看到 FIFO 可能设置为8个字节、我认为我理解这个问题。 稳定始终发送5个字节:0x95 (稳定开始)、俯仰(字符)、翻滚(字符)、0x00和0x9F (终端)。 如果 FIFO 中有三个字节、退出例程、剩下的两个字节将为0x00、0x9F。 这会导致命令部分立即击穿、从而使系统陷入无休止的循环。 这就是当时终止 RX 中断有效的原因。

    非常感谢您在这里投入的时间和付出的努力、

    拜伦