Solved
Is there any example with DMA and ADC1 for the STM32G431 using the Low-Level layer?
I am trying to make the ADC and the DMA work in the STM32G431 without success. I can make the ADC work but the DMA transaction is not triggered.
This is my code:
//******************************************************************************
void ADCInit(void)
//******************************************************************************
{
LL_GPIO_InitTypeDef GPIO_InitStructure;
LL_ADC_InitTypeDef adcInit;
LL_ADC_REG_InitTypeDef adcRegInit;
// Enable clocks
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA|LL_AHB2_GRP1_PERIPH_GPIOB);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);
// Reset any previous configuration
LL_ADC_CommonDeInit(ADC12_COMMON);
LL_ADC_DeInit(ADC1); // For voltage and current
// Enable Power regulators
LL_ADC_DisableDeepPowerDown(ADC1);
LL_ADC_EnableInternalRegulator(ADC1);
LL_ADC_SetCommonClock(ADC12_COMMON, LL_ADC_CLOCK_SYNC_PCLK_DIV1);
Delay(100); // tADCVREG_STUP = 20us --> stabilization
// Start calibration of the ADCs
LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);
while (LL_ADC_IsCalibrationOnGoing(ADC1));
LL_ADC_SetCommonPathInternalCh(ADC12_COMMON, LL_ADC_PATH_INTERNAL_VREFINT);
// Configure all analog pins
GPIO_InitStructure.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStructure.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStructure.Speed = LL_GPIO_SPEED_HIGH;
GPIO_InitStructure.Pull = LL_GPIO_PULL_NO;
GPIO_InitStructure.Pin = LL_GPIO_PIN_0;
LL_GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = LL_GPIO_PIN_1;
LL_GPIO_Init(GPIOA, &GPIO_InitStructure);
memset((void *)iSamplingBuf,0xFF,sizeof(iSamplingBuf));
// Now Initialize the ADCs
LL_ADC_StructInit(&adcInit);
adcInit.Resolution = LL_ADC_RESOLUTION_12B;
adcInit.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
adcInit.LowPowerMode = LL_ADC_LP_MODE_NONE;
LL_ADC_Init(ADC1, &adcInit);
LL_ADC_REG_StructInit(&adcRegInit);
adcRegInit.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
adcRegInit.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
adcRegInit.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
adcRegInit.DMATransfer = LL_ADC_REG_DMA_TRANSFER_LIMITED;
adcRegInit.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;
adcRegInit.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
LL_ADC_REG_Init(ADC1, &adcRegInit);
LL_ADC_REG_SetSequencerRanks (ADC1,LL_ADC_REG_RANK_1,LL_ADC_CHANNEL_1);
LL_ADC_REG_SetSequencerRanks (ADC1,LL_ADC_REG_RANK_2,LL_ADC_CHANNEL_2);
LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_47CYCLES_5);
LL_ADC_SetChannelSingleDiff (ADC1,LL_ADC_CHANNEL_1, LL_ADC_SINGLE_ENDED);
LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_2, LL_ADC_SAMPLINGTIME_47CYCLES_5);
LL_ADC_SetChannelSingleDiff (ADC1,LL_ADC_CHANNEL_2, LL_ADC_SINGLE_ENDED);
LL_ADC_REG_SetSequencerLength(ADC1,LL_ADC_REG_SEQ_SCAN_DISABLE);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); //enable clock
LL_DMA_ConfigTransfer(DMA1,
LL_DMA_CHANNEL_1,
LL_DMA_DIRECTION_PERIPH_TO_MEMORY |
LL_DMA_MODE_CIRCULAR |
LL_DMA_PERIPH_NOINCREMENT |
LL_DMA_MEMORY_INCREMENT |
LL_DMA_PDATAALIGN_HALFWORD |
LL_DMA_MDATAALIGN_HALFWORD |
LL_DMA_PRIORITY_HIGH );
LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC1);
LL_DMA_ConfigAddresses(DMA1,
LL_DMA_CHANNEL_1,
LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA),
(uint32_t)iSamplingBuf,
LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, ARRAYSIZE(iSamplingBuf));
LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
// Enable ADC1
LL_ADC_ClearFlag_ADRDY(ADC1);
LL_ADC_Enable(ADC1);
while (!LL_ADC_IsEnabled(ADC1));
LL_ADC_REG_StartConversion(ADC1);
for (;;)
{
}
}
What I am doing wrong?
Is there any example with DMA and ADC1 for the STM32G431 using the Low-Level layer?