登录/注册

STM32中DMA接收数据

STM32中DMA接收数据

更多

在STM32中使用DMA接收数据是一种高效的方式,能显著降低CPU负载。以下是关键步骤和注意事项(以UART接收为例):


基本步骤

  1. 配置DMA通道

    // CubeMX配置或手动初始化(以UART1_RX为例)
    DMA_HandleTypeDef hdma_usart1_rx;
    hdma_usart1_rx.Instance = DMA1_Channel5;          // 根据数据手册选择通道
    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_NORMAL;             // 普通模式(循环模式用CIRCULAR)
    hdma_usart1_rx.Init.Priority = DMA_PRIORITY_MEDIUM;
    HAL_DMA_Init(&hdma_usart1_rx);
    __HAL_LINKDMA(&huart1, hdmarx, hdma_usart1_rx); // 关联UART和DMA
  2. 配置外设(UART)

    // 使能UART的DMA接收请求
    SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR);
  3. 启动DMA接收

    uint8_t rx_buffer[100];
    HAL_UART_Receive_DMA(&huart1, rx_buffer, sizeof(rx_buffer));
  4. 处理接收完成中断

    // 在stm32fXxx_it.c中重写中断回调
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
     if (huart->Instance == USART1) {
       // 处理接收完成的数据:rx_buffer
       // 可选:重启DMA接收下一批数据
       HAL_UART_Receive_DMA(&huart1, rx_buffer, sizeof(rx_buffer));
     }
    }

高级用法

1. 循环模式(Circular Mode)

   hdma_usart1_rx.Init.Mode = DMA_CIRCULAR; // 自动循环填充缓冲区

2. 双缓冲(Double Buffer)

   uint8_t rx_buf1[50], rx_buf2[50];
   HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rx_buf1, 50); // 启动接收

关键注意事项

  1. 内存对齐
    确保缓冲区地址符合DMA要求(通常4字节对齐),可使用:

    __ALIGNED(4) uint8_t buffer[100];  // 对齐到4字节
  2. 中断配置
    启用DMA传输完成中断:

    HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
  3. 错误处理
    重写错误回调函数:

    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
     if(huart->ErrorCode & HAL_UART_ERROR_DMA) {
       // DMA传输错误处理
     }
    }
  4. 数据一致性
    使用DMA时,确保CPU访问数据前检查状态或使用内存屏障:

    __DSB(); // 数据同步屏障

调试技巧

通过合理配置DMA,可实现高速、低功耗的数据接收,适用于UART、SPI、I²C、ADC等场景。参考对应型号的《参考手册》中的DMA章节获取通道映射信息。

STM32串口中断及DMA接收常见的几个问题

STM32串口中断及DMA接收常见的几个问题

2023-10-26 16:41:12

STM32实例教程-DMA实验

在前面我们提到过 DMA,这一章我们就来学习 STM32F1 的DMA 使用。要实现的功能是:通过 K_UP 按键控制

2023-05-24 09:20:54

如何解决PWM使用的DMA通道与串口接收DMA通道撞车问题

项目做到一半,碰到个尴尬问题:PWM使用的DMA通道与串口接收的DMA通道撞车了,咋办?考虑一下,决定放弃idle中断+

2022-02-16 11:35:02

stm32串口DMA数据接收不完整问题说明

stm32串口DMA数据接收不完整问题说明最近做了一个项目需要用串口来

资料下载 其实znvm 2021-12-24 19:37:57

stm32 发送完数据后 串口继续发送_STM32之串口DMA接收不定长数据

引言在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段

资料下载 欲望都市 2021-12-24 19:17:48

STM32之串口DMA接收不定长数据

目录STM32之串口DMA接收不定长数据引言

资料下载 刘敏 2021-12-24 19:03:03

STM32 DMA串口接收不定长数据

STM32 DMA串口接收不定长数据

资料下载 孙成红 2021-12-24 18:50:10

STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

方法:一种是 :IDLE 接收空闲中断+DMA一种是: IDLE 接收空闲中断+RXNE

资料下载 张龙祥 2021-12-20 19:39:04

stm32 HAL库实现UART的不定长数据DMA接收的方法

发送接收就显得十分必要了,因为串口中断每收到一个byte的数据就会发生中断,这样会非常的消耗单片机的资源。而DMA接受一帧

2022-01-20 08:07:21

如何去实现Stm32 Uart用DMA的方式接收数据

DMA有何用途?如何去实现Stm32 Uart用DMA的方式接收

2021-12-14 07:37:47

请问STM32如何使用DMA接收串口数据

请问STM32如何使用DMA接收串口数据?

2021-12-08 07:17:10

STM32使用DMA加串口空闲中断怎么知道数据接收完毕了呢

STM32使用DMA加串口空闲中断接收数据

2021-08-13 08:01:54

DMA如何接收不定长的数据

STM32串口DMA如何接收不定长的数据呢?

2020-12-21 07:39:28

STM32串口中断 DMA接收的几点注意地方

STM32串口中断、DMA接收的几点注意地方

2020-03-04 13:57:48

STM32之串口DMA接收不定长数据

  STM32之串口DMA接收不定长数据引言  在使用

2019-09-05 16:52:29
7天热门专题 换一换
相关标签