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.

[参考译文] MSP432E401Y:UART3接收 FIFO 的位置是什么

Guru**** 2589175 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1334631/msp432e401y-where-is-uart3-receive-fifo-located

器件型号:MSP432E401Y

我将尝试利用 SLAU723A 的第26节中的信息、在汇编代码中实现一个简单的 RS -232链接。

到目前为止、一切都很顺利、除了一点;我在本文档的任何地方都看不到接收 FIFO 的位置、因此我不知道应该从何处提取任何接收到的数据字节。

有人能告诉我接收 FIFO 在内存中的什么位置、或者我怎么知道它在哪里?

谢谢!

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

    您好!

    Unknown 说:
    其中我应该取任何接收到的数据字节。

    接收到的数据被压入 RxFIFO。 每个 RxFIFO 位置没有唯一的地址、而是您从 UARTDR 寄存器中读取 RxFIFO。 由于 RxFIFO 是一个 FIFO (先进先出)、因此每次从 UARTDR 寄存器读取时、FIFO 都会将先进(最早)的数据传出到处理器。 同样、如果您再次从 UARTDR 寄存器读取、它会将第二输入(FIFO 中最早的数据)数据压出到处理器。  

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

    您好!

    感谢您的答复。 我能够在 UARTDR 读取传入的数据字节、但这只是间歇性的。  我将使用 UART_echo 样本的命令来设置 UART3、我想知道它们是否会设置我要与之竞争的中断例程来拾取传入的字节。

    我想我如果将 FIFO 深度设置为1字节、那么接收中断就被禁用了、这是我通过将 UARTIFLS 的位3、4和5设置为零来实现的、但我现在无法找到读取它的位置。  您能告诉我如何 禁用接收中断、这样我就能确保不与中断例程竞争吗?

    再次感谢您。

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

    如果仍有类似的内容[来自 UART_echo 示例]:

    >MAP_IntEnable (INT_UART0);
    >MAP_UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);

    这就是启用 Rx 中断的功能。 假设不需要该 ISR 提供的函数、可以删除这些行。

    设置 UARTIFLS=0只是设置触发电平;它不会禁用中断。

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

    为明确起见、我的应用程序使用 UART0通过没有问题的 USB 端口进行通信。 我将使用 UART2和 UART3实现2个 RS -232端口、我现在要测试的端口是 UART3。

    我在主程序中找到4个包含 IntEnable 的命令:

    UARTIntEnable (UART0_BASE、UART_INT_TX);
    SysTickIntEnable ();
    UARTIntEnable (UART0_BASE、(UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX));
    IntEnable (INT_UART0);

    在我看来、这些大多与 UART0相关。  您是否认为他们也会通过 UART3启用 Rx 中断?

    我可以通过某种方法查看是否启用了通过 UART3进行的 Rx 中断、 如果启用了、我可以通过某种方法禁用它吗?

    非常感谢您的帮助。

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

    启用 UART0中断不会影响 UART3。 (我想您可能刚刚将所有"UART0"更改为"UART3"或其他内容。)

    在调试器中、您可以通过"Window->Show View->Registers"查看 UART3寄存器。 您需要的是 IM (中断屏蔽)寄存器。 或者,在您的项目中搜索"UART3_BASE"——可能不多。

    您如何读取数据? 您是否正在使用非(FIFO-EMPTY)[UARTFR:RXFE]或原始中断状态[RIS:RXRIS]? 一般而言、我建议使用前者。

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

    在"Window->Show View->Registers"的 UART3下、UART_IM 全部为零。

    唯一包含 UART3_base 的命令是:

    MAP_UARTConfigSetExpClk (UART3_BASE、g_ui32SysClock、38400、  
                               (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

    我使用以下汇编语言无限循环来读取数据:

    while (1)
    {
       ASM ("      movw r1,#0xf000 ");
       ASM ("      movt r1, #0x4000 ");
       ASM ("      LDR R2、[R1、#0x03c]"); // UART3_UART_RTS
       ASM ("      和 R2,#0x10     "); // RXRIS
       ASM ("      CMP R2,#0x10    ");
       ASM ("      博讷  诺因        ");
       ASM ("      LDR R3、[R1]        ");
       ASM ("      MOV R3和 R3        ");
       asm ("noin:MOV R3、R3        ");

    我还尝试了位于0x18的 RXFE、它仍然无法可靠地接收数据。 我注意到的一件奇怪的事情是、第16次尝试后、我要发送到它的字符显示在 UART3_UART_DR 中。 说明 FIFO 存在问题、但我在 UARTIFLS 中将位3、4和5设置为零、我想这意味着我会在接收到每个字符时得到每个字符、并且我不需要等到 FIFO 填满。

    你能看到我在这里做错了什么吗?

    谢谢你。

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

    (不)可靠确切意味着什么?

    1) 1)指示符(RXFE)表示有一个字节、但这不是您预期的字节?

    2) 2)指示符表明没有字节、但您期望的字节在 DR 中(可见)?

    3) 3)指示符表明没有字节、您期望的字节不在 DR 中、但它确实应该已经到达?

    此外:是否实际启用了 FIFO [UARTLCRH:FEn]?

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

    我把一些代码段粘合在一起、并被提醒 UARTEnable 会设置 Fen=1。  

    如果您通过调用 UARTFIFODisable (UART3_BASE)来跟踪该调用、那么您将获得(我想)所需的逐字节行为。

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

    A.以下是您的第一篇文章的答案(在我阅读第二篇文章之前)

    以下是使用以下查找 RXFE 寄存器的代码时发生的情况

    while (1)
    {
       ASM ("      movw r1,#0xf000 ");
       ASM ("      movt r1, #0x4000 ");
       ASM ("      LDR R2、[R1、#0x018]"); // UART3_UART_FR
       ASM ("      和 R2,#0x10     "); // RXFE
       ASM ("      CMP R2,#0x00    ");
       ASM ("      博讷  诺因        ");
       ASM ("      LDR R3、[R1]        ");
       ASM ("      MOV R3和 R3        "); //在步骤2中添加的断点。&步骤4。
       asm ("noin:MOV R3、R3        ");

    第1步:如果我发送相同的字符16次、该字节将在第16次通过时显示在 UART3_UART_DR 中、而不会像预期的那样显示在 R3中。

    第2步:如果我按如图所示放置一个断点、该字节将显示在 R3中、但一些随机的其他字节将显示在 UART3_UART_DR 中。

    我查看了 UART_LCRH、其值为70、因此启用了 FIFO。 然后、我本来想我实际上不希望启用 FIFO、所以我把值更改为60、结果好些。

    第3步:现在、当我发送一个 char 后、 每次它都会立即出现在 UART3_UART_DR 中、但它仍然没有出现在 R3中。

    第4步:当我如图所示放置断点时、字节会显示 UART3_UART_DR 和 R3、但当然、我不能一直在那里有断点。

    香港特区政府

    B.这是你的第二篇文章的答案,我在回答第一篇之前没有读过。

    我删除了为禁用 FIFO 而编写的代码、并将其替换为 UARTFIFODisable (UART3_base)。  它的工作方式与步骤3和4完全相同。  我还尝试了使用 RXRIS、它的工作方式与步骤3和4完全相同。

    我想我们已经非常接近解决这个问题了。  非常感谢您的帮助。  

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

    实际上、我认为它是有效的。  我开始想可能是我的寄存器显示可能不会刷新、因此我向它发送了一个字符、然后我在代码中放入一个断点、寄存器显示在 R3中显示了正确的值。  必须是、当代码处于严格的无限循环中时、寄存器显示不会刷新。

    再次感谢大家。  你帮我解决了我的问题。 我将按下"这解决了我的问题"。