STM32 HAL库串口+DMA空闲中断
时间: 2025-02-08 20:06:13 浏览: 72
### STM32 HAL库实现串口DMA空闲中断
#### 1. 初始化配置
为了使能STM32的串口通过DMA和空闲中断来接收不定长度的数据,在初始化阶段需完成如下操作:
- 设置RCC模块,调整时钟频率并设定下载模式[^1]。
对于具体的硬件平台如`stm32f103rct6`而言,还需要特别注意一些细节上的配置项。比如要确保开启了SWD调试接口以及外接晶振作为系统的时基源;针对各个使用的USART端口(例如USART1, USART2等),应指定合适的波特率参数,并激活相应的DMA通道用于数据传输支持[^2]。
```c
// RCC与时钟配置
__HAL_RCC_USARTx_CLK_ENABLE(); // 替换为实际使用的USART编号
__HAL_RCC_DMAx_CLK_ENABLE();
// UART初始化结构体定义
UART_HandleTypeDef huart;
huart.Instance = USARTx; // 使用的具体USART实例
huart.Init.BaudRate = 9600;
huart.Init.WordLength = UART_WORDLENGTH_8B;
huart.Init.StopBits = UART_STOPBITS_1;
huart.Init.Parity = UART_PARITY_NONE;
huart.Init.Mode = UART_MODE_TX_RX;
huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart) != HAL_OK){
Error_Handler();
}
```
#### 2. DMA与空闲中断设置
接下来就是配置DMA控制器以准备接受来自串口的数据流,并注册回调函数处理当检测到线路处于低电平状态超过一定时间后的事件——即所谓的“空闲线”条件触发的动作。
```c
// 配置DMA请求映射至对应的USART RXNE标志位上
__HAL_LINKDMA(&huart, hdmarx, DmaRxHandle);
// 启用IDLE线检测功能及其关联的全局中断服务程序
__HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE);
NVIC_SetPriority(USARTx_IRQn, 0); // 调整优先级
NVIC_EnableIRQ(USARTx_IRQn);
// 中断服务例程(ISR)
void USARTx_IRQHandler(void){
/* 检查是否为空闲线中断 */
if (__HAL_UART_GET_FLAG(&huart, UART_FLAG_IDLE)){
__HAL_UART_CLEAR_IDLEFLAG(&huart);
// 停止当前正在进行中的DMA事务
HAL_DMA_Abort(huart.hdmarx);
// 处理已接收到的数据...
// 准备下一轮接收过程
HAL_UART_Receive_DMA(&huart, aRxBuffer, BUFFER_SIZE);
}
}
// 注册回调函数以便于在每次DMA传输完成后得到通知
static void MX_USARTx_UART_Init(UART_HandleTypeDef* huart){
...
huart->hdmarx->XferCpltCallback = UART_DMARxCplt;
// 开始监听新的传入消息
HAL_UART_Receive_DMA(huart, aRxBuffer, BUFFER_SIZE);
}
// 当前缓冲区满载之后调用此方法
void UART_DMARxCplt(DMA_HandleTypeDef *hdma){
// 更新应用程序逻辑的状态机或者其他必要的动作
// 继续等待下一个分组的到来
HAL_UART_Receive_DMA(huart, aRxBuffer, BUFFER_SIZE);
}
```
上述代码片段展示了如何利用STM32 HAL库构建起一套完整的机制去捕捉任意大小的消息帧,并且能够及时响应通信链路上发生的任何变化。这不仅提高了效率还简化了编程模型的设计复杂度。
阅读全文
相关推荐


















