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

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

[复制链接]
zero99 发布时间:2017-5-25 16:56
增加UART接口应用时的异常分析
" g; R) _  }7 r7 i8 {! I
前言: d+ _; Y/ B( \3 N
Cube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。
. F* z* P1 c4 d$ c
1 i% t0 x% o1 n  |4 \3 w* {4 O背景介绍
1 E( G7 G9 ^; C. k7 d, W在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。) b, Y3 c# }0 |9 c5 B' Y
21.jpg , n  e  v9 t" V: y1 A
在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。
3 k" d) T$ k" {. @" N
22.jpg
+ ?' i: p; b% i' y8 G, B) f4 a- L5 r4 @' x# H& ~' W
问题描述
6 o/ P( r2 q0 U问题复现平台: STM324xG-Eval
7 C6 K4 N. Z) O1 j( s3 W/ m" k( H. \例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
7 _6 n) |. S& V, b4 s在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。
- T/ j3 ~1 J' @
23.png + r; Q1 n0 f; |1 K/ W9 o
24.png + n7 p8 N; p4 }5 z2 N1 Q* s
25.jpg
6 t% K( c& Q' }$ R$ `" B$ l$ F在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。 ( B& P2 G1 [4 j* }9 v& r+ m- b
31.png
) c! M9 M  V, Y9 x7 i   D" e! j9 P! @8 k9 S
结果如下表。5 ]5 }. q% p0 g* W
32.png
6 b2 h: [* w( j& N. t$ i) _9 }4 B9 f, G1 r
问题分析$ A/ x  r3 A* y5 b( j# D! d
不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
1 Z9 y9 s) Y( i9 u通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。5 j  |$ F% P0 K
在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。2 s7 a/ {  H4 q; _, H5 i$ `  u; R# _9 n
仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;
' c# f2 @! s. o$ h而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。- R' ^# W$ \0 M3 j
对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。0 M7 Q" T0 n* u1 y8 i' G
33.png
  b* Y; r6 P; L4 U( _/ w- B
, r6 Y4 S* Z( K# N: ?
" h" w0 a3 W+ t  i总结" S5 A. l0 h9 C
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。

6 ^; q( [6 Q! \. o7 F' Y( J  h+ b# U  Z& ^) }: \- j# Z6 n
$ @3 E' b- M4 G$ ~% C  g; c5 O9 ^

3 Y( e& V8 m. c. _4 P

! E) w1 }5 ]# [/ s# m0 ?& D5 A; R文档下载0 y4 `) K4 d* N3 X+ V; w

. T" B' C8 b0 H& a3 P7 W更多实战经验
1 q# f* t" Y5 R
收藏 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 手机版