手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。 使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。( y' W# R! W4 I" b% p6 @$ s. A 使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在. 首先看STM32F103传通驱动的代码:7 ]7 u, h; Z# X /** USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */$ p. J' w& R- f; Z9 m% _ /*Configure GPIO pin : PA */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;1 y- l0 T* u. ~! I! n GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct);5 N) `& s0 Z1 ?9 ?6 |7 m" E- L /*Configure GPIO pin : PA */* e, u( Y O# S) H7 k! C5 E i GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;# g* M7 h- J$ d- | GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct);8 [7 P, N2 v* a# z. j- M8 } 在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。 代码如下:用HAL驱动时 /**USART2 GPIO Configuration PA2 ------> USART2_TX. v% i% y# o1 R: [4 @) w. e$ ^ PA3 ------> USART2_RX , L- y) q; @6 q- y% F, g */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;4 l- G# Y) G6 M' Q( A( [. ` GPIO_InitStruct.Pull = GPIO_NOPULL;) p3 [ ?# h' i8 Z% |9 F GPIO_InitStruct.Speed = GPIO_SPEED_FAST;$ \; Q! J9 O9 }( i) O GPIO_InitStruct.Alternate = GPIO_AF4_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 c ^+ }7 w0 Q; ~5 }. N 2 q, ~. @4 b7 \0 E4 c GPIO_InitStruct.Pin = GPIO_PIN_3;0 I& b4 z* J* D //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)8 R# Z% r7 [! w: s/ H GPIO_InitStruct.Alternate = GPIO_AF4_USART2;, k1 H/ [- M% D HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 8 A% A8 z: }, M/ F 希望能给后面的人提供点经验,少走弯路。 |
还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置
//GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!
这个应该是F1和其他系列的问题吧。玩惯了F1的人很多都配置成浮空输入。