• 【STM32基础 CubeMX】uart串口通信



    前言

    嵌入式系统开发领域,串口通信是一项基础而重要的任务。无论是与外部传感器通信、与其他设备数据交换,还是进行远程调试和控制,UART(通用异步收发传输)串口通信都扮演着关键角色。对于初学者来说,了解如何在STM32微控制器上配置和使用UART串口通信可能会感到有些复杂。幸运的是,STMicroelectronics的CubeMX工具使这一过程变得更加简便。

    本文将向您介绍STM32基础和CubeMX工具,并详细解释如何配置和使用UART串口通信。无论您是嵌入式开发新手还是有经验的工程师,本文都将为您提供有关STM32和UART串口通信的有用信息,以帮助您轻松入门或深入了解这一关键技术。


    一、uart串口通信是什么

    二、cubeMX配置uart

    1、选择usart,Asynchronous是异步的。

    在这里插入图片描述

    2、查看常见的一些设置:比如波特率这些,这里默认是115200的
    在这里插入图片描述
    3、开启中断
    在这里插入图片描述
    4、最后,我们就可以生成代码了!!!

    三、代码分析

    3.1 CubeMX代码分析

    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
      Error_Handler();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    huart1.Instance = USART1; - 这行代码将一个称为 huart1 的串口句柄的 Instance 成员设置为 USART1,表示它将用于控制和访问串口1。

    huart1.Init.BaudRate = 115200; - 这行代码设置了串口1的波特率,即通信速度为115200 bits per second。

    huart1.Init.WordLength = UART_WORDLENGTH_8B; - 这行代码设置了每个传输的数据字长度为8位(8 bits),这是一种常见的设置,表示每个字符使用8位二进制来表示。

    huart1.Init.StopBits = UART_STOPBITS_1; - 这行代码设置了停止位的数量为1,这也是常见的设置,表示每个数据帧之后有一个停止位。

    huart1.Init.Parity = UART_PARITY_NONE; - 这行代码设置了奇偶校验(parity)为无校验,意味着不进行奇偶校验来检测或纠正数据传输中的错误。

    huart1.Init.Mode = UART_MODE_TX_RX; - 这行代码设置了串口的工作模式为同时支持发送(TX)和接收(RX)数据。

    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - 这行代码设置了硬件流控制为无控制,表示不使用硬件信号来控制数据流。

    huart1.Init.OverSampling = UART_OVERSAMPLING_16; - 这行代码设置了过采样率为16,这是UART通信的标准设置。

    if (HAL_UART_Init(&huart1) != HAL_OK) - 这是一个条件语句,它检查串口初始化是否成功。如果初始化不成功,就调用 Error_Handler() 函数来处理错误情况。

    3.2 以中断启动串口接收

    HAL_UART_Receive_IT 函数是STMicroelectronics的HAL库中用于通过UART(通用异步收发传输)接收数据的函数。以下是其函数原型、作用和参数的含义:

    函数原型:

    HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
    
    • 1

    参数:

    huart:指向 UART_HandleTypeDef 结构体的指针,用于指定要操作的UART通信通道。
    pData:指向用于存储接收数据的缓冲区的指针。
    Size:要接收的数据的字节数。
    作用:

    HAL_UART_Receive_IT 函数的作用是启动UART通信通道的异步接收操作,允许微控制器从外部设备或另一个通信设备接收数据。与传统的阻塞接收不同,该函数采用中断驱动的方式,允许微控制器在数据可用时执行其他任务,而不必一直等待数据到达。
    函数将指定大小的接收数据请求提交给UART通信通道,然后立即返回。当有新的数据到达时,UART模块将触发接收中断,并将数据存储到提供的缓冲区中。这使得微控制器可以继续执行其他任务,而不会因等待数据而被阻塞。

    通常,您可以在接收中断服务函数中处理接收到的数据,例如将数据存储到适当的位置或进行进一步的处理。

    3.3 以查询方式发送数据

    HAL_UART_Transmit 函数是STMicroelectronics的HAL库中用于通过UART(通用异步收发传输)发送数据的函数。以下是其函数原型、作用和参数的含义:

    函数原型:

    HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
    
    • 1

    参数:

    huart:指向 UART_HandleTypeDef 结构体的指针,用于指定要操作的UART通信通道。
    pData:指向要发送的数据的缓冲区的指针。
    Size:要发送的数据的字节数。
    Timeout:发送操作的超时时间,以毫秒为单位。如果发送操作在指定的时间内未完成,函数将返回错误。一般写0xffff,就是一直等待

    作用:

    HAL_UART_Transmit 函数的作用是启动UART通信通道的异步发送操作,将指定的数据发送给外部设备或另一个通信设备。与传统的阻塞发送不同,该函数采用中断驱动的方式,允许微控制器在数据发送时执行其他任务,而不必一直等待发送完成。
    函数将指定的数据缓冲区的内容发送到UART通信通道,并立即返回。如果指定的数据太多而无法立即发送完毕,UART模块将继续发送数据并在后台进行。发送完成后,UART模块将触发发送中断。

    通常,您可以在发送中断服务函数中处理发送完成的事件或继续发送下一部分数据。

    3.4 串口回调函数

    函数原型如下:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    
    • 1

    四、示例代码

    4.1 最简单的使用

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	tx = rx;
    	
    	HAL_UART_Transmit(&huart1,&tx,1,0xffff);
    	
    	HAL_UART_Receive_IT(&huart1,&rx,1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码详解:
    tx = rx;:这行代码的意思是把接收到的数据(rx)赋值给要发送的数据(tx)。也就是说,通过串口接收到的数据会被立即发送出去。

    HAL_UART_Transmit(&huart1,&tx,1,0xffff);:这是一个串口发送的函数调用。它告诉串口库(HAL_UART),通过串口1(&huart1),发送 tx 中的一个字节(1字节),并设置发送超时时间为 0xffff 毫秒(相当于很长时间,即无限等待,直到发送完成)。

    HAL_UART_Receive_IT(&huart1,&rx,1);:这是一个串口接收的函数调用,其中 IT 表示中断(Interrupt)。它告诉串口库,在串口1上启动一个异步接收的操作,将接收到的数据存放在 rx 中,且每次接收一个字节(1字节)。这样,当有数据到达时,系统会触发一个中断,执行相应的中断服务函数来处理接收到的数据。

    综合起来,这段代码的作用是:接收一个字节的数据(rx),然后立即将这个数据发送出去,同时启动异步接收,以便在后续数据到达时能够及时处理。

    4.2 实现fputc函数以使用printf函数

    我们只需要像下面:

    int fputc(int c,FILE*fp)
    {
    	HAL_UART_Transmit(&huart1,(uint8_t *)&c,1,0xffff);
    	return c;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实现fputc即可使用printf


    总结

    串口通信是嵌入式系统中必不可少的通信方式之一,而STM32微控制器则为实现串口通信提供了强大的支持。本文中,我们首先介绍了STM32微控制器的基础知识,然后重点关注了CubeMX工具,它可以大大简化STM32项目的初始化和配置过程。

    通过本文,您学会了如何在CubeMX中配置UART串口通信,包括GPIO引脚的设置和UART参数的配置。我们还详细讲解了UART发送和接收的代码示例,帮助您理解数据的流动过程。

    无论您是刚刚踏入嵌入式领域,还是希望进一步提升自己的STM32开发技能,本文都为您提供了宝贵的参考资料。串口通信是许多嵌入式项目的核心组成部分,掌握这一技能将使您能够更自如地处理各种数据交互任务,为您的项目带来更大的成功。希望本文能够帮助您加深对STM32和UART串口通信的理解,并激发您在嵌入式开发领域的创新精神。

  • 相关阅读:
    51单片机送餐机器人快递机器人_ESP8266_APP_WIFI(原理图+PCB+源码)
    性能监控-linux操作系统计数器
    了解C语言中的atoi函数和模拟实现
    【突然想多了解一点】可以用 Task.Run() 将同步方法包装为异步方法吗?
    遍历List集合
    mybatis中和MP中关于拿到插入新数据的id解决方案
    PyQt5快速开发与实战 9.3 Pandas在PyQt中的应用
    【Kubernetes项目部署】k8s集群+高可用、负载均衡+防火墙
    vue-router配置
    MCS:多元随机变量——多项式分布
  • 原文地址:https://blog.csdn.net/m0_62599305/article/details/133512999