2016-04-29 87 views
0

我有一個stm32f4發現與它的stm32f407vg uC,我試圖編程ADC1並測量端口PC5上的一些信號與它。根據文檔,PC5掛在ADC12_IN15上,我將其解釋爲ADC1和ADC2通道15.我想使用STD庫STM32F4xx_DSP_StdPeriph_Lib_V1.6.1中的ADC_DMA示例項目。到PC5的信號由信號發生器提供,它是一個頻率爲10 Hz,Vpp爲900 mV,偏移爲2 V的方波信號。然後,我運行以下代碼,該代碼已成功編譯並上傳:無法使stm32f4發現的ADC工作

#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); 
} 

當我在線

uwADCxConvertedVoltage = uhADCxConvertedValue *3300/0xFFF; 

可變設置斷點始終爲零。此外,在操作期間,我看不到ADC1寄存器或DMA2寄存器發生變化,並且ADC_CR2寄存器的SWSTART標誌從不設置。 ADC_DR寄存器也始終爲0。它看起來像功能

ADC_SoftwareStartConv(ADCx); 

未能設置SWSTART標誌和轉換從不執行。

什麼可能是錯的?

回答

1

看起來你正在配置錯誤的DMA流/通道。您選擇ADC1但配置DMA_Channel_1。您需要使用DMA_Stream_0配置DMA_Channel_0。下表顯示了DMA流/通道配置。

enter image description here

enter image description here

+0

它仍然無法正常工作。 uhADCxConvertedValue始終爲0。 –

+0

外設基地址DMA_InitStructure.DMA_PeripheralBaseAddr應該對ADC1有一個特定的值嗎? –

+0

當我放置一個斷點時,OVR位被置位。 –

0

您已選擇具有外部觸發器ADC_ExternalTrigConv_T1_CC1,但我看不到Timer1已配置並正在運行。相反,請選擇無外部觸發器,並致電ADC_SoftwareStartInjectedConvCmd

+0

感謝。我會試試看。 –

+0

我無法找到無外部觸發器的值ADC_ExternalTrigConv_T1_CC1宏只是0x0。你確定有這樣的可能性嗎?它也被用於常規通道,通過調用函數ADC_SoftwareStartConv(ADCx)完成啓動; –

+0

ADC_SoftwareStartConv(ADCx)實際上並未設置SWSTART標誌 –