2016-12-08 26 views
0

Я пытаюсь настроить ADC1 и запустить его. Использование STM Периферийные примеры для ADC3 с DMA. В примере я вижу изменения в ADC3ConvertedValue. Вот пример рабочего кода:STM32f4 ADC1 Конфигурация Dma не работает

#include "stm32f4_discovery.h" 
    #include <stdio.h> 

    #define ADC3_DR_ADDRESS  ((uint32_t)0x4001224C) 

    __IO uint16_t ADC3ConvertedValue = 0; 
    __IO uint32_t ADC3ConvertedVoltage = 0; 

    void ADC3_CH12_DMA_Config(void); 


    int main(void) 
    { 

     ADC3_CH12_DMA_Config(); 

     ADC_SoftwareStartConv(ADC3); 

     while (1) 
     { 
     /* convert the ADC value (from 0 to 0xFFF) to a voltage value (from 0V to  3.3V)*/ 
     ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF; 
    } 
} 


    void ADC3_CH12_DMA_Config(void) 
    { 
     ADC_InitTypeDef  ADC_InitStructure; 
     ADC_CommonInitTypeDef ADC_CommonInitStructure; 
     DMA_InitTypeDef  DMA_InitStructure; 
     GPIO_InitTypeDef  GPIO_InitStructure; 


     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE); 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); 

     /* 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)&ADC3ConvertedValue; 
     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); 

    /* Configure ADC3 Channel12 pin as analog input ******************************/ 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
     GPIO_Init(GPIOC, &GPIO_InitStructure); 

     /* 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; 
     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); 
    } 

Вот мой код с конфигурацией АЦП1:

/** 
    ****************************************************************************** 
    * @file ADC1_DMA/main.c 

    /* Includes ------------------------------------------------------------------*/ 
    #include "stm32f4_discovery.h" 
    #include <stdio.h> 

    #define ADC1_DR_ADDRESS  ((uint32_t)0x4001204C) 

    __IO uint16_t ADC1ConvertedValue = 0; 
    __IO uint32_t ADC1ConvertedVoltage = 0; 

    void ADC1_CH12_DMA_Config(void); 


    int main(void) 
    { 

     ADC1_CH12_DMA_Config(); 

     ADC_SoftwareStartConv(ADC1); 

     while (1) 
     { 
     /* convert the ADC value (from 0 to 0xFFF) to a voltage value (from 0V to 3.3V)*/ 
     ADC1ConvertedVoltage = ADC1ConvertedValue *3300/0xFFF; 
     } 
    } 

    void ADC1_CH12_DMA_Config(void) 
    { 
     ADC_InitTypeDef  ADC_InitStructure; 
     ADC_CommonInitTypeDef ADC_CommonInitStructure; 
     DMA_InitTypeDef  DMA_InitStructure; 
     GPIO_InitTypeDef  GPIO_InitStructure; 

     /* Enable ADC1, DMA2 and GPIO clocks ****************************************/ 
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE); 
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 

     /* DMA2 Stream0 channel0 configuration **************************************/ 
     DMA_InitStructure.DMA_Channel = DMA_Channel_2; 
     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; 
     DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue; 
     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); 

     /* Configure ADC1 Channel12 pin as analog input ******************************/ 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
     GPIO_Init(GPIOC, &GPIO_InitStructure); 

     /* 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); 

     /* ADC1 Init ****************************************************************/ 
     ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 
     ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
     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(ADC1, &ADC_InitStructure); 

    /* ADC1 regular channel12 configuration *************************************/ 
     ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_3Cycles); 


    /* Enable DMA request after last transfer (Single-ADC mode) */ 
     ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); 

     /* Enable ADC1 DMA */ 
     ADC_DMACmd(ADC1, ENABLE); 

     /* Enable ADC1 */ 
     ADC_Cmd(ADC1, ENABLE); 
    } 

В ADC1ConvertedValue Я всегда вижу нули. Я заменил

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; 

с

DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) & (ADC1->DR); 

и по-прежнему видеть нули.

ответ

1

Вы должны ссылаться на DMA2 запрос отображения таблицу в справочном руководстве, применимой к части STM32F4xx вы используете:

enter image description here

Как вы можете видеть ADC1 на канале 0/Streams 0 & 4, в то время как ADC3 на канале 2/Streams 0 & 1.

Так что изменение:

/* DMA2 Stream0 channel0 configuration **************************************/ 
    DMA_InitStructure.DMA_Channel = DMA_Channel_0; 

Как ни странно, комментарий был уже правильным, но неправильным в примере ADC3.

+0

Ты так прав, спасибо. Комментарии для примера Peripheral были неправильными, и я не проверял каждую строку, моя ошибка. –

+0

@ Ярослав Кирилл: Да, будьте очень осторожны с примерами периферийной библиотеки ST; качество несколько изменчиво и редко конструировано с легким retargeting в разуме. Они полезны, но не заменяют понимание аппаратного обеспечения. Если вам нужна такая встроенная «экспертиза», то стоит рассмотреть возможность использования библиотеки STM32CubeF4 и инструмента конфигурации STM32CubeMX. – Clifford

 Смежные вопросы

  • Нет связанных вопросов^_^