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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-7-28 15:26
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
, t# u2 \& J# V- g使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。( y' W# R! W4 I" b% p6 @$ s. A
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.
3 j) B; s! O. U0 L首先看STM32F103传通驱动的代码:7 ]7 u, h; Z# X
/** USART1 GPIO Configuration  
# T8 G0 d6 V* p  PA9   ------> USART1_TX
) k% r* G/ e9 w( |  PA10   ------> USART1_RX
$ \0 t( `( H- }/ z( u# b' v0 M$ F; |  */
$ p. J' w& R- f; Z9 m% _

8 ^# ^! i4 C& c5 T/ _& Z$ b, m  /*Configure GPIO pin : PA */
) y1 o+ [% q; d" z3 }  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;1 y- l0 T* u. ~! I! n
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
% r& x$ N% |/ C4 ^! W& P9 D  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
2 y) H3 P% _* _  u2 c  GPIO_Init(GPIOA, &GPIO_InitStruct);5 N) `& s0 Z1 ?9 ?6 |7 m" E- L

# x5 U' S9 x& g6 W6 w2 ^  /*Configure GPIO pin : PA */* e, u( Y  O# S) H7 k! C5 E  i
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;# g* M7 h- J$ d- |
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
% q. j/ Y+ h& @/ f6 ?  _4 v! G  GPIO_Init(GPIOA, &GPIO_InitStruct);8 [7 P, N2 v* a# z. j- M8 }
在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。
7 m' R! W+ ^! [# o% e: }代码如下:用HAL驱动时
( X# O7 W0 _( M. V7 v    /**USART2 GPIO Configuration   
$ }0 D# E) A3 ~: q  Z; v6 F    PA2     ------> USART2_TX. v% i% y# o1 R: [4 @) w. e$ ^
    PA3     ------> USART2_RX , L- y) q; @6 q- y% F, g
    */

# R; R9 V5 t. z6 h* Y    GPIO_InitStruct.Pin = GPIO_PIN_2;
+ p$ y2 Z/ w8 A) c$ t+ h    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;4 l- G# Y) G6 M' Q( A( [. `
    GPIO_InitStruct.Pull = GPIO_NOPULL;) p3 [  ?# h' i8 Z% |9 F
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;$ \; Q! J9 O9 }( i) O
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
  T- z/ ?0 ]& Y$ M. q8 M4 E    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 c  ^+ }7 w0 Q; ~5 }. N
2 q, ~. @4 b7 \0 E4 c
    GPIO_InitStruct.Pin = GPIO_PIN_3;0 I& b4 z* J* D
    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)8 R# Z% r7 [! w: s/ H
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;, k1 H/ [- M% D
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
; Z! k& o) v3 @4 O8 A% A8 z: }, M/ F
希望能给后面的人提供点经验,少走弯路。
/ [5 a  l* k1 N1 K2 F8 G

评分

参与人数 1 ST金币 +10 收起 理由
沐紫 + 10 赞一个!

查看全部评分

收藏 评论9 发布时间:2015-7-28 15:26

举报

9个回答
creep 回答时间:2015-7-28 15:58:31
当你不熟悉HAL的配置时还是要尽量参考官方的程序,ST的串口例程中RX/TX都是配置为GPIO_MODE_AF_PP.6 k7 @0 V6 v4 R
还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置
) r; C: }4 v" M& l* ]# X //GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!
% U, H* W9 Q5 G8 v
Paderboy 回答时间:2015-7-28 19:48:51
多谢分享。。。。
yanhaijian 回答时间:2015-7-28 19:53:45
还是用标准库比较好。
at89 回答时间:2015-7-28 20:42:56
恩,好帖子,正在为411的串口烦恼呢
qianfan 回答时间:2015-7-28 21:26:22
creep 发表于 2015-7-28 15:58
  h! f) I( Z' [, F% h& G当你不熟悉HAL的配置时还是要尽量参考官方的程序,ST的串口例程中RX/TX都是配置为GPIO_MODE_AF_PP.0 k+ \$ [: [' h2 i1 M4 q
还有就 ...
$ E: S* I  Y- m6 ]6 @; O
这个应该是F1和其他系列的问题吧。玩惯了F1的人很多都配置成浮空输入。
安臣 回答时间:2015-7-29 09:38:14
谢谢  我也被这个问题所困扰
deanquan 回答时间:2015-7-29 11:29:35
楼主应该用STM32CubeMX来配置,就不会出现这样的问题
SZHYK 回答时间:2019-7-27 16:10:46
感谢分享。
rgbgirl 回答时间:2019-11-19 10:13:28
多谢分享,这两天正为串口接收头疼呢~% v" V& Y; t! z1 M" @7 O7 b: @

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版