2016-04-29 1 views
0

J'ai une stm32f4-discovery avec l'uc stm32f407vg dessus et j'essaye de programmer l'ADC1 et de mesurer quelques signaux sur le port PC5 avec lui. Selon la documentation PC5 se bloque sur l'ADC12_IN15 que j'interprète comme ADC1 et ADC2 canal 15. Je veux utiliser les exemples de projets ADC_DMA de la bibliothèque STD STM32F4xx_DSP_StdPeriph_Lib_V1.6.1. Le signal à la PC5 est fourni par un générateur de signal et c'est un signal carré avec une fréquence de 10 Hz, Vpp de 900 mV et un décalage de 2 V. Ensuite, je cours le code suivant, qui est compilé et téléchargé:Impossible de faire fonctionner l'ADC de stm32f4-discovery

#define ADCx      ADC1 
#define ADC_CHANNEL    ADC_Channel_15 
#define ADCx_CLK     RCC_APB2Periph_ADC1 
#define ADCx_CHANNEL_GPIO_CLK RCC_AHB1Periph_GPIOC 
#define GPIO_PIN     GPIO_Pin_5 
#define GPIO_PORT    GPIOC 
#define DMA_CHANNELx    DMA_Channel_0 
#define DMA_STREAMx    DMA2_Stream0 
#define ADCx_DR_ADDRESS   ((uint32_t)0x4001224C) 
static void ADC_Config(void); 
/** 
    * @brief Main program 
    * @param None 
    * @retval None 
    */ 
int main(void) 
{ 
    /*!< At this stage the microcontroller clock setting is already configured, 
     this is done through SystemInit() function which is called from startup 
     files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) 
     before to branch to application main. 
     To reconfigure the default setting of SystemInit() function, refer to 
     system_stm32f4xx.c file 
    */ 






    /* ADC configuration */ 
    ADC_Config(); 


    /* Start ADC Software Conversion */ 
    ADC_SoftwareStartConv(ADCx); 


    while (1) 
    { 
    uwADCxConvertedVoltage = uhADCxConvertedValue *3300/0xFFF; 
    } 
} 


/** 
    * @brief ADC3 channel07 with DMA configuration 
    * @note This function Configure the ADC peripheral 
      1) Enable peripheral clocks 
      2) DMA2_Stream0 channel2 configuration 
      3) Configure ADC Channel7 pin as analog input 
      4) Configure ADC3 Channel7 
    * @param None 
    * @retval None 
    */ 
static void ADC_Config(void) 
{ 
    ADC_InitTypeDef  ADC_InitStructure; 
    ADC_CommonInitTypeDef ADC_CommonInitStructure; 
    DMA_InitTypeDef  DMA_InitStructure; 
    GPIO_InitTypeDef  GPIO_InitStructure; 


    /* Enable ADCx, DMA and GPIO clocks ****************************************/ 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 
    RCC_AHB1PeriphClockCmd(ADCx_CHANNEL_GPIO_CLK, ENABLE); 
    RCC_APB2PeriphClockCmd(ADCx_CLK, ENABLE); 



    /* DMA2 Stream0 channel15 configuration **************************************/ 
    DMA_InitStructure.DMA_Channel = DMA_CHANNELx; 
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADCx_DR_ADDRESS; 
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCxConvertedValue; 
    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(DMA_STREAMx, &DMA_InitStructure); 
    DMA_Cmd(DMA_STREAMx, ENABLE); 


    /* Configure ADC1 Channel15 pin as analog input ******************************/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; 
    GPIO_Init(GPIO_PORT, &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_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; 
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
    ADC_InitStructure.ADC_NbrOfConversion = 1; 
    ADC_Init(ADCx, &ADC_InitStructure); 


    /* ADC1 regular channel15 configuration **************************************/ 
    ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_3Cycles); 


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


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


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

Quand je mets un point de rupture à la ligne

uwADCxConvertedVoltage = uhADCxConvertedValue *3300/0xFFF; 

la variable est toujours égale à zéro. De plus, je ne vois aucun changement dans les registres ADC1 ou les registres DMA2 pendant l'opération et l'indicateur SWSTART du registre ADC_CR2 n'est jamais défini. Le registre ADC_DR est toujours 0 aussi. Il semble que la fonction

ADC_SoftwareStartConv(ADCx); 

ne parvient pas à définir l'indicateur SWSTART et la conversion n'est jamais effectuée.

Qu'est-ce qui pourrait ne pas fonctionner?

Répondre

1

Il semble que vous configuriez le mauvais flux/canal DMA. Vous sélectionnez ADC1 mais configurez DMA_Channel_1. Vous devrez configurer DMA_Channel_0 en utilisant DMA_Stream_0. Les tableaux suivants montrent la configuration du flux/canal DMA.

enter image description here

enter image description here

+0

Ça ne marche toujours pas. uhADCxConvertedValue est 0 tout le temps. –

+0

Qu'en est-il de l'adresse de base du périphérique DMA_InitStructure.DMA_PeripheralBaseAddr devrait-il avoir une valeur particulière pour ADC1? –

+0

Le bit OVR est activé lorsque j'ai mis un point d'arrêt. –

0

Vous avez sélectionné un déclencheur externe, ADC_ExternalTrigConv_T1_CC1, mais je ne peux pas voir Timer1 configuré et en cours d'exécution. Sélectionnez plutôt aucun déclencheur externe et appelez ADC_SoftwareStartInjectedConvCmd je crois.

+0

Merci. Je vais essayer ça. –

+0

Je ne peux pas trouver la valeur pour la macro ADC_ExternalTrigConv_T1_CC1 trigger non externe est juste 0x0. Êtes-vous sûr qu'il y a une telle possibilité? En outre, il a été utilisé canal régulier et le démarrage est fait en appelant la fonction ADC_SoftwareStartConv (ADCx); –

+0

ADC_SoftwareStartConv (ADCx) ne définit en réalité pas le drapeau SWSTART –