We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi everybody, I've started to use the STM32F4 Discovery, now I'm trying to use the ADC as single channel in conitnuous mode without DMA, i doesn't work , is it posible to do it?
#include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_adc.h" //#include "GPIO_STM32F4xx.h" ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; //DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; uint16_t ADCLect=0; uint16_t Counter=0; uint16_t Done=0; volatile uint32_t msTicks; /* counts 1ms timeTicks */ FlagStatus Estado; /*---------------------------------------------------------------------------- SysTick_Handler *----------------------------------------------------------------------------*/ void SysTick_Handler(void) { msTicks++; } /*---------------------------------------------------------------------------- delays number of tick Systicks (happens every 1 ms) *----------------------------------------------------------------------------*/ void Delay (uint32_t dlyTicks) { uint32_t curTicks; curTicks = msTicks; while ((msTicks - curTicks) < dlyTicks); } int main() { SystemCoreClockUpdate(); if (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts */ while (1); /* Capture error */ } RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Configure PA1 in analog mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); /* ADC Common configuration *************************************************/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInit(&ADC_CommonInitStructure); /* ADC1 regular channel 12 configuration ************************************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE;//DISABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_EOCOnEachRegularChannelCmd(ADC1,ENABLE); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles); ADC_ContinuousModeCmd(ADC1,ENABLE); // to make sure the CONT is set /* Enable ADC1 **************************************************************/ ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); while (1) { //ADC_SoftwareStartConv(ADC1); Estado = ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC); if(Estado){ Done=1; ADCLect = ADC_GetConversionValue(ADC1); //ADC_ClearFlag(ADC1,ADC_FLAG_EOC); // to clear the flags events. } Delay(100); } return 0; }
when I use the ADC in mode discontinuous using the code below:
ADC_SoftwareStartConv(ADC1); ADCLect = ADC_GetConversionValue(ADC1); ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
it Works well.
I hope somebody can help me