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.

[参考译文] MSPM0G3507:UART 配置问题。

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1455497/mspm0g3507-problem-to-configure-uart

器件型号:MSPM0G3507

工具与软件:

尊敬的先生/女士:

我尝试在这个控制器上运行 UART、

我有两种封装、一种是28引脚、另一种是48引脚。

在两个控制器中、UART 3均正常运行、但 UART 0和 UART 1未正常运行。

我只是尝试在每个 UART 上运行 echo 程序、但 配置设置存在一些问题、因此 程序无法正常运行。

我附上终端照片,其中 我们试图回显字符'A',但我们没有得到返回'A'。  

我们使用的是16MHz 的外部晶体。 我们已经运行了其他外设、如 LED、字母数字显示屏等。

此外、我们还共享一个用于尝试运行 UART 的代码以供参考。

void UART_init (UART_Regs * uart、uint32_t baud)

UART->CLKSEL = DL_UART_CLOCK_BUSCLK;

DL_UART_DISABLE (UART);
UART->CTL0 =(DL_UART_DIRECTION_TX_RX);
UART->LCRH =(DL_UART_WORD_LENGTH_8_BITS);

UART->CTL0 |= DL_UART_OVERSAMPLING_RATE_16X;

UART->IBRD = 26;
UART->FBRD = 3;
SET_BAUD_RATE (UART、BAUD);

/*配置中断*/
UART->CPU_INT。 IMASK = DL_UART_INTERRUPT_RX;

DL_UART_Main_ENABLE (UART);

 如果(UART = UART3)
 {
  NVIC_ClearPendingIRQ (UART3_INT_IRQn);
  NVIC_EnableIRQ (UART3_INT_IRQn);
 }

 否则、如果(UART = UART0)
 {
   NVIC_ClearPendingIRQ (UART0_INT_IRQn);
   NVIC_EnableIRQ (UART0_INT_IRQn);
 }
}

这是我们用于测试 UART 的代码。

当我们在此函数中传递 UART 3时、UART 3会正常运行、但当我们使用任何其他 UART (例如 UART 0和 UART 1)时。

无法正常工作。

我们也只是尝试传输字符串 、但终端上也有垃圾值。

请帮助纠正此问题。

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

    > UART->CLKSEL = DL_UART_CLOCK_BUSCLK;

    对于 UART0-2、BUSCLK 为 ULPCLK、对于 UART3、BUSCLK 为 MCLK [参考 TRM (SLAU846A)第16.2.1段]。 ULPCLK 根据 MCLKCFG 进行设置。 UDIV、默认为=1、即 ULPCLK=MCLK/2 [参考 TRM 表2-33]。 这意味着您的 xBRD 值会有所不同。

    尝试设置 MCLKCFG。 UDIV= 0、因此 ULPCLK=MCLK/1。

    [编辑:更正了拼写错误。]

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

    尊敬的  Trilok:

    同意 Bruce 的意见。

    如果使用默认32MHz (SYSOSC)、MCLK 将与 ULPCLK 相同。

    如果您确实配置了高于40MHz 的 MCLK (通常使用 PLL)、那么 ULPCLK 将为 MCLK/2。

    B.R.

    SAL

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

    感谢您的答复。

    您能否分享 UART 0和 UART 1的任意示例代码、以便我们了解分辨率。

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

    请参阅下面的 SDK 示例工程、它使用 UART0进行通信。

    https://dev.ti.com/tirex/explore/node?node=A__AEDfu0vT-g8KuJe2UMLixw__MSPM0-SDK__a3PaaoK__LATEST 

    您应注意工程的 BUSCLK:(打开.syscfg 文件)

    如果设置80MHz 和40MHz、 您可以在这里找到 UART0-2/UART3的区别。

    [根据数据表规格、ULPCLK 不应超过40MHz。]

    B.R.

    SAL

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

    谢谢你。  

    我认为我的问题已经解决。

    我只需另外运行所有 UART 来确认。

    感谢您的支持。

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

    不用客气。 我将在问题解决后关闭该主题帖。 如果您有进一步的问题、请随时在此处回复或提交新问题。

    B.R.

    SAL

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

    作为.syscfg 更改的替代选项、您可以使用如下命令:

    > SYSCTL->SOCLOCK   。 MCLKCFG &=~SYSCTL_MCLKCFG_UDIV_MASK;// UDIV=0 -> ULPCLK=MCLK/1

    正如 Sal 所指出的那样、如果 MCLK>MCLK 40MHz、则不能执行此操作(但如果您在16MHz 上运行、则不能执行此操作)。