1.STM32CubeMX配置
以STM32F4103C8T6芯片的UART1为例进行配置:
配置串口中断:为了后续的中断模式和DMA模式的使用。
中断优先级配置:在STM32中,0表示优先级最高,15表示优先级最低。
配置TX为DMA,一定要勾选中断!!!
1.1 DMA简介与配置
DMA功能:Direct Memory Access,直接存储器访问,可以在CPU不参与的情况下,在存储器和外设之间自动传输数据。
假设要读5个数值:
1.正常模式:DMA读取数据,按顺序放入5个寄存器中,然后停止工作。
2.循环模式:DMA将5个寄存器存满后,再从第一个寄存器开始循环覆盖之前的数值。
勾选Memory(寄存器使能),效果是使存放的寄存器地址自动增加,比如要传递5个数值:
1.勾选:每次传递的数值都只放在第一个寄存器里,数值不断覆盖。
2.不勾选:第一次传递数据放入第一个寄存器,第二次传递的数值放入下一个寄存器,以此类推。
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接收数据
待更新~