Estoy usando un STM32F303v con 2 canales regulares de ADC en modo continuo con un DMA y me gustaría que se realizara una conversión continua para permitir un flujo de datos.
Basándome en la configuración de mi DMA y ADC a continuación, no puedo realizar una conversión continua. En la depuración adicional, encontré que la primera conversión se realizó correctamente y luego el bit ADSTART se restableció a 0. Si configuro ADSTART = 1 manualmente, la conversión comienza, DMA realiza la transferencia cuando finaliza y luego ADSTART vuelve a 0 Por favor ayuda.
DMAy_x = DMA1_Channel1;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)dest;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_BufferSize = 2; // in data unit
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADCx->DR;
DMA_Init(DMAy_x, &DMA_InitStructure);
DMA_Cmd(DMAy_x, ENABLE);
ADCx = ADC1;
ADC_Cmd(ADCx, DISABLE);
while(ADCx->CR & ADC_CR_ADEN);
ADC_DeInit(ADCx);
ADC_InitTypeDef ADC_InitStructure;
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_NbrOfRegChannel = 2;
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;
ADC_InitStructure.ADC_OverrunMode = ENABLE;
ADC_InitStructure.ADC_AutoInjMode = DISABLE;
ADC_Init(ADCx, &ADC_InitStructure);
// Set up ADC channels
for (uint16_t i = 0; i < nPins; ++i)
{
// make them regular channels with rank i +1, sample time is 19 ADC cycles
ADC_RegularChannelConfig(ADCx, PIN_MAP[pinNames[i]].adcChannel, i + 1, ADC_SAMPLE_TIME);
}
ADC_DMAConfig(ADCx, ADC_DMAMode_Circular);
ADC_DMACmd(ADCx, ENABLE);
// Enable everything
ADC_Cmd(ADCx, ENABLE);
while (!(ADC_GetFlagStatus(ADCx, ADC_FLAG_RDY)));
ADC_StartConversion(ADCx);