2018-02-01 12:07 AM
Good Day
If I call:
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)getADCBuffer, adcBufferLength); //uint16_t getADCBuffer[adcBufferLength] and adcBufferLenght is defined as 1000�?
and then call:
HAL_ADC_Stop_DMA(&hadc1);�?
before the 'adcBufferLength' was reached, how can I check how many new bytes I have in my getADCBuffer for every iteration of the code?
Can I do this:
adcNumSamplesCaptured = (adcBufferLength - (uint16_t)(DMA1_Channel1->CNDTR));�?
where obviously DMA1_Channel1 is associated with the ADC Configuration.
In normal mode, will CNDTR return to 'adcBufferLength' automatically every time? The Reference Manual for my MCU says:
'
If the channel is configured in non-circular mode, no DMA request is served after the last
transfer (that is once the number of data items to be transferred has reached zero). In orderto reload a new number of data items to be transferred into the DMA_CNDTRx register, theDMA channel must be disabled.'
I should never reach '0' items left to transfer,is there something that I must do?
ShouldI call 'CLEAR_BIT(DMA1_Channel1->CCR,DMA_CCR_EN);' before calling
'HAL_ADC_Start_DMA(&hadc1, (uint32_t*)getADCBuffer, adcBufferLength);' ?
I find that sometimes 'adcNumSamplesCaptured is larger than the number of non-zero bytes in 'getADCBuffer', and can't quite figure out why.
My ADC DMA Configuration:
/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Request = DMA_REQUEST_0;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_NORMAL;
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?
Kind Regards
#dma #dma-adc #dma-normal #adc #stm32-adc2018-04-11 2:54 AM
Hi! You have to disable the dma and write again to CNDTR of your dma channel. When you enable the channel again it will work!
Cheers
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.