Thread 中讨论的其他器件: SysConfig、 MSPM0G3519
工具/软件:
大家好:
我们已经开发了嵌入了 MSPM0G1507 MCU 的 PCB。 我们现在正在为其编写代码、并在从 MCU 传输消息期间 UART 模块存在一些奇怪的问题。
首先、我们使用 Code Composer Studio 12.8.1开发工程、并使用 TI DriverLib 和 SysConfig 作为代码库和 GCC 编译器。
我先简单介绍一下这个问题。 我们开发了 PCB、旨在成为许多各种机器项目的通用控制板、因此 MCU 中使用了许多元件。 此外、我们使用3个 UART 模块。 因此、我们的意图是将几乎所有 DMA 通道用于各种模块。 因此、我们必须为每个 UART 模块使用一个 DMA 通道、当我们需要通过 UART 模块在发送和接收数据之间切换时、对其进行重新配置。 此外、为了避免大量 CPU 中断、我们尝试轮询每个 UART 模块的 CPU 原始中断状态寄存器。 特别是对于发送、我们会检查 CPU_INT.RIS 寄存器中是否设置了传输结束标志、这样会检查数据传输是否完成。
最初、我们看到它运行正常。 当我们检测到设置到 CPU_INT.RIS 寄存器中的标志后、我们也会通过 ICLR 寄存器将其清除、并继续执行我们的程序、但我们只是遇到了一些问题。 在我们的一个项目中、我们必须定期(例如每秒发送一次)发送机器状态、现在我们看到在 UART 线路上偶尔会跳过(未发送)一些字节。 我们发送的数据包为10个字节、偶尔会跳过1个字节(每次发生时、可能会跳过1个字节)。 这种情况通常发生在5-10%的时间、而不是特定的时间段或顺序。 我们进行了 大量 测试来尝试找到原因、99%的员工都能确定它与此 RIS 寄存器轮询方法(而不仅仅是 UART 模块)有某种关系。
状态字符串作为 char 数组启动、在程序主循环中仅修改其中3个字符。 我们尝试的测试之一是禁用编译器的代码优化级别、这只是将问题减少到大约1%的错误出现。 我们尝试的另一个测试是用与状态字符串匹配的静态字符串替换状态字符串变量、而这里实际上没有错误、无论代码优化级别如何。 在这里、我们认为必须以某种方式将其与可变用途连接起来。
然后、我们进行了测试、在传输事件结束时实际运行中断例程、这里实际上也没有错误。 但是... 在我们的主工程中、我们还运行了 ADC 模块。 在这里、 我们要为 ADC 执行 DMA 乒乓概念、在主程序循环中、我们调用一个函数、在该函数中、我们轮询 ADC 模块的 CPU_INT.RIS 寄存器、并在 ping 和 pong 存储器位置之间切换时检查是否设置了 DMA_DONE 中断标志。 我编写 ADC 概念的原因是在 ADC 和 UART 中断标志轮询之间实现并行、然后表明 即使我们在 UART 模块上使用标准中断例程、但我们在其他某个模块上使用 RIS 寄存器轮询例程、在通过 UART 模块传输时恰好会跳过一些字节。
最后、我必须添加、当我们设置传输结束标志时、也会设置 DMA_DONE_TX 标志。 此外、我们还使用数据记录器连接到 UART 模块发送线、可以确认字节确实被跳过(不仅仅是该字节长度的低压线路或高压线路)。
因此、我们的结论是、如果我们在任何 MCU 模块的代码中的任何位置使用轮询的 RIS 寄存器、在 UART 传输期间会跳过字符数组变量中的某个字节。 如果我们要发送 statis 字符串、或者我们不使用 RIS 寄存器轮询、那么就不会跳过字节。 根据 RIS 寄存器和调试信息、我们可以看到数据正确地传递到 DMA 模块、并且 DMA 模块将请求的字节数传输到 UART 模块、并且 UART 模块似乎没有对 UART 发送线上的所有数据进行序列化。
那么、现在我联系您寻求帮助来解决一个问题:是否可以通过 RIS 寄存器轮询(而不是使用某些特定 MCU 配置 或过程的常规中断例程)成功结束传输检测、并对通过 UART 总线发送的所有数据执行此操作? 如果需要、我可以提供测试项目。
提前感谢、祝您好运!
Jovan