登录/注册

STM32串口接收大量数据

STM32串口接收大量数据

更多

在STM32中处理大量串口数据时,需结合DMA(直接内存访问)和中断以提高效率并避免数据丢失。以下是关键步骤和示例代码:

核心方案

  1. 使用DMA模式

    • 直接将数据从串口DR寄存器搬运到内存,解放CPU
    • 配置为循环模式(Circular Mode)持续接收
  2. 双缓冲区机制

    • 使用两个缓冲区交替接收(半传输中断+完成中断)
    • 防止数据处理时的覆盖冲突
  3. 中断管理

    • 利用DMA半传输中断(HT)和传输完成中断(TC
    • 在中断中切换缓冲区并通知主程序处理

实现步骤(以HAL库为例)

1. 初始化配置

// 定义缓冲区
#define BUF_SIZE 1024
uint8_t RxBuf[2][BUF_SIZE];  // 双缓冲区
volatile uint8_t buf_index = 0; // 当前缓冲区索引

// 串口和DMA初始化(以UART1为例)
void UART_Init(void) {
  // 使能UART1和DMA时钟
  __HAL_RCC_USART1_CLK_ENABLE();
  __HAL_RCC_DMA2_CLK_ENABLE();

  // 配置UART
  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_RX;
  HAL_UART_Init(&huart1);

  // 配置DMA
  hdma_usart1_rx.Instance = DMA2_Stream2;
  hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4;
  hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
  hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  hdma_usart1_rx.Init.Mode = DMA_CIRCULAR;       // 循环模式
  hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;
  HAL_DMA_Init(&hdma_usart1_rx);

  // 绑定DMA到UART
  __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx);

  // 开启DMA接收
  HAL_UART_Receive_DMA(&huart1, RxBuf[0], 2 * BUF_SIZE); // 整体作为循环缓冲区
}

2. 中断处理(stm32f4xx_it.c)

// DMA中断回调
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {
  buf_index = 0;  // 前半段完成 -> 缓冲区0可处理
  // 通知主程序处理数据(如置标志位)
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  buf_index = 1;  // 后半段完成 -> 缓冲区1可处理
  // 通知主程序处理数据
}

3. 主程序处理

volatile uint8_t data_ready = 0;

int main(void) {
  HAL_Init();
  UART_Init();

  while (1) {
    if (data_ready) {
      uint8_t *cur_buf = RxBuf[buf_index];

      // 处理当前缓冲区数据(示例:回传数据)
      HAL_UART_Transmit(&huart1, cur_buf, BUF_SIZE, 1000);

      data_ready = 0; // 清除标志
    }
    // 其他任务...
  }
}

关键优化点

  1. 硬件流控制(可选)

    • 若波特率 > 500kbps,启用RTS/CTS硬件流控防止丢失数据
  2. 内存管理

    • 缓冲区使用32字节对齐:__attribute__((aligned(32))) 提升DMA效率
    • 开启D-Cache时注意缓存一致性(使用SCB_CleanDCache_by_Addr
  3. 错误处理

    • 监控DMA错误中断:
      void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
      if(huart->ErrorCode & HAL_UART_ERROR_DMA) {
      // 重新初始化DMA
      HAL_UART_DMAStop(huart);
      HAL_UART_Receive_DMA(huart, RxBuf[0], 2*BUF_SIZE);
      }
      }
  4. 数据分包协议

    • 在应用层添加帧头/帧尾校验(如0xAA开头+CRC32结尾)
    • 示例解析逻辑:
      void ProcessData(uint8_t* buf) {
      for(int i=0; i<BUF_SIZE; i++){
      if(Found_Header(buf[i])){
       // 提取完整帧并校验
      }
      }
      }

? 注意事项

  • 中断处理函数中避免耗时操作
  • 使用volatile声明缓冲区索引
  • 高波特率(>1Mbps)时优先选用高速串口(如USART3)
  • 双缓冲区总大小应大于单次数据包最大长度的2倍

通过此方案,实测在STM32F4系列上可稳定接收10MB/s数据流(115.2kbps时CPU占用率<2%)。实际开发需根据具体型号调整时钟和DMA通道配置。

STM32串口中断接收不定长报文介绍

本项目中,需要使用STM32的USART6串口与FPGA板(下位机)通信,需要发送和接收

2023-10-26 11:01:55

STM32串口发送数据接收数据方式总结

STM32串口发送数据和接收

2023-09-19 09:14:52

一个严谨的STM32串口DMA发送&amp;接收(1.5Mbps波特率)机制

一个严谨的STM32串口DMA发送&接收(1.5Mbps波特率)机制

2023-09-18 10:58:44

STM32串口1通讯实验程序下载

STM32串口1通讯实验程序下载

资料下载 郑兵 2021-12-30 10:34:29

stm32串口

DMA发送缓存区bsp_usart.cbsp_usart.hisr.c基于stm32f103zet6串口发送使用DMA发送大致说明USART_Rx_Sbuffer二维数组 ->

资料下载 h1654155957.9921 2021-12-24 18:55:26

stm32串口代码详解

stm32串口

资料下载 佚名 2021-12-24 18:38:26

STM32串口接收不定长数据的程序免费下载

本文档的主要内容详细介绍的是STM32串口接收不定长数据的程序免费下载。

资料下载 如梦之梦1 2020-08-26 08:00:00

ZigBee CC2530串口数据接收处理机制详细资料讲解

本文档的主要内容详细介绍的是ZigBee CC2530串口的数据接收处理机制详细资料讲解。

资料下载 李鸿洋 2019-08-01 17:34:00

STM32串口发送数据接收数据浅析

STM32串口发送数据最直接的方式是什么呢?STM32

2022-02-18 06:09:52

STM32串口接收数据的步骤教程是怎样的

STM32串口接收数据的步骤教程是怎样的

2021-12-13 07:31:50

STM32串口是如何去实现数据发送与接收

什么是串口复位呢?STM32串口是如何去实现数据发送与

2021-12-10 06:16:42

如何解决STM32串口接收数据卡死的问题?

如何解决STM32串口接收数据卡死的问题?

2021-12-09 06:25:15

STM32串口接收不定长数据的实现方法

STM32串口接收不定长数据的实现方法

2021-12-09 06:17:45

STM32串口发送数据接收数据的方式有哪些?

STM32串口发送数据和接收

2021-12-02 07:15:02

STM32串口发送数据接收数据方式

STM32串口发送数据和接收

2021-01-25 06:54:03
7天热门专题 换一换
相关标签