STM32 ADC+DMA(标准库)

本文详细介绍了如何在STM32芯片上利用CubeMX工具和MDK5编译器实现ADC与DMA的结合使用,通过具体的代码示例展示了ADC通道配置、DMA初始化、中断处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 编译工具:MDK5
  • 代码生成工具:CubeMX(veision5.6.1)
  • 芯片:STM32072CBT6

直接上代码

ADC.h文件
#ifndef _adc_h
#define _adc_h

#include "sys.h"

#define LEAKAGE_0  		    ADC_Channel_0
#define LEAKAGE_1  		    ADC_Channel_1 
#define LEAKAGE_2  		    ADC_Channel_2 
#define LEAKAGE_3  		    ADC_Channel_3 
#define LEAKAGE_4  		    ADC_Channel_4 
#define LEAKAGE_5  		    ADC_Channel_5 
#define LEAKAGE_6  		    ADC_Channel_6 

void ADC1_DMA_Init(void);

#endif


ADC.c文件
#include "adc.h"

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)
uint16_t adcvalue[7];

void ADC1_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Enable DMA clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_AHBPeriph_GPIOA , ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5 | \
                                  GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
}


void ADC1_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;	 //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&adcvalue;//内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 7;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	//半字(16位)
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;		//循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
    
    /* ADC1 configuration */
    ADC_StructInit(&ADC_InitStructure); 
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward ; 	 
    ADC_Init(ADC1, &ADC_InitStructure);

    /*配置ADC时钟,为PCLK2的2分频,即24Hz*/
    RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div2);
    ADC_ChannelConfig(ADC1, LEAKAGE_0, ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_1,ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_2,ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_3,ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_4,ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_5,ADC_SampleTime_55_5Cycles);
    ADC_ChannelConfig(ADC1, LEAKAGE_6,ADC_SampleTime_55_5Cycles);


    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
    
    NVIC_Init(&NVIC_InitStructure);
    DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);

     ADC_GetCalibrationFactor(ADC1);                     //校准ADC  
     /* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
 
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));  
    
    ADC_StartOfConversion(ADC1);
}


void DMA1_Channel1_IRQHandler(){
  
  if(DMA_GetFlagStatus(DMA1_IT_TC1)!=RESET){
    DMA_ClearFlag(DMA1_IT_TC1);
    ADC_StartOfConversion(ADC1);
  }

}

void ADC1_DMA_Init(void)
{
    ADC1_GPIO_Config();
    ADC1_Mode_Config();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值