打印
[应用相关]

【转】调试记录:HAL驱动的串口编程陷阱

[复制链接]
712|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Garen2|  楼主 | 2018-7-30 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在.
首先看STM32F103传通驱动的代码:
/** USART1 GPIO Configuration  
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  */

  /*Configure GPIO pin : PA */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  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;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
在传通驱动下我们配置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
    PA3     ------> USART2_RX
    */
    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;
    //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)
    GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

希望能给后面的人提供点经验,少走弯路。
沙发
yiyigirl2014| | 2018-8-13 18:29 | 只看该作者
这个HAL库太臃肿,好多看着类似的函数,不太懂。

使用特权

评论回复
板凳
wakayi| | 2018-8-14 10:04 | 只看该作者
自动生成的话 是不是不会有啊

使用特权

评论回复
地板
wowu| | 2018-8-15 12:52 | 只看该作者
yiyigirl2014 发表于 2018-8-13 18:29
这个HAL库太臃肿,好多看着类似的函数,不太懂。

可以不生成不需要的 就没有那么多了

使用特权

评论回复
5
heimaojingzhang| | 2018-8-17 09:39 | 只看该作者
我印象中 好像生成的是GPIO_MODE_AF_PP这种模式啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

153

主题

734

帖子

3

粉丝