stm32cubemx使用dma串口数据收发
时间: 2025-02-16 22:09:36 浏览: 69
### 使用STM32CubeMX配置DMA实现UART/USART数据收发
#### 配置硬件资源
在STM32CubeMX中启动项目并选择目标微控制器型号后,进入Pinout & Configuration界面。找到并展开“Connectivity”选项卡下的USART外设模块,点击其右侧的小齿轮图标以打开参数设置窗口[^1]。
对于USART功能启用以及基本通信参数设定完成后,切换到NVIC标签页确认已勾选对应USART中断源以便处理可能发生的错误状况或状态变化事件;接着转至DMA设置部分:
- **使能DMA请求**:确保`RX DMA Request`和`TX DMA Request`被激活用于接收与发送操作。
- **指定DMA通道**:依据所使用的MCU系列不同,默认分配给定USART实例的DMA流可能会有所差异,请参照官方文档核实确切映射关系,并在此处做出适当调整以匹配实际需求场景中的优先级考量等因素[^2]。
```cpp
// USART初始化结构体定义示例代码片段
static 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 (huart1.gState == HAL_UART_STATE_RESET){
/* 控制器未初始化 */
__HAL_RCC_USART1_CLK_ENABLE(); // 开启时钟
huart1.hdmarx = &hdma_usart1_rx;
huart1.hdmatx = &hdma_usart1_tx;
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化DMA
HAL_DMA_DeInit(huart1.hdmarx);
HAL_DMA_DeInit(huart1.hdmatx);
// USART1 RX/TX DMA Stream/Channel configuration
hdma_usart1_rx.Instance = ... ; // 设置具体的DMA流号
hdma_usart1_rx.Init.Request = ... ;
...
if(HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&huart1,UART_RX_DMA_Handle,hdma_usart1_rx);
hdma_usart1_tx.Instance = ... ; // 同上针对发射端
hdma_usart1_tx.Init.Request = ... ;
...
if(HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&huart1,UART_TX_DMA_Handle,hdma_usart1_tx);
// 中断向量表位置重定位(如果需要)
NVIC_SetPriority(USART1_IRQn, 0);
NVIC_EnableIRQ(USART1_IRQn);
// 调用底层驱动完成最终初始化过程
if (HAL_UART_Init(&huart1) != HAL_OK){
Error_Handler();
}
}
}
```
上述伪代码展示了通过STM32CubeMX自动生成的部分初始化函数逻辑框架,其中包含了对DMA相关属性的具体赋值语句。
当完成了以上步骤之后,则可以在应用程序层面上调用相应的API接口来触发基于DMA机制的数据交换动作了。例如利用`HAL_UART_Transmit_DMA()` 和 `HAL_UART_Receive_DMA()` 函数分别执行非阻塞式的异步写入与读取任务。
一旦开启了USART的全局中断,在工程文件`stm32f4xx_it.c`中会自动创建名为`USART1_IRQHandler()`的服务程序入口点,负责响应来自该串行接口的各种异常情况报告或是特定条件满足后的回调通知工作流程管理[^3]。
阅读全文
相关推荐


















