启用硬件流控后serdev无法发送、CTS/RTS引脚无变化问题求助
排查方案
- 确认pinctrl引脚配置正确性
检查usart3_pins_c对应的pinctrl节点是否正确配置了USART3的RTS、CTS引脚的复用功能。STM32平台UART的RTS/CTS为可选复用引脚,若pinctrl中未将对应引脚绑定为UART流控功能,即使配置了uart-has-rtscts属性也无法生效,可先核对硬件原理图对应的RTS/CTS引脚号,再确认设备树中pinctrl配置的复用功能是否匹配。 - 验证底层驱动流控回调执行逻辑
你当前仅确认了set_flow_control回调存在,未验证回调是否实际完成了硬件配置。可在STM32H7 UART驱动的set_flow_control实现中添加调试打印,确认是否存在条件分支(例如端口未就绪、时钟未使能、参数校验不通过)导致配置流程提前退出,未写入流控相关的控制寄存器。 - 直接校验UART控制寄存器配置
内核启动后可通过devmem工具读取USART3的控制寄存器CR3的值,STM32H7 USART_CR3寄存器的位8为RTSE(RTS使能)、位9为CTSE(CTS使能),若开启流控后这两个比特位未被置1,说明驱动未将流控配置同步到硬件。 - 确认TIOCM操作的驱动支持
serdev_device_set_tiocm接口依赖底层serdev控制器实现tiocm_get/tiocm_set回调,部分旧版本的STM32 UART驱动未实现这两个回调,调用该接口不会产生任何效果。可核对你使用的内核版本中stm32h7-uart驱动的ops结构体是否包含对应的tiocm操作实现。 - 排除对端流控信号影响
硬件流控开启后,UART发送数据的前提是检测到CTS输入引脚为有效电平(默认低电平有效),若你的测试环境中未连接对端设备、或对端未将RTS(对应本端CTS)拉低,UART会一直阻塞不会发送数据。可先将USART3的CTS引脚直接接地,再测试发送功能是否正常,排除对端信号的影响。 - 调整配置调用顺序
部分STM32 UART的控制参数需要在UART外设关闭(UE位为0)的状态下配置,你当前的调用顺序是serdev_device_open→设置波特率→设置流控,serdev_device_open会默认使能UART外设,可能导致流控配置未生效。可尝试在调用serdev_device_set_flow_control前临时关闭UART,配置完成后再重新使能,验证是否能解决问题。
内容的提问来源于stack exchange,提问作者samann
相关产品推荐
相关产品推荐

