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.

[参考译文] TM4C129ENCPDT:UART 示例、仅当使用带有 PLL 的 xtal 25MHz 时波特率错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/635237/tm4c129encpdt-uart-example-wrong-baud-only-when-using-xtal-25mhz-w-o-pll

器件型号:TM4C129ENCPDT

你(们)好 我在做 UART 示例、应该是115200波特、当我使用内部 osc 时、但当我使用外部25MHz 晶体时、实际上得到 的波特率是74184。 (使用 TivaWare_C_Series-2.1.4.178)

我测量了外部 xtal、它的运行频率精确为25MHz。

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |
SYSCTL_USE_OSC)、25000000);

我已使用调试器验证 ui32SysClock 是否设置为25000000。

(笑声)

MAP_UARTConfigSetExpClk (UART0_BASE、ui32SysClock、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE)); 

或者、当我使用内部 osc 时、如下所示、波特率实际上为115200 (这次将 ui32SysClock 设置为16000000)。

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_16MHz | SYSCTL_OSC_INT |
SYSCTL_USE_OSC)、16000000);

我只是想知道原因是什么。

我还尝试了如下 PLL:

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

系统运行速度当然快得多、但波特率实际上是正确的、115200和 ui32SysClock 设置为120000000。

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

    您好 Pgib、

    即使对于25MHz、您也可以使用 PLL。 您能否尝试这些设置并查看其是否起作用?

    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、25000000); 

    您可能需要通读 一下有关采用25MHz 晶体的 MOSC 设置的整个主题:https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/515364

    如果25MHz 的 PLL 配置适合您、这应该是一个好的解决方案、否则我建议您阅读该线程的详细信息并尝试检查您的 SYSCLK 输出、就像 R Sexton 那样(他发现他不是25MHz) -如果您得到相同的行为,则按照该线程查找应用程序的分辨率。

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

    你(们)好。

    我尝试了您的时钟设置、这些设置也正常工作、通过工作、我的意思是 UART 波特率是它应该达到的值(115200)。

    根据您的设置 、g_ui32SysClock (也称为 ui32SysClock)设置为24MHz、这是可以理解的、因为 PLL 为480MHz。

    我还继续提出您的另一项建议、即查看时钟输出。 我发现的最好的东西是 DIVCLK、我不确定这是否是您的想法。

    我按如下方式进行配置:

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOQ));
    MAP_GPIOPinConfigure (GPIO_PQ4_DIVSCLK);
    GPIODirModeSet (GPIO_PORTQ_BASE、GPIO_PIN_4、GPIO_DIR_MODE_HW);
    GPIOPadConfigSet (GPIO_PORTQ_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD);
    HWREG (0x400fe148)= 0x8000000;
    

    也许这是完全合理的、但完全不符合我的期望、因为该引脚(102)的输出信号为750kHz。 不知道该怎么做。

    不管怎样、这对我来说不是真正的问题、因为当我使用 PLL 时波特率是正确的、并且我将无论如何使用 PLL 来运行它。

    我之前也从勘误表中发现了这个问题、但由于我使用的是最新和最棒的 driverlib (2.1.4.178)、我发现这不适用于我。

    有趣的是、我还在使用引导加载程序、这完全是一个单独的 CCS 项目、在这里我也会得到一个坏波特率、这个是 74074波特率。 这不会阻止我执行我的工作、我只需将 LM 闪存加载程序设置为这个并继续。 但是、如果您对此感兴趣、那么我愿意尝试其他您想想到的东西。

    此致、

    Pascal