STM32 串口DMA HAL库
时间: 2025-02-13 21:18:07 浏览: 49
### STM32 使用 HAL 庿 实现 串口 DMA 传输
#### 初始化配置
为了使能DMA用于UART通信,在初始化阶段需通过STM32CubeMX工具配置相应的USART/DMA外设。具体操作是在Pinout&Configuration界面下找到对应的USART模块,将其Mode设置为Asynchronous,并勾选Use DMA Transmit和/or Use DMA Receive选项以激活DMA功能[^3]。
#### 编程实现
下面展示了一个简单的例子,该程序实现了基于DMA的异步串口收发:
```c
#include "main.h"
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_tx;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_DMA_Init(void);
int main(void){
/* Reset of all peripherals, Initializes the Flash interface and Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init(); // 初始化DMA控制器
MX_USART1_UART_Init(); // 初始化USART
char txData[] = "Hello World via UART with DMA\r\n";
uint16_t size = sizeof(txData)-1; // 不包含字符串结束符'\0'
while(1){
// 启动DMA发送事务
HAL_UART_Transmit_DMA(&huart1,(uint8_t*)txData,size);
// 等待直到前一次DMA传输完成再启动新的传输
while(HAL_OK != HAL_UART_GetState(&huart1)){
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)==SET){
break;
}
}
HAL_Delay(1000); // 延迟一秒重复发送
}
}
// USART1 Initialization Function
static void MX_USART1_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();
}
__HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);
}
```
上述代码片段展示了如何使用`HAL_UART_Transmit_DMA()`函数来进行数据发送。对于接收部分,则通常采用回调机制处理接收到的数据帧。当DMA完成了指定数量的数据转移后会触发中断服务例程(ISR),ISR内部调用预定义好的回调函数如`HAL_UART_RxCpltCallback()`来通知应用程序层已成功接收到一批新消息[^4]。
阅读全文
相关推荐


















