zoukankan      html  css  js  c++  java
  • HAL驱动的串口编程陷阱

    http://bbs.elecfans.com/jishu_464356_1_1.html

    手上有块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);

    希望能给后面的人提供点经验,少走弯路。

  • 相关阅读:
    上传项目到github上
    app widget设置bitmap时,无作用
    Android Studio 启动app 白屏
    android sqlite 数据库中使用的类型
    android 解决华为系列手机调试时不能打印Logcat日志信息
    android 自定义滚动条图标
    检测邮箱
    js检测是否存在中文
    表单的checkbox选中和取消
    javascript
  • 原文地址:https://www.cnblogs.com/shangdawei/p/4684063.html
Copyright © 2011-2022 走看看