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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-1-4 21:49
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
; v6 P' z- b% T* X使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。
1 P3 D: |$ T# e  J2 m8 x使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.
  [' H, {' Z! P首先看STM32F103传通驱动的代码:
6 u& R( L) S# Z. Y' U* T) E2 U/** USART1 GPIO Configuration  
1 w. Y* i4 H% n- P+ G1 N  PA9   ------> USART1_TX# h" T3 q' b4 X% O/ M! D& ~$ w  [* R+ n
  PA10   ------> USART1_RX% O- `5 \* Z' a' k" t
  */
2 _, @  [5 Q' H8 C
. l9 Y7 w! c0 t" \, e- O
  /*Configure GPIO pin : PA */
$ N1 ^2 p9 ]( ~  d- q  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;! x+ C5 P) `$ o; a: r7 X' s
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
4 H% [3 D& ~8 ]4 W6 S! A5 D  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;8 Q* c7 L% y  [9 X
  GPIO_Init(GPIOA, &GPIO_InitStruct);
7 s' L4 L# d# X8 p) K3 g  M8 b( V/ q7 P, r3 @
  /*Configure GPIO pin : PA */
8 ~# @$ d% [# V( K, d+ C, t  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
* I, w) v( W  ?4 Q3 ~8 ~  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;$ v  g9 C: E6 f1 f* F: x
  GPIO_Init(GPIOA, &GPIO_InitStruct);9 j+ S3 ~6 q* y9 m5 V3 X
在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。
& a: M& n8 o( r代码如下:用HAL驱动时
! P  Y# @( A$ B$ l    /**USART2 GPIO Configuration   
+ l& G8 C3 N5 b) \: e$ L8 \    PA2     ------> USART2_TX
5 d( q7 V. I6 ~+ r% L    PA3     ------> USART2_RX % k5 `7 ?( B$ o
    */

+ M) c5 x$ o4 U0 U) w/ m7 W6 d' V    GPIO_InitStruct.Pin = GPIO_PIN_2;" `$ p' }5 B# f3 _; W/ C% d. p
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;8 j1 a$ E- w3 O% b. b- z
    GPIO_InitStruct.Pull = GPIO_NOPULL;
- K4 o' g8 Q7 l7 ]    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
' o4 `* X' N& {" u$ M    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
+ t% }* _+ W9 a" Z- k+ L    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
" J+ a  _7 H1 p: b( D" O
. E7 i# a6 @1 W7 N& U) e    GPIO_InitStruct.Pin = GPIO_PIN_3;
2 D4 J) ]" a9 i  }; O    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)& L( C. G( t4 _6 S5 z
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
6 s9 W3 \8 g) D% _, f    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);. M" n( ^2 |" |* J$ n

7 I; T% k. n6 T5 v7 b  r8 q" w希望能给后面使用HAL驱动的人提供点经验,少走弯路。
4 j. {$ `- J) w0 c0 R/ @  b
收藏 评论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;) C1 _6 \4 P+ Q) I# G3 X
  2.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    2 q# M4 `1 z; h# j
  3.     GPIO_InitStruct.Pull = GPIO_NOPULL;3 L  X/ Y/ R: @& i8 Y4 K, }; Y
  4.     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;! d, D( d) o: A, h8 ]; q- l
  5.     GPIO_InitStruct.Alternate = GPIO_AF4_USART2;) X2 m- {, @0 O2 m# M- H) P' X- J' T
  6.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    # @, p. \& Q! @1 V* j! L
  7.                 ( c- t9 y+ ~- `% j2 O9 a7 C
  8.                 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
复制代码
1 h+ ]/ I( F3 \0 h* M6 ~
楼主我这样配置也能接收哦!
党国特派员 回答时间:2015-1-5 09:32:24
晓枫VS枯叶 发表于 2015-1-5 08:376 b  v) \. H$ h
楼主我这样配置也能接收哦!
/ s+ M1 o& ?$ G. D& @
合在一起写也是可以的。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版