登录/注册

STM32 DMA ADC 双通道

STM32 DMA ADC 双通道

更多

在STM32中使用DMA实现双通道ADC采样,需要配置ADC的多通道扫描模式,并通过DMA自动搬运转换结果。以下是关键步骤和注意事项:


1. 基本配置思路


2. 配置步骤(以STM32F4/HAL库为例)

2.1 ADC初始化

ADC_HandleTypeDef hadc;
DMA_HandleTypeDef hdma_adc;

void ADC_Init(void) {
  hadc.Instance = ADC1; // 选择ADC实例
  hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // ADC时钟分频
  hadc.Init.Resolution = ADC_RESOLUTION_12B; // 12位分辨率
  hadc.Init.ScanConvMode = ENABLE; // 启用扫描模式(多通道必需)
  hadc.Init.ContinuousConvMode = ENABLE; // 连续转换
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
  HAL_ADC_Init(&hadc);

  // 配置ADC通道(例如通道0和通道1)
  ADC_ChannelConfTypeDef sConfig;
  sConfig.Channel = ADC_CHANNEL_0; // 通道0
  sConfig.Rank = 1; // 转换顺序1
  sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES;
  HAL_ADC_ConfigChannel(&hadc, &sConfig);

  sConfig.Channel = ADC_CHANNEL_1; // 通道1
  sConfig.Rank = 2; // 转换顺序2
  HAL_ADC_ConfigChannel(&hadc, &sConfig);
}

2.2 DMA初始化

void DMA_Init(void) {
  __HAL_RCC_DMA2_CLK_ENABLE(); // 启用DMA2时钟(ADC1通常关联DMA2)

  hdma_adc.Instance = DMA2_Stream0; // 根据具体型号选择Stream
  hdma_adc.Init.Channel = DMA_CHANNEL_0; // 通道与ADC关联
  hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; // 外设→内存
  hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; // 外设地址固定
  hdma_adc.Init.MemInc = DMA_MINC_ENABLE; // 内存地址自增
  hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // 外设数据宽度:半字(16位)
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  hdma_adc.Init.Mode = DMA_CIRCULAR; // 循环模式
  hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
  HAL_DMA_Init(&hdma_adc);

  // 关联ADC和DMA
  __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc);
}

2.3 启动ADC和DMA

// 定义存储ADC数据的数组(双通道需为2的倍数)
uint16_t adc_buffer[2] = {0};

void Start_ADC_DMA(void) {
  // 启动DMA传输,数据自动存入adc_buffer
  HAL_ADC_Start_DMA(&hadc, (uint32_t*)adc_buffer, 2); // 第三个参数是数据长度
}

3. 数据读取


4. 注意事项

  1. 通道顺序Rank值决定转换顺序,确保与DMA缓冲区顺序一致。
  2. DMA中断:如需处理数据,可启用DMA传输完成中断(HAL_DMA_Start_IT)。
  3. 采样时间:根据信号阻抗调整SamplingTime(如高频信号需更短采样时间)。
  4. 电压基准:确保参考电压(VREF+、VREF-)正确连接。
  5. 数据对齐ADC_DATAALIGN_RIGHT时,12位数据右对齐,读取时无需额外处理。

5. 验证方法

通过以上配置,双通道ADC数据会被DMA自动更新到数组,无需CPU干预,适用于实时采集场景。

ESP32是否支持双通道ADC_DMA

在IDF里看到ESP32支持ADC_DMA了, 1,是否支持双通道ADC_DMA, 2,以后能支持DAC_

2024-06-19 08:11:44

ESP32是否支持双通道ADC_DMA

在IDF里看到ESP32支持ADC_DMA了,1,是否支持双通道ADC_DMA,2,以后能支持DAC_

2023-02-16 08:16:01

STM32G0开发笔记:多通道ADCDMA的使用

使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为多通道ADC与

2023-01-17 10:41:03

stm32g030多路adc DMA采集程序

stm32g030_多路adc_DMA采集程序

资料下载 过往5 2023-06-19 09:43:09

STM32F1 ADCDMA的简单理解

本文主要讲解stm32f1中ADC和DMA的使用,在学习中参考了多篇文章,感谢前辈的付出。

资料下载 佚名 2021-12-27 19:09:32

stm32 定时器触发ADC通道采样+DMA提取数据

stm32g0 定时器触发ADC多通道采样+DMA提取数据

资料下载 佚名 2021-12-16 16:56:32

STM32ADC(直接采集、双通道DMA采集) Day6

转换器(ADC)来实现的。板子上所使用的两个电位器,接的是PB0、PB1,也就是通道8和通道9。二、单

资料下载 李伟 2021-12-05 21:06:08

STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...

STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样

资料下载 王利祥 2021-12-01 18:06:12

STM32CUBEIDE(10)----ADCDMA模式下扫描多个通道

本章STM32CUBEMX配置STM32F103的ADC在DMA模式扫描

2022-11-30 09:54:29

请问CH582的ADC DMA通道采样如何配置?

我们看到ADC单通道DMA配置如下:但是我们需求是两个通道的

2022-07-26 07:13:01

通道ADC/双通道DMA采集的知识点汇总,绝对实用

通道ADC/双通道DMA采集的知识点汇总,绝对实用

2022-02-09 07:02:58

STM32通道DMAADC采样 精选资料推荐

title: STM32多通道DMA—ADC采样tags:

2021-08-04 07:19:31

关于ADC通道DMA配置的顺序

我所选用的芯片是STM32F030C6,采用官方STM32CubeMX配置ADC多通道

2021-08-04 06:10:13

STM32F10x_ ADC通道DMA连续转换(3通道、软件单次触发)

STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)

2020-03-25 13:57:53

STM32ADC1采集多条通道 可以不使用DMA功能吗?

STM32的ADC1采集多条通道,可以不使用DMA功能吗?

2020-03-14 14:46:08

7天热门专题 换一换
相关标签