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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-1-4 21:49
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
3 W; }1 e: O9 Z# f1 y6 @# U使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。1 L  f' E5 e( q+ S$ x3 `: T* Z
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.
# x9 Y2 x+ p/ c% ?& a: S首先看STM32F103传通驱动的代码:& h2 {4 l4 W5 @7 a! `1 P0 U- q
/** USART1 GPIO Configuration  : Y; ?  b8 o9 X3 n; _/ T
  PA9   ------> USART1_TX
# c( A# \/ Y2 q! q8 f# h  PA10   ------> USART1_RX
  Y, y. G% l6 Q  B% N  */

# t/ c3 r2 O! F  V! c- b9 N  K! t0 N/ b
  /*Configure GPIO pin : PA *// D3 L* X* ?0 X
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;. r% X0 d6 X# X
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
& T! R2 i; p- r4 T" t6 ~, k$ _  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
% t. h9 S: S1 Y- t: t  GPIO_Init(GPIOA, &GPIO_InitStruct);
* }2 R; o" `# A( U8 J. m
( f2 w/ t' K- z( w+ h& w  /*Configure GPIO pin : PA */
3 p( I. U, F/ _- D. o6 e" s! X$ f  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;: |+ O( H1 L0 K5 L# H/ N, k
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;; n& p" [0 T. V1 ^
  GPIO_Init(GPIOA, &GPIO_InitStruct);
+ @" z8 Y) s& A8 S  O# |在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。
+ T; n* Z8 \6 @) ?$ q2 N5 |: o6 ]3 J代码如下:用HAL驱动时8 c* ?* J/ a* S
    /**USART2 GPIO Configuration   
. H, y9 ^; H# `5 b! u" c    PA2     ------> USART2_TX
) K( m. h7 S, ^+ y    PA3     ------> USART2_RX , a, j* S5 a. }0 ?& }
    */

, z  D( t% M+ e    GPIO_InitStruct.Pin = GPIO_PIN_2;
# @( V* Q8 s4 \" \    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;( C  w/ `. W3 m& y/ u- d5 q+ W2 z
    GPIO_InitStruct.Pull = GPIO_NOPULL;
4 J6 O, n4 ~7 `3 e  w: R, H    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  _+ [( ]8 y5 u$ c; s    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;% \3 ]+ R& r. F% f: u
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
8 S5 o" Y9 T5 Q1 p8 D3 u% ?8 c9 G. I/ ]+ N! D! V
    GPIO_InitStruct.Pin = GPIO_PIN_3;
9 P  w  Q4 C+ o1 X    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要), c! u0 d' P& |3 w$ H5 u; ?8 G
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
. N% F# C; D/ j" ]* u4 P) o8 v    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);- P6 C: e8 K! N
7 N7 G* I* g# I. K' K
希望能给后面使用HAL驱动的人提供点经验,少走弯路。: t, q. X, A& B" r5 E+ U' }% v4 L
赞 收藏 评论4 发布时间:2015-1-4 21:49

举报

4个回答
大器所成 回答时间:2015-1-4 22:13:29
在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。----我也试试!!!感谢楼主
qzwx741 回答时间:2015-1-4 22:20:26
标记下,正在尝试用hal库
晓枫VS枯叶 回答时间:2015-1-5 08:37:59
  1. GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    * c3 I/ L7 o& q4 G) m! i  h: x
  2.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;, ~/ N9 F# K; ?
  3.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    " Q+ h! ?8 X% @1 a% x: C$ i+ C
  4.     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    8 Y$ ?, ?8 ~7 i
  5.     GPIO_InitStruct.Alternate = GPIO_AF4_USART2;$ F3 D' y- w# J3 v; T
  6.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    , s6 ]8 |2 l. e8 i: Y2 G; ?' V
  7.                
      H7 Q+ y& Q  J, x  e7 ]
  8.                 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
复制代码

/ {2 Q% f" b9 L% f1 f# _! G楼主我这样配置也能接收哦!
党国特派员 回答时间:2015-1-5 09:32:24
晓枫VS枯叶 发表于 2015-1-5 08:37
7 K1 c( @' G) e$ r3 E楼主我这样配置也能接收哦!
. r6 \& q9 f% Q9 h
合在一起写也是可以的。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版