简介:这是一个超级好用的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);