登录/注册

STM32F103 ADC2 DMA

STM32F103 ADC2 DMA

更多

在STM32F103系列中,ADC2无法直接使用DMA进行数据传输,因为其DMA通道是专属于ADC1的。但通过以下方法可以实现ADC2的DMA传输:


解决方案:双ADC模式 + DMA

STM32F103支持双ADC模式,允许ADC1和ADC2协同工作,并利用ADC1的DMA通道同时传输两个ADC的数据。


配置步骤

  1. 初始化ADC1和ADC2

    • 将ADC1和ADC2设置为双ADC模式(如同步规则模式交替模式)。
    • 配置ADC的时钟、采样时间、触发源(例如定时器触发或软件触发)。
  2. 配置DMA

    • 使用DMA1通道1(绑定到ADC1)。
    • 设置DMA传输方向为外设到内存(ADC数据寄存器 → 内存数组)。
    • 配置数据长度和循环模式。
  3. 启用双ADC同步

    • 启动ADC1和ADC2的同步转换。
    • 使能DMA传输。

示例代码(标准外设库)

// 定义存储ADC数据的数组(ADC1和ADC2的数据交替存储)
uint16_t adc_data[2];

void ADC_DMA_Config(void) {
    // 1. 初始化ADC1和ADC2为双ADC同步模式
    ADC_InitTypeDef ADC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;

    // 启用ADC1、ADC2和DMA的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    // 配置DMA
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; // ADC1数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)adc_data;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 2; // 传输两个ADC的数据
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_Cmd(DMA1_Channel1, ENABLE);

    // 配置ADC1(主ADC)
    ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; // 双ADC同步规则模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.NbrOfConversion = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 配置ADC2(从ADC)
    ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
    ADC_Init(ADC2, &ADC_InitStructure);

    // 配置ADC通道(例如PA1和PA2)
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);

    // 使能ADC的DMA请求
    ADC_DMACmd(ADC1, ENABLE);

    // 校准并启动ADC
    ADC_Cmd(ADC1, ENABLE);
    ADC_Cmd(ADC2, ENABLE);
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));

    // 启动转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

关键注意事项

  1. 数据存储顺序:在双ADC模式下,ADC1和ADC2的数据会交替存储在内存数组中(如adc_data[0]为ADC1数据,adc_data[1]为ADC2数据)。
  2. 触发方式:若使用外部触发(如定时器),需配置ADC_ExternalTrigConv并启用相应触发源。
  3. 中断处理:可启用DMA传输完成中断,在中断中处理数据。
  4. 资源冲突:避免在双ADC模式下同时使用ADC1的独立模式。

通过上述方法,可间接实现ADC2的DMA传输。如需单独使用ADC2,则需通过中断手动读取数据,但效率较低。

stm32f302和stm32f103ADC区别是什么?

请问stm32f302和stm32f103的ADC除了stm32f103

2024-05-15 08:03:36

学习STM32F103ADC功能

三勺最近在学习STM32F103的ADC功能,居然连最简单的独立模式的单通道的电压采集都不能实现,这就不能忍了,这是对智商的侮辱。

2023-10-24 16:06:03

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

GD32F103STM32F103的区别 2021.6.2

GD32F103和STM32F103区别介绍关键词Key words:GD32F103、

资料下载 李杰 2021-12-08 11:06:03

STM32F103使用TIM DMA DAC实现播放WAV音乐

STM32F103使用TIM DAC DMA播放wave音乐

资料下载 佚名 2021-11-24 14:51:03

STM32F103RC DMA ADC 温度,电压采样

STM32F103RC DMA ADC 温度,电压采样#include "s

资料下载 刘满贵 2021-11-23 17:51:19

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

CH32FV2x的ADC2为什么不能单独通过DMA传输数据?

刚刚看了《CH32FV2x_V3xRM.pdf》,发现ADC2不能单独通过DMA传输数据,还是像

2022-05-25 07:45:16

如何对STM32F103 ADC寄存器进行配置

STM32F103系列有几个ADC?STM32F103系列的ADC主要特

2021-09-27 09:08:10

STM32F103ADC配置 精选资料推荐

STM32F103ADC配置(ADC1和ADC2)STM32F103拥有

2021-08-24 07:53:53

STM32F103ADC简介

目录项目背景DMA简介DMA请求DMA通道DMA仲裁

2021-08-13 07:21:16

STM32f103系列有3个ADC

30.1 ADC 简介STM32f103 系列有 3 个 ADC,精度为 12 位,每个

2021-08-12 06:55:59

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

STM32F1的ADC2如何使用DMA功能 USART过载错误Overrun error

STM32F1的ADC2如何使用DMA功能,USART过载错误Overrun error

2020-03-14 14:42:01

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