2013-03-05 07:57 AM
Hello,
I need to measure 3 ADC channels in continuous, I use the STM32L151VB. I use the DMA transfert, my firmware doesn't work property. please see in attachment my source code my problem is the memory data ''adcBuffer'' the DMA update only the case''0'' can you help me? //----------------------------------------------------------- #include ''ADCuser.h'' #include ''stm32l1xx_adc.h'' #include ''stm32l1xx_dma.h'' //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ static uint32_t adcBuffer[3] = {0}; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void ADC_init(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_HSICmd(ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* DMA Channel1 Configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &ADC1->DR ; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) adcBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 3; DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 regular channel 7 configuration ************************************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_10b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = 0; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 3; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_384Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_384Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_384Cycles); ADC_ContinuousModeCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); /* Wait until the ADC1 is ready */ while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConv(ADC1); } thanks a lot2013-03-05 08:33 AM
This is bogus
DMA_InitStructure.DMA_PeripheralInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_PeripheralInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // It's still 16-bit wide, so HalfWord surely? Would hazard you also need this prior to ADC_DMACmd() /* Enable the request after last transfer for DMA Circular mode */ ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);2013-03-05 11:18 PM
thanks a lot
perfect