手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。 使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。3 }9 s. c, s( O 使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.2 W b8 L2 p: @ 首先看STM32F103传通驱动的代码:7 P: W7 z5 z9 z+ w0 T& u' ^" o /** USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX2 e3 @6 A/ s) r& |( Z, N7 b */ - r0 c* c5 }, S0 k* R9 q$ B* G /*Configure GPIO pin : PA */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;4 C: o$ j" m3 Y+ B GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct);2 Z4 N. {9 \. s" j/ i; _ /*Configure GPIO pin : PA */3 s) f. Y) p9 D" F0 d0 E L GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;; w1 y) @" `& S GPIO_Init(GPIOA, &GPIO_InitStruct);7 t$ n2 \1 o; l/ I 在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。/ l4 M D! V2 p5 T3 y5 j0 ~1 L 代码如下:用HAL驱动时 /**USART2 GPIO Configuration * n8 P+ b3 g! t PA2 ------> USART2_TX. c9 C/ Z5 G2 C/ O PA3 ------> USART2_RX : H3 @7 \$ v% L6 W( `8 z/ S */8 G u5 _- z& ? GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3;# f/ T" {/ d- o# t8 `& p" E //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要): ?. a/ L4 J" c GPIO_InitStruct.Alternate = GPIO_AF4_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);; f' p5 K' W% ^) U6 w7 C ^ 希望能给后面的人提供点经验,少走弯路。 |
还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置
//GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!" e9 v" f9 i+ X3 j& v* H y, n. @# b% [
这个应该是F1和其他系列的问题吧。玩惯了F1的人很多都配置成浮空输入。