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.
我正在研究商用声纳的操作系统。
此测试阶段使用 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 中断有效的原因。
非常感谢您在这里投入的时间和付出的努力、
拜伦