STM32F103LL库串口1DMA闲时中断接收DMA发送数据例程
2025-08-26 01:53:42作者:姚月梅Lane
适用场景
该例程专为STM32F103系列微控制器设计,特别适用于需要高效串口通信的应用场景。当您需要处理大量串口数据且希望降低CPU负载时,这个例程将是理想选择。
典型应用场景包括:
- 工业自动化控制系统中的设备间通信
- 数据采集系统中的实时数据传输
- 物联网设备与云平台的数据交换
- 需要长时间稳定运行的嵌入式系统
- 对通信效率和响应速度有较高要求的应用
适配系统与环境配置要求
硬件要求
- STM32F103系列微控制器(C8T6、RCT6、VET6等型号)
- 标准串口通信接口(UART1)
- 外部晶振8MHz(HSE)或使用内部RC振荡器
- 适当的电源供应和调试接口
软件环境
- STM32CubeMX配置工具
- Keil MDK-ARM或IAR Embedded Workbench开发环境
- STM32F1xx HAL库和LL库
- 支持C语言的编译环境
- ST-Link或其他调试工具
库文件依赖
- stm32f1xx_ll_usart.h
- stm32f1xx_ll_dma.h
- stm32f1xx_ll_gpio.h
- stm32f1xx_ll_bus.h
- stm32f1xx_ll_rcc.h
资源使用教程
1. 初始化配置
首先使用STM32CubeMX进行硬件配置:
- 启用USART1,配置波特率、数据位、停止位和校验位
- 启用DMA通道,配置为循环模式或正常模式
- 配置NVIC中断优先级
- 生成初始化代码
2. DMA接收配置
// 初始化DMA接收
LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_5,
(uint32_t)&USART1->DR,
(uint32_t)rx_buffer,
LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, RX_BUFFER_SIZE);
LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
3. 闲时中断配置
// 启用闲时中断
LL_USART_EnableIT_IDLE(USART1);
LL_USART_EnableDMAReq_RX(USART1);
4. 中断服务程序
void USART1_IRQHandler(void)
{
if(LL_USART_IsActiveFlag_IDLE(USART1))
{
LL_USART_ClearFlag_IDLE(USART1);
// 处理接收完成的数据
handle_received_data();
}
}
5. DMA发送配置
// DMA发送数据
LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, data_length);
LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_4,
(uint32_t)tx_buffer,
(uint32_t)&USART1->DR,
LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);
常见问题及解决办法
1. DMA接收数据不完整
问题现象:接收到的数据长度不正确或数据丢失 解决方法:
- 检查DMA缓冲区大小是否足够
- 确认DMA配置为循环模式或适当的数据长度
- 验证波特率设置是否正确
2. 闲时中断不触发
问题现象:数据接收完成后没有触发IDLE中断 解决方法:
- 确认USART的IDLE中断已使能
- 检查NVIC中断优先级配置
- 验证时钟配置是否正确
3. DMA发送失败
问题现象:数据发送不出去或发送异常 解决方法:
- 检查DMA通道配置是否正确
- 确认发送缓冲区地址和数据长度
- 验证USART的DMA发送请求是否使能
4. 数据覆盖问题
问题现象:新数据覆盖了尚未处理的数据 解决方法:
- 使用双缓冲区机制
- 增加数据处理的及时性
- 合理设置DMA传输完成中断
5. 系统稳定性问题
问题现象:长时间运行后出现通信异常 解决方法:
- 添加超时检测机制
- 实现错误重传功能
- 定期检查DMA和USART状态
性能优化建议
- 内存管理:合理分配DMA缓冲区大小,避免内存浪费
- 中断优先级:合理设置NVIC中断优先级,确保实时性
- 功耗优化:在空闲时段降低系统时钟频率
- 错误处理:完善错误检测和恢复机制
- 数据校验:添加CRC校验或其他数据完整性检查
该例程提供了稳定高效的串口通信解决方案,通过DMA和闲时中断的巧妙结合,大幅降低了CPU负载,提高了系统整体性能。适用于各种对通信效率和稳定性有较高要求的嵌入式应用场景。