USART通信
一、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:中断请求号
五、中断响应
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.my_usart.c
1 | void print_usart1(char *format,...) |
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 | 接收奇偶校验错误 |