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

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

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

( t1 U. f' E* X5 i前言1 p8 _6 D' K/ C9 U" {1 [
Cube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。
& w* i7 O5 w; @, k7 k
8 O2 \% x: Y5 p+ T/ {背景介绍
* G7 H1 H. J/ }0 [- G7 O+ U在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。
' F* S" F- s0 F& J" C
21.jpg $ r/ b( d5 Q( K& Z  J- ?( x
在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。
: O5 [, O1 n0 P; L2 O
22.jpg 2 s. X+ `0 d2 b; p+ C( y) r

( _) ?/ Y% j& F1 E问题描述7 F5 l! y7 ?! ]6 j
问题复现平台: STM324xG-Eval4 i8 A; x+ I. L
例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
) l$ a" x+ J+ i: i# }' ~在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。& g" M; p( b' T* y! X1 w. g
23.png * V( s5 _1 ~4 h% y% Y
24.png 2 p* P! u8 R* E. c
25.jpg 8 U& n/ V" t9 R7 `
在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。
8 a9 c% ~1 G8 ^6 E/ p& K
31.png
5 @. G9 Q; a. K& A 4 `2 p' R5 q0 H8 u! _
结果如下表。
' G# P1 ]: G! S. Y6 {
32.png
4 c+ Z% \/ g, _  z3 I6 _/ V  P" {0 l  L! d/ u3 s
问题分析) s8 t( i# O7 ?( l6 j+ T; p' s
不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
$ }) p% A! q9 m) [通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。% B; \7 R  {" r& x# X; x9 `2 P" u6 F
在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。
# X$ a$ K3 b) u/ n. Z仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;! {3 m- e( L6 Z
而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。
; G* U: ?) B* ?$ c3 W对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。0 ~. d: t0 A& C1 y1 \  s, C( z
33.png * s$ M& O- R) l: o8 R# M1 m5 V1 Y- c
" L1 J  g4 w- j3 i  }& _
" o" @" P* `8 A2 O0 C* _' `& I( |
总结! q% s/ v' K, K6 q( i
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。
& m8 h" K) H7 ~7 R: _
! W7 z' I) |! z' R( P
' M6 X2 }- x. u5 T

9 F( D1 }- E1 H6 B, O, I1 {" l0 K

4 G) o9 C# W5 r5 ^) k文档下载
1 b1 `4 J5 d5 f0 A
9 l3 T6 _* ]0 t* n1 h
更多实战经验
& X* N! @% y; D
收藏 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 手机版