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

【实战经验】增加UART接口应用时的异常分析

[复制链接]
zero99 发布时间:2017-5-25 16:56
增加UART接口应用时的异常分析

# S" G$ _) q9 K6 k6 z( e4 m前言
/ ~" B( P$ G8 v- W) ^$ w) jCube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。1 e0 ]$ E- n6 S  G) h' r4 G( k
+ f* a( y" W+ F; ?1 K; v
背景介绍
6 G* h9 M# J1 G5 R1 a( o在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。
, W9 X, \0 l  [' ~& M# l" n8 \. p
21.jpg
: q8 b' I- H+ U2 U. H2 `在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。
* b$ M) q! Q# p; [
22.jpg
0 A0 p( W- j4 U
0 h& K/ J/ B5 x4 \  x问题描述
# Q: R) J, p# m问题复现平台: STM324xG-Eval* A# L8 ~( K5 @/ |( ?& l# A6 m$ X& Z
例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
/ A% p) U+ e$ ^8 r在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。" s- a" I/ D' g7 M0 H
23.png
& y: m9 O2 @0 t
24.png
  F( j5 i; x1 y: u9 r
25.jpg : _8 o5 m, P, @: F( G4 C
在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。
4 E. }. R5 n( f8 t$ r* D
31.png
* N+ p+ z% t0 `" @ / }" S( [7 p$ h$ Q+ ?& _% B2 R
结果如下表。/ j: |$ n& R3 Z8 v: z7 |5 Q* M
32.png 1 i1 b: b# N9 ^% ~/ d  R

) d8 l& {3 L# H- Y$ H* l, T# m问题分析8 m/ U% M3 r* L: |4 ?1 l
不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
3 R% G* k3 Z0 I, R- P. F- t通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。* \2 T" y9 E8 S
在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。
8 y8 E2 q1 b4 Z2 y7 d仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;
& ~- d) t9 e; ~而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。
. V- E) }4 B- v5 `. n- G对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。
' O: q# C; \; z0 i. u/ L& }5 R
33.png
+ Y3 O1 v# F) b
5 D: V( }7 i8 z% d, A) a" v
+ j/ T% a  o0 G' |3 ~总结% y0 c+ G& e9 H( [0 M/ `
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。
+ B! k2 `% P. T4 @1 ]
+ c# M& R( p8 r

& I' O2 h: S0 z$ o" Z
0 E* H4 c2 n8 J3 u; L* q+ v' `
9 h. A; u# i  Z: c+ k
文档下载
9 C$ H$ S2 v/ @

! {* d4 i  L2 e, u$ q* i, N( M更多实战经验* x; T7 t- S1 b! Y$ A0 Y  _
收藏 2 评论2 发布时间:2017-5-25 16:56

举报

2个回答
mark0668 回答时间:2017-5-25 22:36:12
感谢分享,涨知识了
jcx0324 回答时间:2017-5-26 08:35:50
不错                       
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版