hal库stm32串口dma发送接收
时间: 2025-04-16 15:20:23 浏览: 24
### STM32 HAL库 串口 DMA 发送 接收 示例代码 使用教程
#### 初始化配置
为了使能DMA功能并初始化串口,在STM32CubeMX中需设置USART外设模式为异步,并勾选`Use DMA Stream`选项来激活DMA流用于传输数据。此外,还需指定具体的DMA请求映射到哪个通道上。
```c
// USARTx_DMA_Init函数定义
static void MX_USARTx_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK){
Error_Handler();
}
}
```
#### 配置DMA缓冲区
创建两个全局变量作为发送和接收的数据缓存区域:
```c
uint8_t aTxBuffer[] = "This is a test string";
uint8_t aRxBuffer[RXBUFFERSIZE];
```
#### 启动DMA传输
调用`HAL_UART_Transmit_DMA()`启动基于DMA的UART发送操作;对于接收,则可以利用`HAL_UART_Receive_DMA()`. 这些API会自动处理底层硬件寄存器配置以及触发相应的DMA事务。
```c
if(HAL_UART_Transmit_DMA(&huart1, (uint8_t*)aTxBuffer,strlen((char const*)aTxBuffer))!= HAL_OK){
/* Transfer error in transmission process */
Error_Handler();
}
/* Start receiving data over DMA */
if(HAL_UART_Receive_DMA(&huart1,(uint8_t *)aRxBuffer,RXBUFFERSIZE)!= HAL_OK){
/* Transfer error in reception process */
Error_Handler();
}
```
#### 中断回调机制
当DMA完成一次完整的读写周期后会产生中断信号通知CPU,此时可以在对应的ISR(Interrupt Service Routine)里执行必要的后续动作比如清除标志位或者更新状态机等逻辑。
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
// 处理接收到的数据...
// 继续等待下一批次的数据到来
HAL_UART_Receive_DMA(huart,aRxBuffer,RXBUFFERSIZE);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
// 完成发送后的处理...
// 如果有更多待发数据可再次发起新的DMA传输任务
}
```
以上就是使用STM32 HAL库配合DMA控制器实现高效可靠的UART通信的方法概述[^1]。
阅读全文
相关推荐


















