zoukankan      html  css  js  c++  java
  • STM32F407 ADC DMA 采样实验

    转载:http://home.eeworld.com.cn/my/space-uid-361439-blogid-239703.html

    STM32F407ADC采样实验

    热度 1已有 5472 次阅读2014-10-8 18:30 |个人分类:STM32F4XX/1XX/2XX/3XX/stm8s

        最近公司又做了一款407的样板,正好需要用到407的ADC功能,需要用PC.2来检测RFID芯片的射频电源功率,首先看了下407的数据手册

      
    可以配置到ADC1/2/3任何一个控制器的信道12上面.我打算将PC.2映射到ADC3上面和使用DMA功能,又看了下DMA的请求映射表,ADC3使用的DMA2的流0信道2

    .............................................................................................

    编程思路:

    首先将DMA和IO以及ADC的时钟使能,其次将相应的IO配置成输入模式,最后配置DMA和ADC

    注意

    /*定义ADC3的数据寄存器地址,DMA功能要用到外设的数据地址
     *ADC3的数据地址为外设基地址+偏移地址,基地址在RM0090 Reference
     *manual(参考手册)的地址映射表里,为0x40012200,ADC_DR
     *偏移地址为0x4C,故实际地址为0x40012200+0x4C = 0x4001224C */
    #define ADC3_DR_Address   ((uint32_t)0x4001224C)

    代码详见:

    void Adc3_Init(void)

    {

    /* Enable peripheral clocks ------------------------------------------------*/

    /* Enable DMA1 clock */ 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);

                   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

    GPIO_Configuration();

    DMA_Configuration();

    }

    void DMA_Configuration(void)

    {

    ADC_InitTypeDef ADC_InitStructure;

      DMA_InitTypeDef DMA_InitStructure;

    ADC_CommonInitTypeDef ADC_CommonInitStructure;

      /* DMA2 Stream0 channel0 configuration **************************************/

      DMA_InitStructure.DMA_Channel = DMA_Channel_2;  

      DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_Address;

      DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;

      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;

      DMA_InitStructure.DMA_BufferSize = 1;

      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;

      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_FIFOMode = DMA_FIFOMode_Disable;         

      DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

      DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

      DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

      DMA_Init(DMA2_Stream0, &DMA_InitStructure);

      DMA_Cmd(DMA2_Stream0, ENABLE);

      /* ADC Common Init **********************************************************/

      ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;

      ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;

      ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;

      ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

      ADC_CommonInit(&ADC_CommonInitStructure);

      /* ADC3 Init ****************************************************************/

      ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

      ADC_InitStructure.ADC_ScanConvMode = DISABLE;         // PS :  在多通道 2个通道以上 该选项应该使能

      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

      ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;

      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

      ADC_InitStructure.ADC_NbrOfConversion = 1;

      ADC_Init(ADC3, &ADC_InitStructure);

      /* ADC3 regular channel12 configuration *************************************/

      ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);

     /* Enable DMA request after last transfer (Single-ADC mode) */

      ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

      /* Enable ADC3 DMA */

      ADC_DMACmd(ADC3, ENABLE);

      /* Enable ADC3 */

      ADC_Cmd(ADC3, ENABLE);

    /* Start ADC3 Software Conversion */ 

      ADC_SoftwareStartConv(ADC3);   //如果不是外部触发则必须软件开始转换

    }

    /**

      * @brief  Configures the different GPIO ports.

      * @param  None

      * @retval None

      */

    void GPIO_Configuration(void)

    {

      GPIO_InitTypeDef GPIO_InitStructure;

      /* Configure PC.2 (ADC Channel2) PC.1 (ADC Channel1) as analog input -------------------------*/

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;

      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

      GPIO_Init(GPIOC, &GPIO_InitStructure);

    }

    PS:   以上程序有错误:  在配置DMA的时候需要先使能DMA时钟

  • 相关阅读:
    BZOJ2734 [HNOI2012]集合选数
    BZOJ2288:[POJ Challenge]生日礼物
    浅谈堆
    BZOJ1150:[CTSC2007]数据备份
    POJ2442:Sequence
    POJ1442:Black Box
    POJ3784:Running Median
    洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板
    BZOJ1345:[Baltic2007]序列问题
    浅谈栈
  • 原文地址:https://www.cnblogs.com/ransn/p/5758081.html
Copyright © 2011-2022 走看看