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:Tivaware UART 配置

Guru**** 2601915 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/743817/tm4c123gh6pm-tivaware-uart-configuration

器件型号:TM4C123GH6PM

您好!

在阅读 TIvAware 库文档和一些示例代码时、我看到传递给 UARTConfigSetExpClk 函数的 UART 时钟是 SysCtlClockGet ()返回的值、但在我的情况下、这不起作用、我想知道原因。

我将系统时钟配置为:

/*设置系统时钟*/
ROM_SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN); 

然后、在 UART 配置步骤中、我必须手动将 UART 时钟设置为16000000才能正常工作:

ROM_UARTConfigSetExpClk (UART0_BASE、16000000、115200、
(UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE |UART_CONFIG_WLEN_8); 

因为如果我使用 SysCtlClockGet()而不是16000000、波特率设置不正确、并且我通过串行端口接收垃圾

ROM_UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、
(UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE |UART_CONFIG_WLEN_8);//这似乎未正确设置 BAUDRATE 

有人能解释一下为什么,如果我使用 SysCtlClockGet () (它实际上返回40000000),它不起作用吗? 我认为 UART 外设时钟与系统时钟相同。

谢谢

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

    在您的第一个 ROM_UARTConfigSetExpClk API 中、您说系统时钟手动以16 MHz 运行、这是不正确的。 您的时钟设置为40MHz。

    用于配置 UART 的 API 看起来不错。 我怀疑还有其他事情在发生。 您没有正确的发送和/或接收设置、或者您的终端程序未设置为正确的波特率。

    我使用您的系统时钟分频器测试了 TivaWare 中的 UART_ECHO、它也是115200波特示例、运行正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph、

    感谢您的回答。 查看代码、我发现我正在使用内部16MHz 时钟用于 UART。。。 这就是为什么它只在我将 UART 时钟配置为16MHz 时才起作用、太傻了、抱歉。

    下面是配置 UART 的方法:

    void UART0_Init (void)
    {
    //
    //启用 UART 使用的 GPIO 外设。
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    //启用 UART0
    //
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    //等待 UART0模块准备就绪
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART0))
    {
    }
    
    //
    //为 UART 模式配置 GPIO 引脚。
    //
    ROM_GPIOPinConfigure (GPIO_PA0_U0RX);
    ROM_GPIOPinConfigure (GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    //使用内部16MHz 振荡器作为 UART 时钟源。 ->在这里!
    //
    UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
    
    //
    //将 UART 配置为115、200、8-N-1操作。
    //
    ROM_UARTConfigSetExpClk (UART0_BASE、16000000、115200、
    (UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE |UART_CONFIG_WLEN_8);
    
    //
    //启用 UART 操作。
    //
    ROM_UARTEnable (UART0_BASE);
    
    //
    //启用 UART RX 中断。
    //
    ROM_IntEnable (INT_UART0);
    ROM_UARTIntEnable (UART0_BASE、UART_INT_RX);
    
    
    UART0_LCRH_R &=~(1U <<4);//禁用 FIFO */
    } 


    我想我必须在 UARTClockSourceSet 中使用 UART_CLOCK_SYSTEM

    谢谢!

    Javi