你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | STM32G0 单线串口通信帧错误问题解析

[复制链接]
STMCU小助手 发布时间:2025-8-26 17:24
1. 问题描述9 N4 D6 Q+ q0 _5 V+ Z+ j0 d  A
客户反馈产品在使用 STM32G0C1NEY6TR 的 USART6 和另外一颗 STM32L433CCY6TR 进行单线串口半双工通信时发现数据帧错误,而且很容易复现。从逻辑分析仪抓到的数据看是停止位报错。如下图一。
( `& D" z" q& |$ O0 x  E7 y" L* a
8.png
图一
6 r0 W) Q+ R4 v" V  m2 f' f

8 W/ x& R# U+ y3 }7 ]! r2 _8 G2. 问题确认! d" J1 W2 ?9 j0 {9 _5 h
针对客户的反馈,建议客户用示波器抓串口波形看数据帧报错时波形有没异常。后来从抓到的波形看 STM32L433 发送过来的起始位数据电压为 1.51v,明显低于 0.7VDD=2.31v (这里 STM32G0 VDD=3.3v,STM32L433 VDD=2.5v), 如下图二
1 I& ^3 r8 F& L) k1 U& G9 j
9.png
图二

1 Z- F; i5 j+ E8 p3. 问题分析# u: s" ^  a# O; U  b
从示波器的波形看,客户产品两颗 MCU 串口通信的电平并不一致,STM32G0 是 3.3v 供电,而 STM32L433 是 2.5v 供电。但正常 STM32L433 串口发送数据给 STM32G0 高电平为 2.4v 高于 0.7VDD,理论上这也不会影响正常的串口通信。我们怀疑 1.5V 电平是由于 UART 通信线两边状态切换时一边拉高而另一边拉低导致。建议客户提供两边串口 GPIO 的配置,并检查半双工两边收发状态切换时的时序逻辑。
: Z. c. }% l5 t/ m+ R+ N
10.png
图三
2 A" R: q: P2 o  @- Z0 h
* ~- G& \: O- s1 N4 @  l
首先客户提供了上面图三的 STM32G0 的串口 GPIO 配置,发现 GPIO 默认是下拉的。这跟我们正常配置串口 GPIO 为上拉以及参考手册上关于单线串口半双工配置要求不符,如图四,在单线串口模式时,要求 TX 配置为开漏模式而且需要外部上拉。开始以为是这个GPIO 的配置导致的问题。但后面客户反馈他们并没有采用参考手册这种单线串口半双工通信模式。而是客户自己使用 TX/RX SWAP 客制化实现的一种半双工串口通信。如下图五框图,客户单线串口通信也是使用一根线连接,但 TX、RX 功能的切换是通过软件配置USART_CR2 寄存器的 SWAP 位实现的。, n* ]* T2 c, i
11.png
图四
12.png
图五
7 _  L3 v+ U) L& B/ i
6 \" J' O% j8 S
并且这里 GPIO 配置为默认下拉是由于使能了 TX,RX 管脚电**向功能。( l% h& @( D& S; [2 W/ o* h
14.png
图六

+ P% M4 H. Q5 w( }9 a* L. H
! q; r4 x' I' o
对于客户奇怪的单线串口设计,我们首先的疑问是为什么不直接使用参考手册提供的现成的单线串口半双工通信方法,而是要自己去实现一套软件切 TX,RX 的单线半双工通信。客户的答复是这是保留上一代产品的设计,新一代的产品设计只是因为成本,将两颗 MCU中的一颗 MCU 更换为了 STM32G0,而原来 STM32L433 上的软件是不能更改的。而且之前用这种设计的单线串口通信产品已经量产,并且没有这个问题。所以在这个单线串口的设计中,STM32G0 要保持和 STM32L433 的配置一致,也就是上面提到的 GPIO 下拉,TX,RX 通过软件切换并且 TX,RX 电**向。
$ @( [' u: V/ h  `& B$ ~9 a
# z& R5 ^& p* o8 j9 c
. k! J  H+ ?" p' d
既然客户这么说,我们也没有证据直接证明这种方式有问题。只能回到问题本身继续分析,也就是分析究竟是谁把 STM32L433 发送端的起始位的电平拉低到 1.5v。为了进一步分析,建议客户在单线串口中间加一颗 100 欧姆的电阻,分别测量在出现问题时STM32G0 PA4 管脚和 STM32L433 PB10 管脚两端的电压变化。测量示意图如下图七" `% w8 D2 [0 d$ b2 w
15.png
图七
) e3 W3 k3 P3 v$ n
+ T0 x2 S. h! n8 ^$ p; J
经过测量,发现 STM32G0端在 STM32L433端发送数据时,仍然保持低电平状态导致STM32L433 发送端起始位电平被异常拉低。如下图八黄色波形是 STM32G0 端测量的波形,绿色是 STM32L433 发送端测量出的波形。很明显可以观察到在 STM32L433 发送起始位和第一个数据位时,STM32G0 端 PA4 电平仍然为低,导致整根线电平被异常拉低。; D* z' V+ ^) q5 y
16.png
图八
- A/ u! F' h, r
& Z4 b  @% Y) p% C
从上面的现象分析看,显然跟 STM32G0 串口发送接收的时序有很大关系,推断是 STM32G0发送完数据切换为 RX 接收 STM32L433 数据时出现了问题。为了进一步验证,我们配置一个 GPIO 来指示 STM32G0 在发生数据帧错误时,TX 和 RX 切换的状态。如下图九,蓝色是 STM32L433 端测量的波形,绿色是 STM32G0 发送端测量出的波形。而中间的黄色则是 STM32G0 软件切换 TX,RX状态的波形。 从图九中可以很明显观察到 STM32L433 开始发送数据时,也就是 STM32G0 本应该要开始切换回接收状态的时候,STM32G0 软件还没来得及把 TX 切换到 RX 状态接收数据。到这里,我们可以分析出是 STM32G0 端在发送完数据切换为接收数据状态的动作太慢导致发送端起始位电压被拉低到 1.5v,从而导致数据帧错误。: j1 c" ?1 g  o3 K( K% n: g8 x
17.png
图九

' B' g. D# a6 s) n8 H4. 问题解决* d5 ?2 }/ g$ d0 R: v( X/ E4 M$ b, ~
既然找到了产生问题的原因,也就为我们解决问题提供了思路。问题的解决方法比较简单,我们查看客户 STM32G0 切换 TX,RX 部分代码,如下图十,发现在 TX 发送完中断处理函数中,要切换到 RX 接收状态还需要经过复杂的函数调用。后面建议客户在 TX 发送完成中断函数中直接修改 USART_CR2 寄存器的 SWAP 位完成切换到 RX。并且改用 DMA 收发数据。修改代码后,客户反馈波形得到改善,问题被解决。
, }& a& c7 \9 p& u4 V- q8 t/ N' m
18.png
图十一

/ y2 U4 g' E' i, z  {7 Y

# h  T/ P2 n/ f+ |( E$ M& J1 n5. 小结+ o, t! |- K5 e3 n- b1 }2 u
本篇笔记分享了怎么帮客户一步步分析解决一个客制化单线串口半双工通信帧错误问题的过程。后面也建议客户在后续的开发中如果使用到单线串口,建议参考 ST 官方 RM0444提供的方式。毕竟这种客制化使用单线串口的方式,并不是 ST 推荐的方式,需要客户自己验证其可靠性。
' ~# n& c  R) B9 ]& E: H————————————————: K0 @5 ?' A3 w7 X% j3 Y% G4 u

: g5 _" \9 {. C& `6 {0 s- q3 _! @( N+ T
赞 收藏 评论0 发布时间:2025-8-26 17:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版