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

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

[复制链接]
zero99 发布时间:2017-5-25 16:56
增加UART接口应用时的异常分析
. U! m: A: S7 \0 k" h. I. u
前言
6 K( o: H; F. S5 sCube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。2 ~5 r5 u( {. A
; q; {0 Z- [' d4 o* q
背景介绍
0 }. K' z$ C6 ]2 T在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。
; h* y: f, s  Q, @. `* c
21.jpg
, v. f6 m7 D" A% X2 N" \在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。! S( R3 B# W8 z% w: S% O2 z/ w
22.jpg
% H+ o5 M4 M4 R3 }5 H; a3 U" e. C! x- B) A, Q( y  Q3 V
问题描述
- c4 l2 b$ H5 }: K问题复现平台: STM324xG-Eval/ P7 D2 v3 s7 _3 f' g8 t( q
例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
( Y7 P  j6 [9 l. d; b2 M* K在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。, H2 k# m2 ~  a" y9 b) j
23.png ( n- G8 _2 A: }" p7 K! x
24.png - I7 e& V6 b+ |* C) j5 {+ Y
25.jpg " c' B; I+ ^! R* B" b
在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。 # b& d1 N) l3 Y; o
31.png
9 U) ~. T; s; j* C6 U : i7 m! K! G; f- _! X% ]9 i( ^- e
结果如下表。$ t1 x- t' L; r: `- d
32.png ( _4 W$ _* y3 M# e2 j4 G
) w+ t: s. x2 @  p5 z0 k
问题分析
  g! I, i+ P  c+ P1 r不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
1 q- J8 a  U3 m% F  ^3 d, `) p. m$ z通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。: d- s* c5 F6 l% G$ \
在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。* D* e6 ]' {' j; p& @3 \+ m
仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;
/ `; [9 c. A! ~6 ]( ]# E0 `* Y而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。
' a- h# W: x8 p" p( [- I9 F/ O对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。
+ i* ^. y; x1 E7 O6 z7 v
33.png 9 u  e: |# F' ~
8 Y/ |% y2 m2 ]$ f! P' t
0 u3 E/ a/ {! a' \0 X+ f
总结% j  y. o2 b1 V. n$ T. V
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。

, F- y0 ]0 g- U+ ]/ T9 h: S+ q) o
: m7 A2 ^8 M+ ~7 P" _6 U

( A7 P+ b9 K3 i7 K3 a- m' B( o4 B0 ?
0 j4 `4 a! s( f7 q4 r* A3 U
文档下载( Z! m8 c  R( t5 M1 j: x  y

+ u9 G- X6 j( W更多实战经验
. m6 P: Z9 Z: t% j, E$ F2 s3 i$ l
收藏 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 手机版