cancel
Showing results for 
Search instead for 
Did you mean: 

STM32G030K6T6 ADC_DMA

Sudhakar.R
Associate III

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
}

17 REPLIES 17
Kamil Duljas
Senior III

First you should configure whole DMA, then ADC​.

​On the other hand you duplicate adc enabling. Line 13 and the last one​

Dudo
Kamil Duljas
Senior III

Did you resolve the issue?

@Sudhakar.R​ ​

Dudo
Sudhakar.R
Associate III

@Kamil Duljas​ 

thank you for your comment. i tring but output is not came.

Do you still resolve it?​

Dudo
Sudhakar.R
Associate III

@Kamil Duljas​ 

yes. i trying to resolve the issue. but i don't know where i made a mistake. if you know guide me

Kamil Duljas
Senior III

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;

Dudo
Sudhakar.R
Associate III

thank you and it's very useful for me.

please select best answer if my answer works for you

Dudo
Sudhakar.R
Associate III

hi @Kamil Duljas​ 

I replace the channel 12 to 1 in line 15 and I comment the line 16. still output is not came.