HAL库的串口+DMA空闲中断
时间: 2025-06-28 17:18:47 浏览: 16
### STM32F103X HAL库串口DMA空闲中断使用教程
#### 启动DMA空闲中断配置
为了实现STM32F103X系列微控制器通过HAL库利用串口和DMA配合工作并响应空闲线状态,在`main.c`文件中的适当位置加入如下初始化语句:
```c
/* USER CODE BEGIN 2 */
// 启动串口DMA空闲中断接收
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, comm3.Rx_temp, MAX_REC_LENGTH); // 配置UART外设对象,指定缓冲区地址以及最大长度[^1]
// 关闭不需要的DMA半满中断以减少干扰
__HAL_DMA_DISABLE_IT(&hdma_usart3_rx, DMA_IT_HT);
/* USER CODE END 2 */
```
上述代码片段展示了如何设置USART3接口进入DMA模式下的空闲检测功能,并指定了用于存储接收到的数据的目标内存区域。
#### 处理回调函数
当发生空闲事件时,程序会自动调用预定义好的回调函数来处理数据。可以在项目源码里添加自定义逻辑到这些特定的回调函数内完成进一步操作:
```c
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance== USART3){
// 当前实例匹配则执行相应动作
// 可在此处对接收完毕后的数据做后续解析或其他业务流程
// 清除标志位准备下一次接收
__HAL_UART_CLEAR_IDLEFLAG(huart);
// 如果需要继续监听新的消息,则重新激活该特性
HAL_UARTEx_ReceiveToIdle_DMA(huart, comm3.Rx_temp, MAX_REC_LENGTH);
}
}
```
此部分实现了每当检测到空闲信号后触发的动作序列,包括但不限于清除IDLE标记以便下次正常运作、再次开启相同的DMA传输过程等待新输入到来等措施。
#### 初始化结构体声明
确保全局变量已正确定义好用来保存传入的信息流:
```c
extern UART_HandleTypeDef huart3;
uint8_t RxBuffer[MAX_REC_LENGTH]; // 定义足够大小的数组容纳预期的最大帧尺寸
struct {
uint8_t* Rx_temp;
}comm3;
int main(void)
{
...
comm3.Rx_temp = &RxBuffer[0];
...
}
```
以上就是基于STM32 HAL库框架下实施串口加DMA方式读取外部字符流的同时支持空闲中断机制的一个简单指南及配套示范编码。
阅读全文
相关推荐


















