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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-7-28 15:26
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
" N: X* X3 m  J5 V+ B! K使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。3 }9 s. c, s( O
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.2 W  b8 L2 p: @
首先看STM32F103传通驱动的代码:7 P: W7 z5 z9 z+ w0 T& u' ^" o
/** USART1 GPIO Configuration  
: r9 G+ z- C  e' I2 X' t( s  PA9   ------> USART1_TX
2 `/ ~- u) t5 A7 ?  PA10   ------> USART1_RX2 e3 @6 A/ s) r& |( Z, N7 b
  */

1 D8 ?9 R& y5 l( t- r0 c* c5 }, S0 k* R9 q$ B* G
  /*Configure GPIO pin : PA */
* s8 ^; H( m! [) L, t( N) l  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;4 C: o$ j" m3 Y+ B
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
8 i7 z( ~1 h& s* u' U  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
( C8 p$ M" S7 n$ X1 n  GPIO_Init(GPIOA, &GPIO_InitStruct);2 Z4 N. {9 \. s" j/ i; _

4 V# }$ W4 F* _+ o# G' S1 C  /*Configure GPIO pin : PA */3 s) f. Y) p9 D" F0 d0 E  L
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
9 i$ {) k/ h$ ^4 S0 U5 o' v0 u  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;; w1 y) @" `& S
  GPIO_Init(GPIOA, &GPIO_InitStruct);7 t$ n2 \1 o; l/ I
在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。/ l4 M  D! V2 p5 T3 y5 j0 ~1 L
代码如下:用HAL驱动时
$ F- r2 ~2 B; Z/ j    /**USART2 GPIO Configuration    * n8 P+ b3 g! t
    PA2     ------> USART2_TX. c9 C/ Z5 G2 C/ O
    PA3     ------> USART2_RX : H3 @7 \$ v% L6 W( `8 z/ S
    */
8 G  u5 _- z& ?
    GPIO_InitStruct.Pin = GPIO_PIN_2;
1 ]& c$ A' X8 A* K6 R3 P    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
6 {3 I( N7 y: M    GPIO_InitStruct.Pull = GPIO_NOPULL;
. `8 [0 f3 @5 [4 F7 w, @    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
0 A$ l3 K# m, C& q0 [* n5 |    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
3 k% f& D9 l* J2 C5 J% Z, J    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
# G- X1 M. v. z8 I4 ~7 P% }
. \1 T5 y; E4 F8 H    GPIO_InitStruct.Pin = GPIO_PIN_3;# f/ T" {/ d- o# t8 `& p" E
    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要): ?. a/ L4 J" c
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
, w) B" t: \% N) F8 B& {- w    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);; f' p5 K' W% ^) U6 w7 C  ^

, ]0 r4 m6 f9 Q+ s4 k1 E% r希望能给后面的人提供点经验,少走弯路。
/ `" I# k, v; H0 ]! W

评分

参与人数 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.
, F$ j; V3 J2 p! _7 x3 X还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置
: c2 @0 }, Z/ e8 T/ ^- | //GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!" e9 v" f9 i+ X3 j& v* H  y, n. @# b% [
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  p) q  v8 J+ Z" d
当你不熟悉HAL的配置时还是要尽量参考官方的程序,ST的串口例程中RX/TX都是配置为GPIO_MODE_AF_PP.
5 V. b5 ^" w) {* R1 G! I) I6 P' T! L9 b还有就 ...

' t6 Y) D2 z% B( U/ l这个应该是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
多谢分享,这两天正为串口接收头疼呢~2 B# ?, b( v$ t4 v6 i7 w6 f

所属标签

相似分享

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