Skip to main content
Damiano Balzani
Associate II
February 15, 2018
Solved

DMA irqHandler doesn't work

  • February 15, 2018
  • 2 replies
  • 1183 views
Posted on February 15, 2018 at 11:25

Hi everyone,

I'm tryng to use DMA with ADC on STM32L051x6 MCU.

When i see the Memory dump at the memory address of variable i takes the correct value from ADC DR but DMAIrq doesn't work never

Can somebody help me?

Thanks in advance

bool LED_CURRENT_ADC_Init(void)

{

   LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); //Enable DMA Clock

   DMA1_CSELR -> CSELR &= 0xFFFFFFF0; //Remap of DMA channels to ADC

   LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED); //Enable DMA    transfer on ADC

   DMA1_Channel1 -> CPAR = (uint32_t) (&(ADC1->DR)); //Configure the ADC data register address

   DMA1_Channel1->CMAR = (uint32_t)(ADC_val); //Configure the memory address

   DMA1_Channel1->CNDTR = 1; //Configure the number of DMA tranfer to be performs on channel 1

   LL_DMA_SetChannelPriorityLevel (DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_VERYHIGH); 

   LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR); //Set mode    LL_DMA_MODE_NORMAL LL_DMA_MODE_CIRCULAR

   LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1,    LL_DMA_DIRECTION_PERIPH_TO_MEMORY); //Set direction

   LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_WORD); //Set dimension

   LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT); 

   LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT); 

   LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_HALFWORD); 

   LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1);

   LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_1);

   LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);

   NVIC_EnableIRQ(DMA1_Channel1_IRQn);

   NVIC_SetPriority(DMA1_Channel1_IRQn, 1);

LL_ADC_SetClock(ADC1, LL_ADC_CLOCK_SYNC_PCLK_DIV1);

LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_7CYCLES_5);

LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_12B);

LL_ADC_SetDataAlignment(ADC1, LL_ADC_DATA_ALIGN_RIGHT);

LL_ADC_REG_SetSequencerChannels(ADC1, LL_ADC_CHANNEL_3);

LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_SINGLE); //LL_ADC_REG_CONV_SINGLE LL_ADC_REG_CONV_CONTINUOUS

LL_ADC_ClearFlag_ADRDY(ADC1);

LL_ADC_EnableIT_EOS(ADC1);

LL_ADC_Enable(ADC1);

while(!LL_ADC_IsActiveFlag_ADRDY(ADC1))

{

}

return true;

}

#dma-adc
This topic has been closed for replies.
Best answer by Tesla DeLorean
Posted on February 15, 2018 at 14:00

The DMA Irq will not occur if the DMA transfers aren't actually occurring. Check the DMA for error flags.

Check the handler name matches the one in the vector table, and the linker binds correctly.

Don't see the array defined. Check WORD != HALFWORD

Perhaps the are some L0 LL examples you can review.

2 replies

Tesla DeLorean
Tesla DeLoreanBest answer
Guru
February 15, 2018
Posted on February 15, 2018 at 14:00

The DMA Irq will not occur if the DMA transfers aren't actually occurring. Check the DMA for error flags.

Check the handler name matches the one in the vector table, and the linker binds correctly.

Don't see the array defined. Check WORD != HALFWORD

Perhaps the are some L0 LL examples you can review.

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
Damiano Balzani
Associate II
February 22, 2018
Posted on February 22, 2018 at 11:06

thanks for the help!