0

我正在使用 STM32F407,并且正在从事一个尝试使用 USART3 接收数据的项目。

项目概况:

我必须通过电线发送一个特殊的 PWM 序列。发送 PWM 后,我在同一根线上立即收到串行数据的响应(USART 标准,8N1)。我使用 timer1 更新中断生成 PWM。在最后一个脉冲之后,我停用了 timer1 中断并激活了 USART Rx 中断。然后 - 通常 - 我应该收到串行数据。接收数据并将它们存储在环形缓冲区中的代码在其他项目中工作得很好。

我的问题:

有时会正确接收传入的串行数据(它是96 个单字节的流)。使用可以解码 USART 信号的示波器,我可以看到正确的数据到达 USART Rx 引脚。但是 USART Rx 中断不能正常工作。大多数情况下,我只收到一个字节(只有一个中断)。为了调试 ISR,我将 SR、DR 和 CR1 寄存器保存到一个数组中,以记录发生了哪些错误标志。寄存器值向我显示,每次帧接收失败,我设置了一个或多个不同的错误标志。噪声错误、溢出错误和帧错误。但是,如果有时接收有效,我会看到没有设置错误标志。

我认为每次一个字节到达 USART 时都会产生一个 Rx 中断,而与错误标志的状态无关......

我真的不知道为什么如果有错误标志,ISR 只能工作一次。

有人可以帮助我吗?

更新 1

这是一个简短的更新。我和某人交谈过,有人告诉我,USART 接收 PWM 信号也可能是个问题。当 USART 仍在运行时,我将尝试将引脚的状态更改为输出。在最后一个 PWM 脉冲之后,我会将引脚的状态更改为 UASRT Rx 输入。如果 USART 只能接收串行信号,也许这可以解决问题。我将在这里发布我的过程。

解决方案

上周我解决了我的问题。

首先,我遇到的问题是一个函数将 Rx 引脚配置为另一个外设的输入......(._.)

第二个问题是信号质量差。STM32 的 USART 可以工作在 ONEBIT 模式。这种模式(据我了解)仅对每个位进行一次采样,而不是对每个位进行三次采样。所以我将我的 USART 的容差提高到 3.88%。

最后,为了安全起见,我在激活 USART Rx 中断之前清除了所有挂起的 USART 中断位。

现在我可以可靠地接收传入的帧。

感谢您的评论和帮助。

4

0 回答 0