stm32f303 Modo de conversión continua ADC multicanal no inicia automáticamente una nueva secuencia

1

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);
    
pregunta marc

1 respuesta

2

El error estaba en esta línea

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

Debería ser

ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
    
respondido por el marc

Lea otras preguntas en las etiquetas