请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
zero99 发布时间:2017-5-25 16:56
增加UART接口应用时的异常分析
; G+ E0 J6 R0 m; w# }
前言" ~9 c. y+ T% G( h0 q$ n1 G* ]
Cube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。' G4 k1 z1 @2 y) v! m2 l3 t* ^

4 }$ b$ u6 o6 ^3 p7 z9 A  `+ y4 A. E背景介绍9 D) W" h- s8 h0 V
在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。
2 F; [4 }# B, B  i" q  O% O8 A
21.jpg
* N% _* X: I+ E0 m0 g7 o( @/ v在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。4 [% G* ^) T! s' U; J
22.jpg
& t) |$ g/ e& z. a1 [5 x
& o/ }8 B# v& i+ M问题描述# h# q0 c( B. d. A( S
问题复现平台: STM324xG-Eval# S5 J. H; S6 |* ^6 U1 Q; V9 i
例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
# w* T7 r  @$ d+ g7 E- |在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。
# r7 k: f  b# W& \* p# R% u
23.png % K4 A7 v8 ~2 [- }2 _
24.png
5 V- x' r4 y' u$ T% V2 f2 N
25.jpg
3 A9 u* j. w0 a  d) G4 [, ~在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。
  D1 J! b) W  s& ^, K+ m- s
31.png
5 ?) R- Q" r4 C  @ / o. }7 z. M, f3 Z
结果如下表。
( l) Z/ L  O1 g+ L3 x1 e0 ?
32.png & f5 |$ S( m. y0 o( D
* l; U+ C* R3 n5 j; M4 g. ~
问题分析1 p: L% f. S" I  R
不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
5 X, _; I* T3 _7 N! T% g) X通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。8 x) o3 o1 C, Q# U% ?, I
在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。
  z( [) @* A* Y) N" W& p  e仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;
2 E2 s* o5 Y- R而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。
; B- X: @2 g( z' S6 i! y对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。
; }, f) L( g6 [# C3 ?8 K3 M
33.png 3 \0 F% h. L5 R- ?
8 d/ w5 Y3 K" i9 n; N! Y5 H- J; G
  z" W; C! R) k, w- @
总结4 g; S. _" k! x+ Z
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。

5 a) R& v: p5 j3 h/ J) p. Y+ `; p1 b* s9 O- S

, Q5 C2 v2 a4 C: z) ?6 n
3 L& S# i6 \  `  P  R7 s6 ?! Y/ a
; T1 O0 A# |! B1 b  H3 v
文档下载8 G+ q  P( ~5 M: {
( t0 u: P) [5 V; V) {6 e
更多实战经验
* z, ~* ^$ A( T; O
收藏 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 手机版