【STM32+HAL库】USART 串口通信(STM32Cube高效开发教程作者亲传 不好用回来砍我)

简介:这是一个超级好用的STM32HAL库的 USART串口收发数据的的例程,STM32Cube高效开发教程作者亲传,不好用找我。

1 软件准备

STM32CubeMX + STM32CubeIDE

2 程序准备

UART_PRO

--uart_pro.c

--uart_pro.h

3 STM32CubeMX配置

3.1 基础配置

配置烧录(如果不配置,烧一次程序第二次就烧不进去了)

配置时钟

对于此项目主频是多少无所谓。大家72-168Mhz之间随便填就行

3.2 USART相关配置

引脚配置

中断配置

在NVIC里抢占优先级比滴答定时器低1级,设置为1

3.3 project工程配置

4 驱动程序设计

4.1 文件夹结构 搜索路径添加

添加结果

如何添加,参考:4.1部分【STM32+HAL库】---- 软件IIC驱动0.96OLED (不使用Delay)_stm32 hal库 软件i2c-CSDN博客

4.2 驱动程序

uart_pro.c

/*
 * uart_pro.c
 *
 *  Created on: Jul 21, 2022
 *      Author: wwb
 *
 */

#include 	"uart_pro.h"
#include	<string.h>	//用到函数strlen()
#include	<stdio.h>	//用到函数sprintf()
//#include   	"keyled.h"

#define	  UART_HANDLE		huart1		//需要使用的UART口, 指向 huart1
#define   UART_INSTANCE		USART1		//用到的UART接口的Instance
#define	  UART_TIMEOUT		400

#define	 PRO_BUF_LEN	200		//处理缓冲区最大长度
uint8_t  RxProBuf[PRO_BUF_LEN];			//接收后用于处理的数据缓冲区



/*  HAL_UARTEx_ReceiveToIdle_IT() 函数用于以中断方式接收数据,直到接收到指定数量的数据,或直到发生IDLE中断
 *  Receive an amount of data in interrupt mode till either the expected number
 *  of data is received or an IDLE event occurs.
 *
 */

void Uart_RxAgain()
{
	HAL_UARTEx_ReceiveToIdle_IT(&UART_HANDLE, RxProBuf, PRO_BUF_LEN);
}

/*   HAL_UARTEx_RxEventCallback()是对应于 HAL_UARTEx_ReceiveToIdle_IT()的回调函数,
 *   当HAL_UARTEx_ReceiveToIdle_IT()接收到指定长度的数据,或发生IDLE中断时,此回调函数被触发
 *    参数Size是实际接收到的数据字节数
 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if (huart->Instance == UART_INSTANCE)
	{
		HAL_UART_Transmit(&UART_HANDLE,	RxProBuf, Size, UART_TIMEOUT);	//原路传回

		Uart_RxAgain(); // 接收完成后再次打开中断

	}
}



uart_pro.h

/*
 * uart_pro.h
 *
 *  Created on: Jul 21, 2022
 *      Author: wwb
 */

#ifndef UART_PRO_H_
#define UART_PRO_H_

#include "usart.h"

void Uart_RxAgain();	//再次进行串口接收


#endif /* UART_PRO_H_ */

5 驱动代码使用

5.1 接线

 5.2 调用

main.c

#include "uart_pro.h"  //包含头文件

Uart_RxAgain();  //打开串口接收中断

 5.3 XCOM调试助手使用

链接电脑然后选择对应的串口(不知道是哪个,就拔了哪个消失是哪个),波特率和CubeMX中单片机配置的一致。然后点击打开串口让那个灰色变为红色。

我们程序的功能就是把接收到的东西原路再发送回来。

6 常用的案例

 6.1 Demo-1 发送不变的字符串

HAL_UART_Transmit(&UART_K230_HANDLE, (uint8_t *)"hello K230\r\n", strlen("hello K230\r\n"), 400);
HAL_UART_Transmit(&UART_M0_HANDLE, (uint8_t *)"hello M0\r\n", strlen("hello M0\r\n"), 400);

6.2 Demo-2 发送语句

在想写发送的地方包含文件

#include	<string.h>	//用到函数strlen()
#include	<stdio.h>	//用到函数sprintf()

使用sprintf把想发送的东西存进字符串中 

char str_usart2[64];
sprintf(str_usart2, "[%.0f,%.0f]",qx_value,qy_value);
HAL_UART_Transmit(&UART_HANDLE, (uint8_t *)str_usart2, strlen(str_usart2), 400);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值