stm32HAL库dma串口接收数据
时间: 2025-05-18 07:12:45 浏览: 29
### STM32 HAL库通过DMA实现UART/USART串口数据接收
#### 配置教程
为了使用STM32 HAL库中的DMA功能来实现UART/USART的数据接收,需要完成硬件和软件两方面的配置。
##### 硬件初始化
在CubeMX工具中设置如下参数:
- 启用相应的UART外设(如`USART2`),并将其模式设置为异步通信。
- 将UART的发送引脚(TX)和接收引脚(RX)映射到目标GPIO端口上。
- 在DMA选项下启用UART RX通道,并分配合适的DMA流[^1]。
##### 软件初始化
编写代码时需定义缓冲区大小以及回调函数处理接收到的数据。以下是具体步骤:
1. **声明全局变量**
定义用于存储接收到数据的缓存数组 `rx_buffer[]` 和其尺寸常量 `BUFFER_SIZE`。
2. **调用HAL_UART_Receive_DMA() API**
初始化完成后,在主程序里启动DMA传输过程,例如下面这句命令会开启基于DMA方式下的连续读取操作直到填满指定长度为止:
```c
HAL_UART_Receive_DMA(&huart2, (uint8_t *)rx_buffer, BUFFER_SIZE);
```
3. **中断服务例程(ISR)与回调机制**
当新消息到达触发事件后进入ISR内部执行相应动作;或者采用更灵活的方式——注册自定义回调函数以便于后续解析逻辑分离出来单独维护管理。
#### 示例代码
以下是一个完整的示例项目框架展示如何正确运用上述理论构建实际应用环境:
```c
#include "stm32f4xx_hal.h"
#define BUFFER_SIZE 64
uint8_t rx_buffer[BUFFER_SIZE];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void){
HAL_Init();
SystemClock_Config();
/* Initialize peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
// Start DMA reception on USART2 peripheral.
HAL_UART_Receive_DMA(&huart2,(uint8_t*)rx_buffer,BUFFER_SIZE);
while(1){ }
}
// Callback function to handle received data when transfer complete event occurs.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle){
if(UartHandle->Instance==USART2){
// Process the received buffer here...
// Restart another cycle of receiving after processing current one finished.
__HAL_LOCK(UartHandle);
HAL_UART_Receive_DMA(UartHandle,(uint8_t*)rx_buffer,BUFFER_SIZE);
__HAL_UNLOCK(UartHandle);
}
}
```
#### 注意事项
确保每次重新开始新的DMA事务之前都要加锁解锁保护措施以防止多线程竞争条件引发异常行为。
---
阅读全文
相关推荐


















