无法使stm32f4发现的ADC工作

无法使stm32f4发现的ADC工作

问题描述:

我有一个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标志和转换从不执行。

什么可能是错的?

看起来你正在配置错误的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位被置位。 –

您已选择具有外部触发器ADC_ExternalTrigConv_T1_CC1,但我看不到Timer1已配置并正在运行。相反,请选择无外部触发器,并致电ADC_SoftwareStartInjectedConvCmd

+0

感谢。我会试试看。 –

+0

我无法找到无外部触发器的值ADC_ExternalTrigConv_T1_CC1宏只是0x0。你确定有这样的可能性吗?它也被用于常规通道,通过调用函数ADC_SoftwareStartConv(ADCx)完成启动; –

+0

ADC_SoftwareStartConv(ADCx)实际上并未设置SWSTART标志 –