We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi! I have STM32H745 Nucleo and i want to transfer data from ADC via DMA.
1. At first i write code for ADC with out DMA (ADC3, PF10 in) and it work excellent. I get positive knovlege.
2. At second step i tried to use DMA (DMA1 stream 1, PF10, ADC3), but code don't work.
It is code with DMA:
void ADC3_DMA_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
static DMA_HandleTypeDef DmaHandle;
/* ADC handler declaration */
ADC_HandleTypeDef AdcHandle_singl;
ADC_ChannelConfTypeDef sConfig;
__HAL_RCC_GPIOF_CLK_ENABLE() ;
__HAL_RCC_ADC3_CLK_ENABLE() ;
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);
__HAL_RCC_DMA1_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_10 ;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
DmaHandle.Instance = DMA1_Stream1;
DmaHandle.Init.Request = DMA_REQUEST_ADC3;
DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
// DMA1_Stream1->PAR = (uint32_t)&ADC3->DR;
// DMA1_Stream1->M0AR = (uint32_t)&ADC1ConvertedValue;
DmaHandle.Init.MemInc = DMA_MINC_ENABLE;
DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
DmaHandle.Init.Mode = DMA_CIRCULAR;
DmaHandle.Init.Priority = DMA_PRIORITY_HIGH;
HAL_DMA_DeInit(&DmaHandle);
HAL_DMA_Init(&DmaHandle);
DMAMUX1_Channel1->CCR|= 115U;; //stream 1 29 ????
//DMAMUX1_Channel1->CCR = (115u << DMAMUX_CxCR_DMAREQ_ID_Pos);
DMA1_Stream1->CR |= DMA_SxCR_EN;
AdcHandle_singl.Instance = ADC3;
AdcHandle_singl.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
AdcHandle_singl.Init.Resolution = ADC_RESOLUTION_16B;
AdcHandle_singl.Init.ScanConvMode = DISABLE;
AdcHandle_singl.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
AdcHandle_singl.Init.LowPowerAutoWait = DISABLE;
AdcHandle_singl.Init.ContinuousConvMode = ENABLE ;
AdcHandle_singl.Init.NbrOfConversion = 1;
AdcHandle_singl.Init.DiscontinuousConvMode = DISABLE;
AdcHandle_singl.Init.NbrOfDiscConversion = 1;
AdcHandle_singl.Init.ExternalTrigConv = ADC_SOFTWARE_START; ;
AdcHandle_singl.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
AdcHandle_singl.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
AdcHandle_singl.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
AdcHandle_singl.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&AdcHandle_singl) != HAL_OK)
; //Error_Handler();
}
/* ### - 2 - Start calibration ############################################ */
if (HAL_ADCEx_Calibration_Start(&AdcHandle_singl, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
sConfig.Channel = ADC_CHANNEL_6; //ADC3_CHANNELa; /* Sampled channel number */
sConfig.Rank = ADC_REGULAR_RANK_1; /* Rank of sampled channel number ADCx_CHANNEL */
sConfig.SamplingTime = ADC_SAMPLETIME_8CYCLES_5; /* Minimum sampling time */
sConfig.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */
sConfig.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */
sConfig.Offset = 0; /* Parameter discarded because offset correction is disabled */
if (HAL_ADC_ConfigChannel(&AdcHandle_singl, &sConfig) != HAL_OK)
/* ### - 4 - Start conversion in DMA mode ################################# */
if (HAL_ADC_Start_DMA(&AdcHandle_singl,
(uint32_t *)aADCxConvertedData,
ADC_CONVERTED_DATA_BUFFER_SIZE
) != HAL_OK)