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:在运行>32MHz CPUCLK 时、UART TX DMA 数据损坏取决于 MCLK/ULPCLK 配置

Guru**** 2535530 points
Other Parts Discussed in Thread: MSPM0G3507, LP-MSPM0G3507, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1317687/mspm0g3507-uart-tx-dma-data-corruption-depending-on-mclk-ulpclk-configuration-when-running-32mhz-cpuclks

器件型号:MSPM0G3507
Thread 中讨论的其他器件:SysConfig

您好!

我想向您介绍一些有关在32MHz 以上运行 CPU/MCLK 时钟时 UART TX DMA 数据损坏的问题。 我在当前正在开发的定制硬件和固件项目中遇到问题、但能够将问题范围缩小到微控制器时钟域中似乎存在的问题。 为此、我能够在 LP-MSPM0G3507 Launchpad (标记为修订版 A)上可靠地重现故障行为、并对 TI 提供的 UART TX DMA 示例("UART_TX_multibyte_fifo_dma_interrupts_LP_MSPM0G3507_nortos_ticlang")进行了略微修改、以便它在 EOT 和 DMADONE 重复字符数组和 DMADONE 标志上等待 ASCII 字符数组 (没有更改)处于115200波特的无限 while 循环中。

该示例使用由 SYSOSC 直接提供的 CPU/MCLK/ULPCLK、并且一切运行完美。 如果我从 SYSPLL 提供这些时钟、但32MHz、一切都可以正常工作。 如果我更改 UDIV、使16MHz 不发生数据损坏、该功能也适用。 如果我现在尝试为 CPUCLK/MCLK 计时任何高于32MHz 的值、我就会开始遇到 PC 端接收到的数据损坏的问题。

在我看来,如果 MCLK > 32MHz 数据将在这些情况下 MCLK != ULPCLK 损坏。 例如、如果 I CLOCK 40MHz 40MHz (UDIV=/1)、则一切仍能正常工作、不会发生损坏。 如果我现在将 UDIV 更改为/2并且20MHz、我开始看到损坏。 例如、如果我尝试(就像我正在处理的真实项目中)为80MHz 和40MHz 计时、也会发生这种情况。 我觉得、目前这将把可用的 CPUCLK/MCLK 总数限制为最大值。 40MHz 不出现损坏、因为 ULPCLK_max 为40MHz。

我还尝试为 UART0外设提供不同的时钟源(MFCLK=MCLK)、同时保持4MHz 时钟速度加快。 这也会导致接收到的 TX 数据损坏。

我曾提到、为此目的、我更改了提供的 UART TX DMA 示例、同时通过 Git 跟踪我在本文中写入的更改和故障引入配置状态、以便您可以回溯我的更改、 比较提交、并轻松地将 MSP 带入我所描述的错误数据破坏状态。

编辑:在我使用80MHz 时钟的实际项目中、如果我使用阻塞 UART 写入、UART 数据就不会损坏、因此我认为问题出在 DMA 时钟方面。

在此问题上的每一位帮助和信息都是非常感谢和提前感谢
乔纳斯

e2e.ti.com/.../uart_5F00_tx_5F00_multibyte_5F00_fifo_5F00_dma_5F00_interrupts_5F00_LP_5F00_MSPM0G3507_5F00_nortos_5F00_ticlang_2D00_DATA_2D00_CORRUPTION.tar.gz

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

    尊敬的 Jonas:

    我刚刚运行了 SDK 中的代码(uart_tx_multibyte_fifo_dma_interrupts)、其中 MCLK 在80MHz 处、ULPCLK 在40 MHz 处、UART 输出在我的示波器上看起来是正确的。 然后、我尝试了相同的代码、但将 MCLK 调整为40MHz、将 ULPCLK 调整为20MHz、但仍然没有看到此问题。  

    似乎问题可能来自您所做的一些更改。 我看到您说您进行了很小的更改、但您可以尝试通过打开该示例的未编辑版本并再次尝试测试来进行验证吗? 如果您最终确实看到了这个问题、您能否向我展示您用于设置 MCLK、ULPCLK 的设置以及 UART 正在使用的时钟?

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

    尊敬的 Dylan:

    我和 Jonas 一起完成了这个项目。 UART 输出在示波器上看起来是正确的、因为这种输出并不频繁。 您会发现数据缺失/损坏、每1000字节可能有一个字节左右。 因此、您只能通过在 PC 上接收数据并检查所有内容是否在较长时间内到达来进行观察。

    最佳

    科尔涅里乌斯

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

    感谢您的更新、Cornelius。 我今天将做一些额外的测试来尝试复制、然后用我的发现返回给您。

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

    您好、Cornelius、您好、Jonas、

    我已经可以运行您的项目了、现在我确实看到有问题的 UART 行为。

    检查了一会儿后、似乎问题出在我们的 SysConfig 工具中:当您使用"Clock tree enable"选项并选择使用 MFCLK 时、似乎该时钟实际上并未启用。

    我现在的建议是 在 SysConfig 中打开"SYSCTL"选项卡、取消选中"Use Clock Tree"功能、然后向下滚动到 MFCLK 部分。 展开该部分、然后单击以启用它。 对于所需的任何其他时钟设置、请在"SYSCTL"选项卡中输入它们、而不是在时钟树中输入它们。 现在、当您重新构建项目并重新对器件编程时、您应该能够看到 UART 数据发送正确。 我在末端进行了尝试、看起来 UART 数据已正确发送、而且没有损坏。

    请在您有机会尝试进行此更改时告诉我、如果有其他问题、请告诉我。 我将与我们的软件团队合作、使该功能正常运行。 感谢您指出这一点。

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

    您好,Dylan,感谢您的回答。 如果我根据您的建议停用时钟树并启用 MFCLK、并将其余部分保持默认状态、则时钟树正常工作。 问题在于、这些默认值将启动32MHz、并且一切都在正常工作(与使用相同设置启用时钟树时一样)。 现在、如果我继续在 SYSCTL 中设置时钟、而不使用时钟树功能、然后使用 SYSPLL、80MHz 和 ULPCLK=ULPCLK 进行设置80MHz (使默认 ULPCLK 分频器保持为1、 这种情况非常奇怪、即使参考手册指出 PD0/ULPCLK 时钟最大为40MHz 也是如此。) 它运行没有问题、但我不知道后面会介绍哪些副作用、因为 MSPM0G 参考手册指出 PD0时钟为40MHz max。 因此、我再次将 ULPCLK 分频器设置为2、以便80MHz 40MHz、4MHz、并且同样的问题也会发生在数据损坏时。 因此、这看起来不是修复方法。

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

    感谢您指出。 实际上、我以为我已经检查了该项、但我想我已将 UART CLK 源保留为 BUSCLK。 当我在项目中将其更改为 MFCLK 时、我再次看到了您提到的错误。

    我对你的项目做了很多修改,慢慢开始缓解腐败,虽然其中一些帮助,但仍有腐败在生产线上。 当我有两个项目,我的启动项目和你的项目时,这变得相当令人沮丧,我把它们都改变到几乎完全相同的程度,而一个工作,而一个没有。

    最后、我查看了项目属性并检查了优化级别、发现您的项目使用的优化级别为2、我的已进行优化。 因此、我关闭了项目优化、损坏停止了、即使我完全恢复到您的所有初始设置、包括使用时钟树。

    有一点、我认为如果关闭优化、则应该能够传输 UART 数据而不会损坏。 我最终尝试了这种方法、完全重新导入您的项目、然后除了优化之外不做任何更改、因此这里应该不会有问题。

    其次、优化不应影响 UART 数据是否在未损坏的情况下发送。 这是另外一个我必须和我们的软件团队一起研究的问题。  

    请在您有机会尝试一下时告诉我。 若要查找此设置、请右键点击工程、点击属性、展开"Arm Compiler"选项卡、点击"优化"、然后将"Select optimization pattern/leve (-O)"设置设为空白选项。 然后依次点击"Apply"和"Close"。

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

    尊敬的 Dylan:

    我已将优化更改为-O0 (并且也进行了测试、将其留空)、问题仍然存在。

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

    尊敬的 Jonas:

    最后,在 WAIT_DMA_READY ()函数中轮询后,您是否将 gTxDone 和 gDmaDone 标志设回 false ? 在探索了一些其他可能的计时问题后、我意识到您发送给我的原始工程没有将这些标志设置回 false、因此该函数不会等待在循环主体的第一次迭代后设置这些标志。

    如果您已经注意到这一点、但仍然看到问题、能否验证您正在使用哪个版本的 CCS、SDK、SysConfig 和编译器? 在您继续查看此潜在的计时问题时、我要验证我使用的是相同的工具集。