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.

[参考译文] TM4C123GH6PM:清除 UART 发送缓冲器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/817512/tm4c123gh6pm-flushing-uart-transmit-buffer

器件型号:TM4C123GH6PM

在我发送任何数据之前是否有办法清除 UART 发送缓冲区(以确保它确实为空)? 我正在使用禁用 FIFO 的 UART0。

此致、

Ksawery

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

    在 FIFO 禁用的情况下、您有一个发送移位寄存器和一个字节保持寄存器。 一旦一个字符传输开始(移位寄存器中的数据)、即使 TXE (发送使能)位被清零、它也将继续传输直到完成。 但是、这将阻止保存寄存器中的字符传输到移位寄存器。  

    您可以通过检查 UART 标志寄存器的 TXFE 位来判断保存寄存器是否为空。 (如果置位、则保持寄存器为空。)

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

    如果我使用 UARTCharPutNonBlocking (),是否会覆盖保留寄存器中的任何字节?

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

    不可以、该函数在写入字符之前检查 FIFO 满标志是否未置位。 当 FIFO 模式被禁用时、FIFO 满标志代表保存寄存器的状态。 该函数的源文件为"C:\ti\TivaWare_C_Series-2.1.4.178\driverlib\UART.c"。 我已包含以下函数的副本。

    这是 TivaWare 库不支持您所要执行的操作的极少数情况之一。 您可以编写自己的函数来执行 HWREG 写入、而无需检查 FIFO 满标志。

    //
    //
    //! 向指定端口发送字符。
    //!
    //! \param ui32Base 是 UART 端口的基址。
    //! \parucam Data 是要传输的字符。
    //!
    //! 此函数将字符\e ucData 写入//
    的发送 FIFO 中! 指定的端口。 此函数不会阻止、因此如果没有空格
    //! 可用、然后返回一个\b false、应用程序必须重试
    //! 函数。
    //!
    //! 如果字符成功放置在
    //! 发送 FIFO;如果发送中没有可用空间、则为\b false
    //! FIFO。
    ////
    *****************
    bool
    UARTCharPutNonBlocking (uint32_t ui32Base、unsigned char ucData)
    {
    //
    //检查参数。
    //
    assert (_UARTBaseValid (ui32Base));
    
    //
    //查看发送 FIFO 中是否有空间。
    //
    if (!(HWREG (ui32Base + UART_O_FR)& UART_FR_TXFF))
    {
    //
    //将此字符写入发送 FIFO。
    //
    HWREG (ui32Base + UART_O_DR)= ucData;
    
    //
    //成功。
    //
    return (true);
    }
    其他
    {
    //
    //发送 FIFO 中没有空间,因此返回失败。
    //
    return (false);
    }
    }
    

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

    好的,所以它完全与我的预期相反:)我将需要改用 UARTCharPut。

    此致、

    Ksawery