Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1968176
  • 博文数量: 356
  • 博客积分: 8284
  • 博客等级: 中将
  • 技术积分: 4580
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-15 20:25
个人简介

天行健,君子以自强不息

文章分类

全部博文(356)

文章存档

2018年(1)

2016年(4)

2015年(13)

2014年(14)

2013年(2)

2012年(25)

2011年(43)

2010年(65)

2009年(189)

分类: C/C++

2015-06-13 11:48:13

程序如下:
/******************** (C) COPYRIGHT 2012               ***************************
 * 文件名  :adc.c
 * 描述    :adc应用函数库       
 * 库版本  :ST3.5.0
**********************************************************************************/
#include "bsp.h"

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)

__IO uint16_t ADC_ConvertedValue[2];
//__IO u16 ADC_ConvertedValueLocal;

                                                                   
/*
 * 函数名:ADC1_GPIO_Config
 * 描述  :使能ADC1和DMA1的时钟,初始化PC.01
 * 输入  : 无
 * 输出  :无
 * 调用  :内部调用
 */
static void ADC1_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* Enable DMA clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    /* Enable ADC1 and GPIOa clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    /* Configure PC.01  as analog input */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                //
}


/* 函数名:ADC1_Mode_Config
 * 描述  :配置ADC1的工作模式为MDA模式
 * 输入  : 无
 * 输出  :无
 * 调用  :内部调用
 */
static void ADC1_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;     //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 2;//转换的是2个通道,所以是2
    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_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    /* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
    
    /* ADC1 configuration */
    
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //独立ADC模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式,多通道,DISABLE ;      //禁止扫描模式,扫描模式用于多通道采集
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //开启连续转换模式,即不停地进行ADC转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //不使用外部触发转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;     //采集数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 2;         //2要转换的通道数目2
    ADC_Init(ADC1, &ADC_InitStructure);
    
    /*配置ADC时钟,为PCLK2的8分频,即9Hz*/
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
    /*配置ADC1的通道2为55.    5个采样周期,序列为1 */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2 , 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_3 , 2, ADC_SampleTime_55Cycles5);
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
    
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    
    /*复位校准寄存器 */   
    ADC_ResetCalibration(ADC1);
    /*等待校准寄存器复位完成 */
    while(ADC_GetResetCalibrationStatus(ADC1));
    
    /* ADC校准 */
    ADC_StartCalibration(ADC1);
    /* 等待校准完成*/
    while(ADC_GetCalibrationStatus(ADC1));
    
    /* 由于没有采用外部触发,所以使用软件触发ADC转换 */
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

/*
 * 函数名:ADC1_Init
 * 描述  :无
 * 输入  :无
 * 输出  :无
 * 调用  :外部调用
 */
void ADC1_Init(void)
{
    ADC1_GPIO_Config();
    ADC1_Mode_Config();
}

直接从ADC_ConvertedValue[2]数组中取两个通道的ad转换值即可。

参考资料:
STM32_ADC单通道与多通道_DMA学习笔记 (1).pdf


阅读(3574) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~