一、Usart_Init

1.1 UART_HandleTypeDef

  • Instance: UART 外设的寄存器基地址
  • Init:UART 配置参数
  • pTxBuffPtr:指向 UART 发送缓冲区的指针
  • TxXferSize:UART 发送缓冲区的大小
  • TxXferCount:UART 发送传输计数器
  • pRxBuffPtr:指向 UART 接收缓冲区的指针
  • RxXferSize:UART 接收缓冲区的大小
  • RxXferCount:UART 接收传输计数器
  • ReceptionType:正在进行的接收类型
  • RxEventType:接收事件类型
  • hdmatx:UART 发送 DMA 句柄
  • hdmarx:UART 接收 DMA 句柄
  • Lock:锁对象,用于管理 UART 的并发访问
  • gState:UART 全局句柄的当前状态
  • RxState:与接收操作相关的 UART 状态信息
  • ErrorCode:UART 错误代码

1.2 UART_InitTypeDef

  • Init.BaudRate:UART 通信的波特率

9600

115200

921600

  • Init.WordLength:指定数据帧中传输或接收的数据位数

    UART_WORDLENGTH_8B

    UART_WORDLENGTH_9B

  • Init.StopBits:指定传输的停止位数量

UART_STOPBITS_1

UART_STOPBITS_2

  • Init.Parity:指定校验模式

UART_PARITY_NONE:无校验

UART_PARITY_EVEN:偶校验

UART_PARITY_ODD:奇校验

  • Init.Mode:是否启用接收或发送模式

UART_MODE_RX

UART_MODE_TX

UART_MODE_TX_RX

  • Init.HwFlowCtl:是否启用硬件流控制模式

UART_STATE_DISABLE

UART_STATE_ENABLE

  • Init.OverSampling:启用几倍过采样

UART_OVERSAMPLING_16:8次采样来获取

UART_OVERSAMPLING_8:8次采样来获取

1.3 HAL_UART_Init(UART_HandleTypeDef *huart)

将1.1和1.2中的配置进行初始化,此函数会调用AL_UART_MspInit(UART_HandleTypeDef* uartHandle)

进行串口的硬件初始化

二、HAL_UART_MspInit

2.1 GPIO_InitTypeDef

  • Pin:指定要配置的 GPIO 引脚

GPIO_PIN_x

  • Mode:指定引脚的工作模式

GPIO_MODE_INPUT:输入模式

GPIO_MODE_OUTPUT_PP:推挽输出模式

GPIO_MODE_OUTPUT_OD:开漏输出模式

GPIO_MODE_AF_PP:复用功能推挽输出模式

GPIO_MODE_AF_OD:复用功能开漏输出模式

GPIO_MODE_ANALOG:模拟模式

GPIO_MODE_IT_RISING:外部中断模式,触发上升沿

GPIO_MODE_IT_FALLING:外部中断模式,触发下降沿

GPIO_MODE_IT_RISING_FALLING:外部中断模式,触发上升沿或下降沿

GPIO_MODE_EVT_RISING:外部事件模式,触发上升沿

GPIO_MODE_EVT_FALLING:外部事件模式,触发下降沿

GPIO_MODE_EVT_RISING_FALLING:外部事件模式,触发上升沿或下降沿

  • Pull:指定引脚的上拉或下拉电阻

GPIO_NOPULL:无上下拉

GPIO_PULLUP:上拉

GPIO_PULLDOWN:下拉

  • Speed:指定引脚的输出速度

GPIO_SPEED_FREQ_LOW:低速

GPIO_SPEED_FREQ_MEDIUM:中速

GPIO_SPEED_FREQ_HIGH:高速

  • Alternate:引脚的复用功能

2.2 HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

将2.1的结构体传入HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)进行初始化

2.3 DMA_HandleTypeDef

  • Instance:指向DMA 流寄存器基地址
  • Init:DMA 通信参数的结构体
  • Lock:DMA 锁对象
  • State:DMA 传输的当前状态
  • Parent:指向与 DMA 操作相关联的父对象
  • XferCpltCallback:传输完成时调用的回调
  • XferHalfCpltCallback:半传输完成时调用的回调
  • XferM1CpltCallback:内存 1 的传输完成时调用的回调
  • XferM1HalfCpltCallback:内存 1 的半传输完成时调用的回调
  • XferErrorCallback:DMA 传输出错时调用的回调
  • XferAbortCallback:DMA 传输被中止时调用的回调
  • ErrorCode:DMA 传输过程中出现错误代码
  • StreamBaseAddress:DMA 流的基地址
  • StreamIndex:DMA 流的索引

2.4 DMA_InitTypeDef

  • Channel:指定 DMA 流使用的通道

DMA_CHANNEL_x

  • Direction:指定数据传输的方向

DMA_MEMORY_TO_MEMORY:内存到内存

DMA_MEMORY_TO_PERIPH:内存到外设

DMA_PERIPH_TO_MEMORY:外设到内存

  • PeriphInc:外设地址寄存器是否需要递增

DMA_PINC_ENABLE:启用

DMA_PINC_DISABLE:禁用

  • MemInc:内存地址寄存器是否需要递增

    DMA_MINC_ENABLE::启用

    DMA_MINC_DISABLE:禁用

  • PeriphDataAlignment:外设数据宽度

DMA_PDATAALIGN_BYTE:字节对齐 (1 字节)

DMA_PDATAALIGN_HALFWORD: 半字对齐 (2字节)

DMA_PDATAALIGN_WORD:字对齐 (4字节)

  • MemDataAlignment:内存数据宽度

DMA_MDATAALIGN_BYTE:字节对齐 (1 字节)

DMA_MDATAALIGN_HALFWORD:半字对齐 (2字节)

DMA_MDATAALIGN_WORD:字对齐 (4字节)

  • Mode:DMA 流的操作模式

DMA_NORMAL:正常模式(DMA 执行一次数据传输后会停止)

DMA_CIRCULAR:循环模式(DMA 会在数据传输完成后自动重新启动)

DMA_PFCTRL:优先控制模式(外设优先级控制)

  • Priority:DMA 流的优先级

DMA_PRIORITY_LOW:低优先级

DMA_PRIORITY_MEDIUM:中优先级

DMA_PRIORITY_HIGH:高优先级

DMA_PRIORITY_VERY_HIGH:非常高优先级

  • FIFOMode:是否使用 FIFO 模式或者直接模式

DMA_FIFOMODE_DISABLE:直接模式(数据会直接从内存传输到外设,或者反向操作)

DMA_FIFOMODE_ENABLE:DMA 流会使用 FIFO 队列来缓存数据,直到数据达到一定数量时才会传输

  • FIFOThreshold:FIFO 阈值等级

DMA_FIFO_THRESHOLD_1QUARTERFULL:四分之一满DMA 会开始数据传输

DMA_FIFO_THRESHOLD_HALFFULL:一半满DMA 会开始数据传输

DMA_FIFO_THRESHOLD_3QUARTERSFULL:三分之一满DMA 会开始数据传输

DMA_FIFO_THRESHOLD_FULL:完全满DMA 会开始数据传输

  • MemBurst:内存传输的突发模式配置

DMA_MBURST_SINGLE:单次传输模式

DMA_MBURST_INC4:递增 4 字节传输模式

DMA_MBURST_INC8:递增 8 字节传输模式

DMA_MBURST_INC16:递增 16 字节传输模式

  • PeriphBurst:外设传输的突发模式配置

DMA_PBURST_SINGLE:单次传输模式

DMA_PBURST_INC4:递增 4 字节传输模式

DMA_PBURST_INC8:递增 8 字节传输模式

DMA_PBURST_INC16:递增 16 字节传输模式

2.5 HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)

调用此函数初始化2.3结构体的配置

三、__HAL_LINKDMA

____HAL_LINKDMA(HANDLE, PERIPH, DMA_HANDLE)

将一个 DMA 句柄(DMA_HandleTypeDef)与外设(如 UART、SPI、I2C 等)的相关操作关联起来

  • HANDLE:外设句柄

  • PERIPH:外设的 DMA 相关字段

  • DMA_HANDLE__:实际的 DMA 句柄

四、中断

4.1 HAL_NVIC_SetPriority

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

设置中断的优先级

  • IRQn:中断请求号
  • PreemptPriority:抢占优先级(值越小,优先级越高)
  • SubPriority:响应优先级(值越小,优先级越高)

4.2 HAL_NVIC_EnableIRQ

HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

启用指定中断

  • IRQn:中断请求号

五、中断响应

image-20250503175203247

5.1 DMA2_Stream2_IRQHandler()

当 DMA2 的 Stream 2 发生中断时,调用 HAL_DMA_IRQHandler 来处理相关的中断事件

5.2 HAL_DMA_IRQHandler

用于处理 DMA 相关的中断事件

  • 传输完成中断:当 DMA 完成数据的传输时

HAL_DMA_TxCpltCallback():DMA 发送完成时触发的回调

HAL_DMA_RxCpltCallback():DMA 接收完成时触发的回调

  • 半传输完成中断:当 DMA 在传输数据时到达数据缓冲区的一半时

HAL_DMA_HalfTxCpltCallback():DMA 发送半传输完成时触发的回调

HAL_DMA_HalfRxCpltCallback():DMA 接收半传输完成时触发的回调

  • 传输错误中断:当 DMA 在传输过程中发生错误时

HAL_DMA_ErrorCallback():当发生 DMA 错误时触发的回调

  • 直接存储器访问总线错误:当 DMA 控制器遇到总线错误时
  • DMA Stream/Channel 中的中断源:

5.3 HAL_UART_IRQHandler

  • 数据接收完成中断:

HAL_UART_RxCpltCallback:当 UART 数据接收完成时

HAL_UART_RxHalfCpltCallback():当 UART 半接收完成时

  • 数据发送完成中断:

HAL_UART_TxCpltCallback():当 UART 数据发送完成时

HAL_UART_TxHalfCpltCallback():当 UART 半发送完成时

  • 错误中断:

HAL_UART_ErrorCallback():当 UART 发生错误时

  • 其他中断(如行结束中断等):

HAL_UART_AbortCpltCallback():当 UART 中的传输被取消时

三、发送重定向

1.my_usart.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef __MY_USART_H
#define __MY_USART_H

#include "main.h"
#include "stdarg.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "stdint.h"

#define U1_TxBuff_SIZE 1024

void print_usart1(char *format,...);

2.my_usart.c

1
2
3
4
5
6
7
8
void print_usart1(char *format,...)
{
va_list listdata;
va_start(listdata,format);
vsprintf((char *)U1_TxBuff,format,listdata);
va_end(listdata);
HAL_UART_Transmit(&huart1,(const uint8_t *)U1_TxBuff,strlen((const char*)U1_TxBuff),50);
}

1. __HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE)

检查 USART状态寄存器中特定标志位的宏

宏定义 解释
UART_FLAG_CTS 清除发送
UART_FLAG_LBD 线路中断
UART_FLAG_TXE 传输数据寄存器空
UART_FLAG_TC 传输完成
UART_FLAG_RXNE 接收数据寄存器非空
UART_FLAG_IDLE 空闲线
UART_FLAG_ORE 接收溢出错误
UART_FLAG_NE 接收噪声错误
UART_FLAG_FE 接收帧错误
UART_FLAG_PE 接收奇偶校验错误