电子技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1621|回复: 0

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

[复制链接]

624

主题

627

帖子

416

积分

专栏作家

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
416
发表于 2015-4-15 10:59:30 | 显示全部楼层 |阅读模式
调试记录:HAL驱动的串口编程陷阱
手上有块NUCLEO STM32L053x板子,用来做串口实验,看了下ST的最新库HAL驱动,于是想用HAL驱动来做串口。
使用过程中发现只能发送数据不能接收数据,用逻辑分析仪查看RX,TX引角,都有数据,但就是收不到数据。
使用STM32F103传统驱动,一点问题没有,改到HAL怎么就不行了呢?经过一周的调试终于找到了问题所在。
首先看STM32F103传通驱动的代码:
  1. /** USART1 GPIO Configuration  
  2.    PA9   ------> USART1_TX
  3.    PA10   ------> USART1_RX
  4.    */

  5.   /*Configure GPIO pin : PA */
  6.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  7.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  8.    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  9.    GPIO_Init(GPIOA, &GPIO_InitStruct);

  10.   /*Configure GPIO pin : PA */
  11.    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  12.    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  13.    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驱动时
  1.     /**USART2 GPIO Configuration   
  2.      PA2     ------> USART2_TX
  3.      PA3     ------> USART2_RX
  4.      */
  5.      GPIO_InitStruct.Pin = GPIO_PIN_2;
  6.      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  7.      GPIO_InitStruct.Pull = GPIO_NOPULL;
  8.      GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  9.      GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
  10.      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  11.      GPIO_InitStruct.Pin = GPIO_PIN_3;
  12.      //GPIO_InitStruct.Mode = GPIO_MODE_INPUT;(这句千万不能要)
  13.      GPIO_InitStruct.Alternate = GPIO_AF4_USART2;
  14.      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
复制代码

本帖分享出来希望能给学友提供一些经验。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|电子技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2019-2-20 06:15 , Processed in 0.047984 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2018 Comsenz Inc.

快速回复 返回顶部 返回列表