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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-7-28 15:26
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
8 }0 A( Y5 b! c. ]5 q1 F3 E使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。$ ^2 l% h- w) L$ ~+ l
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.% i* E9 A5 G+ S; i1 w6 B$ q
首先看STM32F103传通驱动的代码:& D! k6 Q2 i5 a8 C2 O  z2 t
/** USART1 GPIO Configuration  2 ^$ i9 z1 A' ?% {; ^5 ]; k  p
  PA9   ------> USART1_TX+ ?. ?! l6 z. {/ j9 k0 B1 h# M6 Q# ?
  PA10   ------> USART1_RX& l5 @6 Y' k! f! X4 _
  */

" Q  @8 X+ w- G9 y3 n0 T7 Q1 A2 h( r8 J5 ~' Q% y8 Y: {
  /*Configure GPIO pin : PA */! Y. u% _8 E9 @9 c% |0 m: f
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;! [+ j' l) [, u7 C+ O2 U4 p
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
& U- J1 a4 O. k4 w/ n- F9 U  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
2 k6 A! |5 P" c7 k- f. t  GPIO_Init(GPIOA, &GPIO_InitStruct);
5 c3 G5 s8 }9 B3 B6 P! d$ Y- s
& V  \$ h* {$ D2 X- V  /*Configure GPIO pin : PA */
" e6 g  K0 M* T7 y  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;/ f6 R. k* x4 l( @
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;' s  M6 J5 H& c
  GPIO_Init(GPIOA, &GPIO_InitStruct);5 l, P5 ?. h% N5 ~
在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。
4 \; z$ g) B) b  s9 `3 t代码如下:用HAL驱动时) j, \7 d( {/ \- U' @- O3 B
    /**USART2 GPIO Configuration    4 }( y! w# ~: K
    PA2     ------> USART2_TX
% G  S6 |1 R) y9 [    PA3     ------> USART2_RX
4 ~: n7 K" u& M    */

  E7 Q$ s. N8 r0 t+ f% y$ h* q    GPIO_InitStruct.Pin = GPIO_PIN_2;  H! b+ F" t9 O8 P! h: n# q
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;1 R" g- g! S. X& C; T
    GPIO_InitStruct.Pull = GPIO_NOPULL;
, i, Z, k- V( j$ M5 l, p  O    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
, k& I: P0 ~. h, X% P8 z- b2 c2 r    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
: k3 ?# g2 I6 R" x+ U* @- l! |$ C    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 r7 T; a0 i) h: P9 [' x0 Y4 D
0 y- L. S% A9 i
    GPIO_InitStruct.Pin = GPIO_PIN_3;
. A! q' G% O9 _    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)
- X' o& w# q$ n- P- d$ G    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;, r1 F3 q! o  M
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);3 D* w9 @! y4 s% }/ E/ \1 U$ W

. D) @* W7 y8 u) x* s希望能给后面的人提供点经验,少走弯路。$ n& `$ G+ }. B* Z; {( 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.; i3 h; _6 Y9 Z$ R9 i: k
还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置. b( ~# q& [3 \5 V0 q* X; t! `
//GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!# o5 v7 [) x5 ?, m' S  u
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  b/ B) X8 j  f2 W% L; ]  }4 [# w# N
当你不熟悉HAL的配置时还是要尽量参考官方的程序,ST的串口例程中RX/TX都是配置为GPIO_MODE_AF_PP.
9 l  I1 w8 X$ f" u/ @1 b6 w还有就 ...

" X9 ^- N  \) ~9 R, r$ 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
多谢分享,这两天正为串口接收头疼呢~& o, K! V& O9 X' @8 {" U4 }

所属标签

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