|
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。 使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。$ ^2 l% h- w) L$ ~+ l 使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.% i* E9 A5 G+ S; i1 w6 B$ q 首先看STM32F103传通驱动的代码:& D! k6 Q2 i5 a8 C2 O z2 t /** USART1 GPIO Configuration 2 ^$ i9 z1 A' ?% {; ^5 ]; k p PA9 ------> USART1_TX+ ?. ?! l6 z. {/ j9 k0 B1 h# M6 Q# ? PA10 ------> USART1_RX& l5 @6 Y' k! f! X4 _ */ 7 Q1 A2 h( r8 J5 ~' Q% y8 Y: { /*Configure GPIO pin : PA */! Y. u% _8 E9 @9 c% |0 m: f GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;! [+ j' l) [, u7 C+ O2 U4 p GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PA */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;/ f6 R. k* x4 l( @ GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;' s M6 J5 H& c GPIO_Init(GPIOA, &GPIO_InitStruct);5 l, P5 ?. h% N5 ~ 在传通驱动下我们配置IO的时候,对于TX 我们配置GPIO_Mode为GPIO_Mode_AF_PP,对于RX我们配置GPIO_Mode为GPIO_Mode_IN_FLOATING。有时候人有惯性思维认为理所应当的在HAL里也应该一样,我就是在这个地方栽了跟头。在HAL驱动方式里,RX,TX必须都配置成GPIO_MODE_AF_PP。 代码如下:用HAL驱动时) j, \7 d( {/ \- U' @- O3 B /**USART2 GPIO Configuration 4 }( y! w# ~: K PA2 ------> USART2_TX PA3 ------> USART2_RX */ GPIO_InitStruct.Pin = GPIO_PIN_2; H! b+ F" t9 O8 P! h: n# q GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;1 R" g- g! S. X& C; T GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 r7 T; a0 i) h: P9 [' x0 Y4 D 0 y- L. S% A9 i GPIO_InitStruct.Pin = GPIO_PIN_3; //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要) GPIO_InitStruct.Alternate = GPIO_AF4_USART2;, r1 F3 q! o M HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);3 D* w9 @! y4 s% }/ E/ \1 U$ W 希望能给后面的人提供点经验,少走弯路。$ n& `$ G+ }. B* Z; {( W |
微信公众号
手机版
还有就是你既然配置为GPIO_InitStruct.Alternate = GPIO_AF4_USART2;复用功能了怎么还会想着去配置. b( ~# q& [3 \5 V0 q* X; t! `
//GPIO_InitStruct.Mode = GPIO_MODE_INPUT 呢!# o5 v7 [) x5 ?, m' S u
这个应该是F1和其他系列的问题吧。玩惯了F1的人很多都配置成浮空输入。