2023-04-28 06:20 AM
Hi,
I'm trying to configure the ADC DMA with STM32G030K6T6. But Analog value is not came.
below I given my code and i don't know where i made a mistake if any one know help me.
void ADC_Config(void)
{
RCC->APBENR2 |= RCC_APBENR2_ADCEN; // ADC clock enable
RCC->AHBENR |= RCC_AHBENR_DMA1EN; // DMA1 clock enable
ADC1->CR |= ADC_CR_ADEN; // ADC enable
ADC1->CFGR2 |= (1<<30); // 01: PCLK/2 (Synchronous clock mode)
ADC1->CFGR1 |= (ADC_CFGR1_CONT | ADC_CFGR1_DMAEN | ADC_CFGR1_CHSELRMOD | ADC_CFGR1_DMACFG); // 1: Continuous conversion mode & Direct memory access enable & Direct memory access configuration
ADC1->SMPR |= ADC_SMPR_SMP1_1; // Sampling time selection 1 (010: 7.5 ADC clock cycles)
ADC1->CHSELR |= (ADC_CHSELR_CHSEL0 | ADC_CHSELR_CHSEL1 | ADC_CHSELR_CHSEL2); // Channel-x selection (Channel-x selection)
ADC1->CR |= ADC_CR_ADEN; // ADC enable
DMA1_Channel1->CPAR = (uint32_t)&(ADC1->DR); // peripheral Address
DMA1_Channel1->CMAR = (uint32_t)Aout; // Memory Address
DMA1_Channel1->CNDTR = 3; // No Of Data
DMA1_Channel1->CCR |= (DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0| DMA_CCR_CIRC | DMA_CCR_TEIE | DMA_CCR_TCIE); // Msize,Psize,CIRC,MINC
DMA1_Channel1->CCR |= DMA_CCR_EN; // DMA enable
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn,0);
ADC1->CR |= ADC_CR_ADEN; // ADC enable
}
2023-04-28 07:33 AM
First you should configure whole DMA, then ADC.
On the other hand you duplicate adc enabling. Line 13 and the last one
2023-05-03 07:27 AM
Did you resolve the issue?
@Sudhakar.R
2023-05-04 07:40 AM
@Kamil Duljas
thank you for your comment. i tring but output is not came.
2023-05-04 08:00 AM
Do you still resolve it?
2023-05-05 03:35 AM
@Kamil Duljas
yes. i trying to resolve the issue. but i don't know where i made a mistake. if you know guide me
2023-05-05 05:12 AM
I used built-in temperature sensor for test but you can replace channels in line 15 and comment line 16 if you don't use temperature sensor.
It should works:
uint32_t Aout = 0;
RCC->APBENR2 |= RCC_APBENR2_ADCEN; // ADC clock enable
RCC->AHBENR |= RCC_AHBENR_DMA1EN; // DMA1 clock enable
DMA1_Channel1->CPAR = (uint32_t)&(ADC1->DR); // peripheral Address
DMA1_Channel1->CMAR =(uint32_t)&Aout; // Memory Address
DMA1_Channel1->CNDTR = 1; // No Of Data
DMA1_Channel1->CCR |= (DMA_CCR_MINC | DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0| DMA_CCR_CIRC | DMA_CCR_TEIE | DMA_CCR_TCIE); // Msize,Psize,CIRC,MINC
DMA1_Channel1->CCR |= DMA_CCR_EN; // DMA enable
//ADC1->CR |= ADC_CR_ADEN; // ADC enable
ADC1->CFGR2 |= (1<<30); // 01: PCLK/2 (Synchronous clock mode)
ADC1->CFGR1 |= (ADC_CFGR1_CONT | ADC_CFGR1_DMAEN | ADC_CFGR1_CHSELRMOD | ADC_CFGR1_DMACFG); // 1: Continuous conversion mode & Direct memory access enable & Direct memory access configuration
ADC1->SMPR |= ADC_SMPR_SMP1_1; // Sampling time selection 1 (010: 7.5 ADC clock cycles)
ADC1->CHSELR |= (ADC_CHSELR_CHSEL12); // Channel-x selection (Channel-x selection)
ADC1_COMMON->CCR |= ADC_CHANNEL_TEMPSENSOR;
ADC1->ISR &= ~(ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR);
//ADC1->CR |= ADC_CR_ADEN; // ADC enable
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
NVIC_SetPriority(DMA1_Channel1_IRQn,0);
ADC1->CR |= ADC_CR_ADEN; // ADC enable
ADC1->CR |=ADC_CR_ADSTART;
2023-05-07 10:27 PM
thank you and it's very useful for me.
2023-05-07 11:20 PM
please select best answer if my answer works for you
2023-05-08 12:25 AM
hi @Kamil Duljas
I replace the channel 12 to 1 in line 15 and I comment the line 16. still output is not came.