我必须使用
STM32F401 设计一个特殊的 USB <-> RS485 转换器。
我首先使用 STM32F4071G 评估板实现了该项目,该评估板具有 DMA 支持的 USART 功能且没有 RTOS,使用带有 FW-F4_V1.25.1 的 STM32Cube 并且一切正常。
在将软件移植到带有目标 MCU STM32F401 的 Nucleo 评估板后,从 RS485 到 USB 的传输也可以完美地达到 115200 的波特率和每次拍摄千字节的数据。
但是,在将所有数据正确发送到 RS485 端口后,从 USB 到 RS485,调用 UART 溢出 ISR,并且 HAL 保持在永久循环中以重新发送数据,现在立即出现溢出错误,只能通过重置来停止。
该错误的发生与波特率(我尝试将其降至 300)和字节数无关。如果我仅通过 USB 发送一个字节,它会以与发送 64 个字节(一次 USB 传输的最大字节数)相同的方式崩溃。数据将全部传输并到达 RS485 设备,但 HAL_UART_TxCpltCallback 不会被调用,而是溢出中断。
我同时在社区和互联网上搜索解决方案。但是,尽管这个问题经常被不同的用户报告(特别是对于 STM32-HAL),但没有提出解决方案。
系统时钟设置为84MHz,APB1外设时钟设置为42MHz。我可以理解如果 MCU 速度较慢,从 UART 接收数据时可能会出现溢出错误。但是,当通过 UART 仅发送 DMA 支持的一个字节数据时,怎么会发生这种情况呢?我怎样才能防止 HAL 永久且无意义地尝试再次发送数据?