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

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

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

' h! i& K' n1 P8 ?6 h' j前言
0 R! o& H  G( D. FCube软件包的提供,极大的降低了开发难度。使用者在开发的过程中,只需参考Cube包中提供的例程就能快速的实现对应功能开发。开发者为了快速开发UART功能,参考Cube包中的UART例程,并根据应用情况,扩展了另一组UART接口。但是在应用过程中,发现两路UART不能共存。本文分析了这种情况出现的原因。
0 o, ^0 o% `3 l& k  \
5 e8 J6 f$ h6 J, {# P背景介绍7 d0 ]  [" }7 @  v% t
在Cube软件包中CDC例程实现了虚拟串口通信功能,数据传输链路如下图所示。
+ q" N  D* m* z' t* v) X/ v( s
21.jpg
1 B2 M1 x8 ?/ t; g在开发者的应用中,需要实现下图数据传输链路。根据应用需求,推荐参考Cube软件包中的USB CDC例程。
6 D% r( F5 Z3 p' u- }' i% n. j
22.jpg + T2 w' P/ t. Z; u

0 _/ E( {( p% l0 T" ^问题描述5 b2 y, w2 n8 d- \
问题复现平台: STM324xG-Eval  M- H. _+ H2 z4 H
例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Applications\USB_Device\CDC_Standalone
2 K4 B2 |9 }& H" i9 O! m0 J在对CDC例程了解后,参考已有的UART应用,新增了一路UART。对应初始化程序如下所示。其中USARTx为例程原有部分,而USARTy为新增的一路UART初始化部分。
6 s) Z4 `) ]7 Q! _. Z+ h! K/ e
23.png
9 l% @( ~! k  _8 P
24.png
# u* J6 C* j1 t% E
25.jpg
9 F- P# ^6 `# {7 A: b在之前的UART发送和接收处,同样新增了一路UART的发送和接收。为了方便描述,这里不对应用层面进行描述。而是直接在例程中,时钟配置后执行下述语句,复现问题。
- r3 P$ g0 `) Z; k
31.png
7 |' E( \  v! f) E, H& { ) Y$ B9 A8 _! m
结果如下表。' q. i: j0 [6 {1 w9 D7 }
32.png + n0 V. l+ K. `5 [, h" H

  o: `, a1 {1 |- `$ e问题分析# T5 k" O7 v( q! m$ I% k
不同UART接口相互独立。UART IP设计上,不同UART同时发送不会相互影响。初步判断应该是UART初始化过程中,存在冲突。
- c7 }1 k9 F* r3 t通过对结果分析,在UARTx和UARTy都进行初始化后,只执行UARTx DMA 发送时,执行异常;只执行UARTy DMA发送时,执行正常。而在初始化中,UARTx先于UARTy初始化,进一步确认是初始化时,存在冲突。并且将问题范围缩小到HAL_UART_MspInit()函数中。
$ u# M" J; A( m* ]: f  Z2 Q9 c8 d1 R在线调试,发现在执行UARTy初始化时(UARTx已经在之前初始化结束),UARTx 发送DMA对应的Instant和Channel值都被改变。其中Instant中保存着对应DMA的寄存器基地址。
% `+ s$ f( X" t. L仔细检查HAL_UART_MspInit()函数,发现对于DMA的初试化,两个UART共用了例程中原有的DMA句柄变量,为上述程序中的static DMA_HandleTypeDef hdma_tx;& X$ Y' q$ X/ v& r- e2 c$ `* f
而在HAL_UART_Transmit_DMA函数中,会对对应的DMA进行配置并使能,而配置过程会依据DMA句柄中的参数。从而导致发送异常。
. D/ I. t6 a& w5 p, f对问题的产生原因清楚后,在新增UART接口的时候,初始化函数HAL_UART_MspInit()中同样需要新增DMA句柄变量,并利用在新增UART的DMA初始化中。如下所示。
: e/ L" M/ @" m$ C
33.png   N7 o! A: ~: z" o# A8 S

; d; }( s& M# x2 ?$ Q9 Y) v% L( Q( \+ M3 G
总结# S4 R7 T  Q& ^6 W
所描述的问题,可以归结为一个开发漏洞。而导致这个开发漏洞的原因,更多的可能是在参考Cube例程时,对于各函数的了解以及变量的使用情况,没有逐个了解。建议在基于Cube例程进行开发时,能够对各函数及变量等加以了解,在针对应用进行修改过程中,能够减小错误率,从而减少排错时间。
9 a) Z- s- p2 Q" a
; R6 b2 w: e; d$ _; Z' d
- y  E- U+ ^7 E. L8 T

4 f, x9 z! D. ?4 o4 x

" S( f% P+ b0 _: c! Y, \' F文档下载
3 a# P# N$ Y9 G- R2 |

& Y. z! w9 w# M- \1 X更多实战经验( F. S  x6 ~! M  Z0 @( {8 A
赞 收藏 2 评论2 发布时间:2017-5-25 16:56

举报

2个回答
mark0668 回答时间:2017-5-25 22:36:12
感谢分享,涨知识了
jcx0324 回答时间:2017-5-26 08:35:50
不错                       

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版