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

HAL驱动的串口编程陷阱

[复制链接]
党国特派员 发布时间:2015-1-4 21:49
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。* A0 N: L. {4 ^+ b% ]! d! L0 q
使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。: \) W/ r7 t* l# ^8 X7 O$ Q" b
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.1 P/ D, N# ^( G1 Z0 F  L
首先看STM32F103传通驱动的代码:8 n/ x! n# h+ M& o4 p  C, Q
/** USART1 GPIO Configuration  / J0 e: Y3 o: v* m
  PA9   ------> USART1_TX
6 |5 T. m, i9 {2 P/ x0 l  PA10   ------> USART1_RX
9 m; k" Z+ c( d- @. `! Y  */

* a2 z' S2 `6 |0 l7 O% \/ S" k/ L4 D
  /*Configure GPIO pin : PA */5 H9 ?" Y, \# N& w. A. s4 H
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;/ [7 {/ Z- h( a( ?6 i7 @
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
+ g. |" _- [" \" {  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
; _$ ?9 I+ d: D% m1 Z8 t  GPIO_Init(GPIOA, &GPIO_InitStruct);
. H' J; V' L& g. h. e5 }. f' g% K2 r6 B9 n
  /*Configure GPIO pin : PA */
1 A; q: p* t( ?  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
+ c9 [  W3 w$ T3 `, \6 h  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;; S/ y+ L1 v. }; y
  GPIO_Init(GPIOA, &GPIO_InitStruct);
/ ]6 N4 n$ s+ r- A在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。
6 H) ], H) h' I) C' i代码如下:用HAL驱动时
% [# T2 w2 C6 B$ x    /**USART2 GPIO Configuration   
7 t1 u: F! Y$ k4 @1 Q& c    PA2     ------> USART2_TX4 K4 K6 y; J6 J/ M4 g. R0 h, i# w
    PA3     ------> USART2_RX 7 h* G' T! }# u6 k3 @. {. w
    */
8 U7 M' n' X5 f$ h
    GPIO_InitStruct.Pin = GPIO_PIN_2;$ ^+ i  J8 `2 h  y8 a( B
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;% O6 }' P5 T/ Y) R7 s
    GPIO_InitStruct.Pull = GPIO_NOPULL;
& p  o# w/ D, Z! B, {" X/ @    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
, s2 W; `& t0 z% I9 y    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
5 w* K+ F9 `6 M2 ~/ h, A- @    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);6 _; b8 O. L$ f' _; z
; w2 Q( E: G4 |; c* }' x
    GPIO_InitStruct.Pin = GPIO_PIN_3;- L8 j8 M: D: P; B2 v' q& H
    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)7 W1 f0 e0 I$ X! j9 o- {8 K* m& V
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
0 x" \/ I( n$ V+ u  d! P    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);9 z1 g1 ]$ ]2 R3 X5 [; c2 y/ G

7 p! t* `/ J7 j' z希望能给后面使用HAL驱动的人提供点经验,少走弯路。
1 G& V' W; f$ m% n5 E. ?: 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;
    : W7 d! }: z- L. T& y7 p
  2.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    4 ]. M1 s# |6 @3 A6 R( `2 W
  3.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    / [3 k5 D! ]" I1 }/ g: l0 N
  4.     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    ! B* L" r6 |$ |) _, z: v/ P2 W
  5.     GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
    6 S* q0 O; q& l; {6 b
  6.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    4 F2 g% {* I  P5 U+ y" U' v
  7.                
    & G# R+ S: o0 w3 D! v4 z4 I1 G' p
  8.                 __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);
复制代码

: A& H2 e* l4 X; A) k8 r& R楼主我这样配置也能接收哦!
党国特派员 回答时间:2015-1-5 09:32:24
晓枫VS枯叶 发表于 2015-1-5 08:37
( G- M5 e, d- \/ j. E( J9 {楼主我这样配置也能接收哦!

3 ]' B( g" X% e) ]$ b+ x9 [合在一起写也是可以的。

所属标签

相似分享

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