UART 信号“四舍五入”

电器工程 stm32 UART 串行
2022-01-13 21:41:56

我正在尝试为 STM32F405 调试 UART 驱动程序。它在特定波特率(约 50 kBd)以上不起作用。我将它连接到具有模拟能力的逻辑分析仪,我看到信号是四舍五入的;信号上升需要时间。似乎在较高的波特率下,信号不会上升到足以被读取的程度。

如何让 UART 以更高的速度运行?我不确定这是否是硬件问题,或者是否可以在软件中纠正。

逻辑分析仪屏幕截图,MCU 以 38400 波特传输。 Saleae Logic 程序的屏幕截图显示串行信号缓慢上升,并且与较长的信号没有完全达到相同的水平

逻辑分析仪屏幕截图,MCU 以 115200 波特传输。 Saleae Logic 程序的屏幕截图显示串行信号缓慢上升,峰值几乎没有达到完整信号电平。

更多细节:

  • 我正在使用连接到我的桌面的 FTDI 芯片读取串行连接。
  • 我用连接到与 FTDI 相同线路的 Saleae Logic 8 嗅探了这种连接。
  • 在显示的屏幕截图中,开发板正在通过串行发送“测试”。
  • MCU 是 OpenPilot Revolution 飞行控制器的一部分。
3个回答

检查 UART TX 的 GPIO 引脚是否配置为替代输出推挽模式。看起来它被配置为替代输出开漏。

你有电路原理图吗?

除了配置错误的 GPIO 引脚之外,另一种可能性是您的 UART 线上有一个电容器,充当低通滤波器,并防止信号快速上升。

如上所述,将其设置为输出推挽模式可以解决问题,但是您可能还需要检查“最大输出速度”是否设置为“非常高”,如果您的系统可以容忍,请添加内部拉-上电阻;我知道关于 USART 是否应该有引体向上有各种不同的思想流派,所以尝试一下,看看它是否能满足您的需求/需要/项目允许。

如果您使用 STM32CubeMX 进行初始化/配置,那么这些设置都可以在 pinout & configuration > USARTx(或 UARTx,无论您用于项目的哪个通道)> GPIO Settings 中找到。

如果您只是手动修改模板文件(并假设您使用的是 HAL 库),那么引脚设置应该在项目的 src 文件夹中,在名为 stm32F4xx_HAL_MSP.c 的文件中(或您使用的任何芯片)使用)

您正在寻找这些线路;

GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

确保 GPIO.InitStruct.Speet 设置为非常高(如上)并将 InitStruct.Pull 设置为: GPIO_InitStruct.Pull = GPIO_PULLUP;

我已经成功地完全滥用了 STM32F4 上的 UART 并让它以 15MB/s 的速度运行而不会丢失位,这是我的 FTDI 到 USB 转换器运行的最快速度。我看到虽然在 CubeMX 设置中,它说要保持在 1MB/s 以下。