首页
/ STM32F103LL库串口1DMA闲时中断接收DMA发送数据例程

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状态

性能优化建议

  1. 内存管理:合理分配DMA缓冲区大小,避免内存浪费
  2. 中断优先级:合理设置NVIC中断优先级,确保实时性
  3. 功耗优化:在空闲时段降低系统时钟频率
  4. 错误处理:完善错误检测和恢复机制
  5. 数据校验:添加CRC校验或其他数据完整性检查

该例程提供了稳定高效的串口通信解决方案,通过DMA和闲时中断的巧妙结合,大幅降低了CPU负载,提高了系统整体性能。适用于各种对通信效率和稳定性有较高要求的嵌入式应用场景。

热门内容推荐

最新内容推荐