前言
- 最近在配置
GD32F150G8U6和GD32F103C8T6这两款芯片的半双工串口的时候遇到问题。在同一个对接芯片上,F150可以使用,而F103无法使用。
问题排查
简单排查
- 一开始本来以为是软件配置的问题,但是在编写调试的时候是可以使用的。
经典为什么能跑,为什么不能跑 - 比对环境后,只有对接芯片这一段是不一样的。于是果断换成我调试时使用的型号。可以使用。
- 于是问题变成了无法解释的悖论环节/bushi。
使用仪器排查
- 简单排查无法发现问题,而且也基本排除了软件配置方面的问题。接下来就是锁定具体问题。
然后甩锅给硬件 - 接上串口工具后很意外的可以使用。
- 使用示波器查看后发现,
F103连接后串口电平一直是低,这明显不合逻辑。因为半双工串口一般是外接上拉电阻,空闲应该是高而非低。于是我切到F150,常高。 - 然后我突然意识到好像是软件层面的问题。因为查看芯片手册或者例程可以轻松发现,
F150可以在开漏的同时内部拉高,F103不行。只能说我的经验还是欠缺
问题解决
推挽 + 降低速率
如果将开漏改为了推挽上拉,会在示波器中发现有通信的波形,只是低电平只有 2.7V,无法正常通信。于是我将串口速率拉低到 2MHz,使得内阻增大,推挽能力减弱,通信中可以被拉低到 1V 左右。从而可以勉强正常通信。

只是这样可能有通信稳定性的问题,也有可能会因为增大内阻,产生不必要的电流消耗,发热烧毁(虽然我觉得问题应该不大)。
软件模拟(暂未测试)
- 软件模拟应该可以实现。只是会长时间占用CPU,而且也会因为高优先级的中断导致的电平时间拉长,可能影响通信稳定性。也可能会因为长时间的CPU占用影响其他功能。但值得一试。
手动切换(暂未测试)
- (切换复用推挽用于输出,上拉输入用于输入)理论上如果收发不冲突,可以说是比较好的方案,值得一试。