STM32CubeMX学习笔记(3)--UART串口使用

499 阅读3分钟

1.STM32CubeMX配置

以STM32F4103C8T6芯片的UART1为例进行配置:

image.png

image.png

配置串口中断:为了后续的中断模式和DMA模式的使用。

image.png

image.png
中断优先级配置:在STM32中,0表示优先级最高,15表示优先级最低。
配置TX为DMA,一定要勾选中断!!! image.png

1.1 DMA简介与配置

DMA功能:Direct Memory Access,直接存储器访问,可以在CPU不参与的情况下,在存储器和外设之间自动传输数据。

假设要读5个数值:
1.正常模式:DMA读取数据,按顺序放入5个寄存器中,然后停止工作。
2.循环模式:DMA将5个寄存器存满后,再从第一个寄存器开始循环覆盖之前的数值。
image.png

勾选Memory(寄存器使能),效果是使存放的寄存器地址自动增加,比如要传递5个数值:
1.勾选:每次传递的数值都只放在第一个寄存器里,数值不断覆盖。
2.不勾选:第一次传递数据放入第一个寄存器,第二次传递的数值放入下一个寄存器,以此类推。 image.png image.png

2.使用UART发送数据业务代码

以下3种模式,均需要添加的头文件:

#include <stdio.h>
#include "usart.h"
#include <string.h>
#include <stdarg.h>

注:以下3种模式所编写的程序,不涉及printf()函数的重定向问题,可以实现所有UART外设都可以打印信息到串口。

2.1 阻塞模式

// 堵塞模式
void log(const char *format, ...)
{
	va_list args;			// 定义参数列表变量
	va_start(args, format); // 从format位置开始接收参数表,放在arg里面

	char strBuf[256];				// 定义输出的字符串
	vsprintf(strBuf, format, args); // 使用vsprintf将格式化的数据写入缓冲区
	va_end(args);					// 结束可变参数的使用
	HAL_UART_Transmit(&huart1, (uint8_t *)strBuf, strlen(strBuf), HAL_MAX_DELAY);
}

2.2 中断模式

// 中断模式
void log_IT(const char *format, ...)
{
	va_list args;			// 定义参数列表变量
	va_start(args, format); // 从format位置开始接收参数表,放在arg里面

	char strBuf[256];				// 定义输出的字符串
	vsprintf(strBuf, format, args); // 使用vsprintf将格式化的数据写入缓冲区
	va_end(args);					// 结束可变参数的使用

	// 等待上次的数据发送完成,避免新的数据覆盖正在传输的数据,导致混乱
	while (HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX)
	{
		// Wait for transfer to complete
	}

	HAL_UART_Transmit_IT(&huart1, (uint8_t *)strBuf, strlen(strBuf));
}

2.3 DMA模式

// DMA模式
void log_DMA(const char *format, ...)
{
	va_list args;			// 定义参数列表变量
	va_start(args, format); // 从format位置开始接收参数表,放在arg里面

	char strBuf[256];				// 定义输出的字符串
	vsprintf(strBuf, format, args); // 使用vsprintf将格式化的数据写入缓冲区
	va_end(args);					// 结束可变参数的使用

	// 等待上次的数据发送完成,避免新的数据覆盖正在传输的数据,导致混乱
	while (HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX)
	{
		// Wait for DMA transfer to complete
	}

	HAL_UART_Transmit_DMA(&huart1, (uint8_t *)strBuf, strlen(strBuf));
}

3.UART接收数据

待更新~