• STM32CUBEIDE(7)----USART收发配置


    概述

    本章STM32CUBEMX配置STM32F103,测试串口发送接收函数。
    最近在弄ST和GD的课程,需要样片的可以加群申请:6_15061293。

    视频教学

    https://www.bilibili.com/video/BV1Qv4y1c7HU/

    STM32CUBEIDE(7)----USART收发配置

    csdn课程

    课程更加详细。
    https://download.csdn.net/course/detail/35611

    生成例程

    使用STM32CUBEMX生成例程,这里使用NUCLEO-F103RB开发板
    在这里插入图片描述
    查看原理图,PA2和PA3设置为开发板的串口。
    在这里插入图片描述
    配置串口。

    在这里插入图片描述
    开启中断。
    在这里插入图片描述

    STM32CUBEIDE配置

    在这里插入图片描述
    若需要打印浮点型,需要勾选下面的选项。
    在这里插入图片描述

    串口重定向

    在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    /* USER CODE END Includes */
    
    • 1
    • 2
    • 3

    函数声明和串口重定向:

    /* USER CODE BEGIN PFP */
    #ifdef __GNUC__									//串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif 
    PUTCHAR_PROTOTYPE
    {
        HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
    }
    /* USER CODE END PFP */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    串口发送接收函数

    一般情况下,串口发送接收函数有如下所示。
    ● HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
    ● HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。
    ● HAL_UART_Transmit_IT();串口中断模式发送
    ● HAL_UART_Receive_IT();串口中断模式接收
    ● HAL_UART_Transmit_DMA();串口DMA模式发送
    ● HAL_UART_Receive_DMA();串口DMA模式接收

    HAL_UART_Transmit()发送

    通过轮询,将数据发送出去。

    
    	  uint8_t buffer1[10]="0123456789";
    	  HAL_UART_Transmit(&huart2, buffer1, 10,0xFFFF);//把buffer1的内容通过uart2发送出去,长度为10,timeout的时间是0xffff
    
    • 1
    • 2
    • 3

    演示结果如下所示。
    在这里插入图片描述

    HAL_UART_Transmit_IT()发送

    通过中断模式发送,这个模式下需要开启串口中断,否则无法发出数据。

    	  /***********方法1********************/
    	  uint8_t buffer2[10]="9876543210";
    	  HAL_UART_Transmit_IT(&huart2, buffer2, 10);//把buffer1的内容通过uart2发送出去,长度为10,
    	  while(huart2.gState != HAL_UART_STATE_READY);
    
    
    	  /***********方法2********************/
    //	  uint8_t buffer2[10]="9876543210";
    //	  HAL_UART_Transmit_IT(&huart2, buffer1, 10);//把buffer1的内容通过uart2发送出去,长度为10,
    //	  while(HAL_UART_Transmit_IT(&huart2, buffer2, 10) != HAL_OK);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上述代码中,可以不使用while进行等待也可以发送,但是需要注意不能未发送完毕又重新发送。
    演示结果如下所示。

    HAL_UART_Transmit()和HAL_UART_Transmit_IT()对比

    若HAL_UART_Transmit_IT()不使用while进行等待,他的波形图如下所示。
    黄色线为波形,红色线为发送后的电平翻转。
    在这里插入图片描述
    HAL_UART_Transmit()发送如下所示。
    在这里插入图片描述
    可以看到,HAL_UART_Transmit()发送必须要等待发送完毕才可以接着往下执行。
    HAL_UART_Transmit_IT()为中断发送,可以在发送数据时候执行其他指令。

    HAL_UART_Receive()接收

    串口轮询模式接收,使用超时管理机制。
    例如接收一个10个数据。

    	  uint8_t rxdata1[10]={0,0,0,0,0,0,0,0,0,0};
          /* 判断是否接收成功 */
          if(HAL_UART_Receive(&huart2, rxdata1, 10, 10000) == HAL_OK)
          {
              /* 将接收成功的数据通过串口发出来 */
              HAL_UART_Transmit(&huart2,rxdata1, 10, 0xffff);
          }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果如下所示。
    在这里插入图片描述

    HAL_UART_Receive_IT()接收

    串口中断模式接收,这样就可以不需要等待,单片机在没有数据接收时候可以进行其他工作。
    例如接收一个10个数据。
    定义接收数组。

    /* USER CODE BEGIN PV */
      uint8_t Rx_Data[10]={0,0,0,0,0,0,0,0,0,0};
    /* USER CODE END PV */
    
    • 1
    • 2
    • 3

    开启接收中断。

      /* USER CODE BEGIN 2 */
      HAL_UART_Receive_IT(&huart2, (uint8_t *)Rx_Data, 10); //开启接收中断,接收10个数据到Rx_Data
      /* USER CODE END 2 */
    
    • 1
    • 2
    • 3

    读取回调函数。

    /* USER CODE BEGIN 4 */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	/* 将接收成功的数据通过串口发出*/
    	HAL_UART_Transmit(&huart2,Rx_Data, 10, 0xffff);
    	HAL_UART_Receive_IT(&huart2, (uint8_t *)Rx_Data, 10); //重新开启,接收10个数据到Rx_Data
    
    }
    /* USER CODE END 4 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试结果如下。
    在这里插入图片描述

    HAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回。

    最后

    以上的代码会在Q群里分享。QQ群:615061293。
    或者关注微信公众号『记帖』,持续更新文章和学习资料,可加作者的微信交流学习!
    在这里插入图片描述

  • 相关阅读:
    AWS SAP-C02教程4--身份与联合身份认证
    王道计算机考研 操作系统学习笔记 + 完整思维导图篇章五: IO管理
    ChatGPT学习第三周
    速锐得LIN总线在灯光控制系统的应用硬件设计
    Git基础操作及协作流程
    raw图片处理推荐 DxO PhotoLab 6 for Mac中文最新
    MSQL系列(十三) Mysql实战-left/right/inner join 使用详解及索引优化
    vue3项目运行时解析文件的顺序
    基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph--google镜像chatgpt
    产品运营的场景和运营策略
  • 原文地址:https://blog.csdn.net/qq_24312945/article/details/124969348