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.

[参考译文] RTOS/TM4C123GH6PGE:UART 波特率错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/796304/rtos-tm4c123gh6pge-uart-baud-rate-wrong

器件型号:TM4C123GH6PGE
主题中讨论的其他器件:TM4C123

工具/软件:TI-RTOS

我有一个使用 RTOS v 2_16_01_14的项目、我将像这样设置 Tiva 时钟源...

   ROM_SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_25MHz);   //从 PLL 计时(50MHz)
   SystemClockFreq = ROM_SysCtlClockGet ();      //验证50MHz

我正在为38400 8N1配置 UART、如下所示...

空 initUART (空)

   UART_Params uartParams;

   SysCtlPeripheralEnable (SYSCTL_Periph_UART5);
   while (!SysCtlPeripheralReady (SYSCTL_Periph_UART5));

   MAP_GPIOPinConfigure (GPIO_PE4_U5RX);
   MAP_GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_4);   /UART RX
   MAP_GPIOPinConfigure (GPIO_PE5_U5TX);
   MAP_GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_5);   /UART TX

   UART_INIT();

   UART_PARAMS_INIT (uartParams);
   uartParams.readDataMode = UART_DATA_BINARY;
   uartParams.writeDataMode = UART_DATA_BINARY;
   uartParams.baudrate = 38400;

   uart5 = UART_open (UART5、uartParams);
   if (uart5 == NULL){
      System_printf ("打开 UART5 Midi"时出错);
      system_flush();
   }


但当我使用 UART 时、波特率是错误的。 我观察 UART_CC 为0x00 (系统时钟)、但 UART_IBRD 已设置为0x82 (130)、UART_FBRD 设置为0x0D (13)。 根据数据表、这些值应为 IBRD:50000000/(16x38400)=81.3802、FBRD:0.3802x64+0.5=24。

有人能不能告诉我出了什么问题。

提前感谢 Richard

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

    您好 Richard、

    您能否制作一个简单的 CCS 项目来显示问题并将其导出。 最好包含所有部分(例如驱动程序配置、.cfg 等)。 最简单的方法是右键单击该项目,选择“导出...”、“常规”->“存档文件”,然后验证是否选择了正确的项目,并为其指定一个名称(和“完成”)。

    Todd

    编辑:并使其能够在 TI LaunchPad 上运行。

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

    [引用 user="Richard alan">我有一个使用 RTOS v 2_16_01_14的项目、我将像这样设置 Tiva 时钟源...

       ROM_SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_25MHz);   //从 PLL 计时(50MHz)
       SystemClockFreq = ROM_SysCtlClockGet ();      //verify 50MHz[/quot]我认为 TI-RTOS 设置中的时钟配置和 ROM_SysCtlClockSet 可能会发生冲突。

    默认情况下、对于 TM4C123器件、在调用应用程序主函数之前、TI-RTOS 会根据以下内容将时钟配置为80MHz:

    TI-RTOS 计算得出的 TI-RTOS "计算" CPU 频率用作预期系统频率、该频率通过   tirtos_tivac_2_16_00_08\products\tidrivers_tiiva_2_16_00_08\packages/ti\drivers\uartvac.c 中的 UARTTIA_open 函数传递给 UARTConfigSetExpClk

    我认为可能导致您失败的原因是:

    答:TI-RTOS 使用的预期 CPU 频率为80MHz (创建 TM4C123项目时为默认值)。

    b.当您的代码调用 ROM_SysCtlClockSet 将系统频率设置为50MHz 时、TI-RTOS UART 驱动程序会假设系统频率为80MHz、从而导致波特率不正确。

    此外、由于默认的 TI-RTOS 时钟配置假定晶振为16.0MHz、但您的电路板具有25MHz 的晶振、因此由 TI-RTOS 启动代码(在到达 main 之前)设置的系统频率可能会在启动期间对器件进行超频。

    因此,建议:

    a.从 应用程序中删除 ROM_SysCtlClockSet 调用。

    b.在 TI-RTOS 时钟配置中、根据使用的25MHz 晶体设置所需的50MHz 系统频率、方法是将启动-计时选项设置为: