首页 > 其他分享 >最详细STM32,cubeMX串口发送,接收数据

最详细STM32,cubeMX串口发送,接收数据

时间:2023-11-10 11:32:18浏览次数:38  
标签:HAL 引脚 UART STM32 串口 发送数据 接收数据

这篇文章将详细介绍 串口 发送数据,接受数据。

@TOC


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
  • 实验:串口发送数据点亮 led。

一、串口的基础知识

如果想了解串口的基础知识可以参考我之前的文章: STM32Cube串口USART发送接收数据 STM32CubeMX串口USART中断发送接收数据

二、cubeMX 配置

  1. 选择芯片,开始创建工程。
  2. 设置 仿真。
  3. 配置时钟,选择 HSE, 高速时钟。
  4. 设置时钟频率。 直接设置为 最大频率 72 ,然后双击 enter 即可。
  5. 设置工程的名字,工具链选择 MDK。
  6. 点击自动生成 .c / .h 文件。
  7. 这里我使用串口2 ,USART2。然后选择异步模式。 对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。
  8. 点击 NVIC, 使能中断。
  9. 设置 相关参数(波特率,数据长度,校验位,停止位)
  10. 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。
  11. 点击生成即可。 这样就可以生成 keil 的工程文件。

三、自动生成代码解析

使用 cubeMX 生成的 串口代码都放在 usart.c 中。

  1. 首先还是 先定义一个 串口对象,这是一个结构体。
  2. 初始化这个结构体中的相关参数。然后调用 HAL_UART_Init(&huart2) 对其初始化。
  3. 之后自动调转到HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) 执行。
  4. __HAL_RCC_USART2_CLK_ENABLE(); 开启串口 2 由于 PA2, PA3 引脚,所以使用 __HAL_RCC_GPIOA_CLK_ENABLE();使能 gpio 端口。
  5. 配置引脚: 这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。
  6. HAL_NVIC_SetPriority(USART2_IRQn, 0, 0) 设置优先级 HAL_NVIC_EnableIRQ(USART2_IRQn); 使能中断

最详细STM32,cubeMX串口发送,接收数据_数据

最详细STM32,cubeMX串口发送,接收数据_数据_02

四、串口发送数据函数

  1. 发送数据。串口发送数据有 2 种写法。(有无中断)

这里我主要介绍最后一个参数 超时时间 Timeout 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。

HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

以中断的方式发送数据。这里就不需要超时时间了。

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
  1. 接收数据。
  • 开启串口中断接收函数: 每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • 串口中断接收回调函数:当接收到数据时,就会调用该函数。
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

五、使用串口收发数据点亮 led

这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。

uint8_t rx_buff = 0;									// 存放接收的数据


/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart2)
	{
		if(rx_buff == 0xa1)											// 发送 a1 点亮 led
		{
			printf("LED ON\r\n");								// 使用 printf 发送数据,需重定向 fputc 函数
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
		}
		else if(rx_buff == 0xa2)									// 发送 a2 熄灭 led
		{
			printf("LED OFF\r\n");
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
		}
	}
	
	HAL_UART_Receive_IT(&huart2,&rx_buff,1);							// 再次开启接收
}

重定向函数:

发送数据,可使用 printf由于 printf 依赖于 fputc 函数,所以可以重定向 fputc 来实现 printf 串口发送数据。

int fputc(int ch, FILE* f)
{
	while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);
	return 0;
}

接收数据可以使用 scanf

int fgetc( FILE *f)       /* scanf 输入 */
{
	char c = 0;
	while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
	return c;
}

总结

下一篇文章为大家介绍 STM32 超声波 模块的使用。

标签:HAL,引脚,UART,STM32,串口,发送数据,接收数据
From: https://blog.51cto.com/u_16159289/8294206

相关文章

  • STM32实现无源蜂鸣器唱歌
    记录学习stm32中实现小demo所涉及到的知识点一、蜂鸣器发声原理蜂鸣器分为有源和无源两种。所谓的源,指的是其中内部的振荡源,有源蜂鸣器中的振荡器一般是[[多谐振荡器]],其原理就是模拟电路中RC振荡器的一般原理(放大电路、正反馈、相位差90°、稳压电路),有源蜂鸣器内部的振荡源频......
  • 最详细STM32,cubeMX 超声波测距
    这篇文章将详细介绍STM32使用cubeMX驱动超声波测距。@TOC前言实验材料:STM32F103C8T6开发板,HC-SR04超声波模块。所需软件:keil5,cubeMX,AiThinkerSerialTool串口助手。实验目的:了解STM32使用cubeMX驱动超声波。实验:超声波测距。一、超声波模块HC-SR04超声波测距模块可提......
  • USB转串口CH343驱动
    背景在网上用9.9淘的一块ESP32-C3(RISC-V)的小开发板上,用的CH343的USB转串口。最近打算学习用Rust开发ESP32-C3,在Ubuntu上搭建开发环境的时候发现,Ubuntu20.04上默认使用的是CDC-ACM驱动,即生成的节点为/dev/ttyACM0,但是用Rust开发ESP32-C3,需要使用VCP驱动,于是在网上找到了官方(......
  • STM32F407 LUA 串口代码传输进行功能热更新
    STM32F407LUA串口代码传输进行功能热更新1.首先放上LUA资源LUA2.整体思路创建keil工程--->移植lua--->补充相应功能3.移植LuaStep1正常解压即可只有这个文件有用Step2在这个文件夹里搜索,删掉这两个文件(这两个文件在stm32中不使用)剩余的文件按照添加BSP的流......
  • 1. 手动移植FreeRTOS V9.00到 Stm32F103C8T6
    记录移植过程,以便以后查看:1.使用cubeMAX配置一个工程a.选择单片机型号: b。设置SWD调试,选TIM4作为系统时钟,systick要用来跑freeRTOS c.NVIC默认使用Group4 配置GPIO,我这里配置了两个引脚,作为LED输出 d,RCC都选外部晶振 e。配置时钟树,HCLK72Mhz  f。project......
  • RS485串口介绍和演示
    RS485是一种常见的串行通信协议,广泛用于工业自动化、仪表和远程监控等领域。本文将介绍RS485串口的基本原理,并通过代码演示如何在嵌入式系统中使用RS485进行通信。RS485串口概述RS485是一种差分信号的串行通信协议,它使用两个信号线进行数据传输:一个是非常态(非反相)信号A,另一个是反相......
  • CAST电子部单片机方向授课——串口通信 预习文档
    CAST电子部单片机方向授课——串口通信预习文档课前小准备安装串口调试助手第一步:进入MicrosoftStore第二步:在MicrosoftStore中搜索“串口调试助手”第三步:点击获取,按要求安装即可下载完成后,桌面上可能没有快捷方式,需要在win里搜索一下,然后拖到桌面上。注:其他安装方......
  • licheepi 4a串口通信
    licheepi4a串口通信(usb串口)博主使用usb串口原因是博主的是内测版本,虽然购买了1.8转3v3的usb转ttl模块,但是板载的UART1还是1.8V电平。所以本博客记录博主使用usb转串口进行串口通信。博主环境:debian20231023镜像licheepi4a8+8G(1)安装pyserial库并查看usb串口模块端口......
  • USB转串口芯片对比选秀---推荐CP2102和CH340C
    参考应用文章:《USB转串口芯片你看好哪个(USB转串口芯片介绍)》简短不看版:建议选择这2款芯片:CP2102/CP2104和CH340C。稳定性较好。 1.FT232优势:最常用缺点:假货多,并不是不能用,而是稳定性差。串口容易丢。规格书:https://atta.szlcsc.com/upload/public/pdf/source/20130221/14......
  • esp32s3使用多串口
    esp32s3使用多串口我按照别人博客中设置串口2,串口打印有问题,因为没有看到esp32s3多串口,就总结了一下自己的经验下图为esp32的引脚图下图为esp32s3的引脚图ESP32-S3有三个UART(通用异步收发器)控制器,即UART0、UART1、UART2,支持异步通信(RS232和RS485)和IrDA,通信速率可达......