Forum: Mikrocontroller und Digitale Elektronik STM32 injected ADC + DMA Transfer


von muuuhhh (Gast)


Lesenswert?

Guten Tag,

ich möchte bei einem STM32F334 für den ADC1 im triggered injection Mode 
einen DMA Transfer konfigurieren. Ich bin mir aber unsicher, ob das 
überhaupt geht. Was ich erreichen möchte, ist, dass der HRTIM den ADC1 
triggert (das klappt, ADC1 geht in die ISR) und dieser die Werte via DMA 
an die dafür vorgesehene Adresse kopiert. Leider wird der DMA Transfer 
nicht automatisch ausgelöst. Geht das überhaupt, oder muss ich das Bit 
dafür manuell setzen?

Das DMA Modul habe ich mit Hilfe von STMCubeMX folgendermaßen 
konfiguriert.
1
/* DMA controller clock enable */
2
    __HAL_RCC_DMA1_CLK_ENABLE();
3
4
    /* DMA interrupt init */
5
    /* DMA1_Channel1_IRQn interrupt configuration */
6
    HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
7
    HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
8
    /* DMA1_Channel2_IRQn interrupt configuration */
9
    HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
10
    HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
11
 /* Peripheral DMA init */
12
    g_hdma_adc1.Instance = DMA1_Channel1;
13
    g_hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
14
    g_hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
15
    g_hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
16
    g_hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
17
    g_hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
18
    g_hdma_adc1.Init.Mode = DMA_CIRCULAR;
19
    g_hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
20
21
    g_hdma_adc1.Instance->CPAR = DMA_ADC1_SOURCE_ADDRESS;
22
    g_hdma_adc1.Instance->CMAR = (uint32_t)&g_adc1_buffer;
23
    g_hdma_adc1.Instance->CNDTR = ADC1_NBR_OF_CONVERSIONS;
24
25
    if (HAL_DMA_Init(&g_hdma_adc1) != HAL_OK)
26
      Error_Handler();
27
28
    __HAL_LINKDMA(hadc,DMA_Handle,g_hdma_adc1);
29
    __HAL_DMA_ENABLE_IT(&g_hdma_adc1, DMA_IT_TC);

Der ADC1 ist folgendermaßen konfiguriert.
1
ADC_MultiModeTypeDef MultiModeConfig;
2
  ADC_InjectionConfTypeDef InjectionConfig;
3
4
  g_hadc1.Instance = ADC1;
5
6
  /* ADC2 is working independently */
7
  MultiModeConfig.DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;
8
  MultiModeConfig.Mode = ADC_MODE_INDEPENDENT;
9
  MultiModeConfig.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_1CYCLE;
10
  HAL_ADCEx_MultiModeConfigChannel(&g_hadc1, &MultiModeConfig);
11
12
  /* ADC2 global initialization */
13
  /* 12-bit right-aligned format, discontinuous scan mode, running from PLL */
14
  g_hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC;
15
  g_hadc1.Init.Resolution = ADC_RESOLUTION12b;
16
  g_hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
17
  g_hadc1.Init.ScanConvMode = ENABLE;
18
  g_hadc1.Init.EOCSelection = EOC_SINGLE_CONV;
19
  g_hadc1.Init.LowPowerAutoWait = DISABLE;
20
  g_hadc1.Init.ContinuousConvMode = DISABLE;
21
  g_hadc1.Init.NbrOfConversion = 1;
22
  g_hadc1.Init.DiscontinuousConvMode = DISABLE;
23
  g_hadc1.Init.NbrOfDiscConversion = 1;
24
  g_hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
25
  g_hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
26
  g_hadc1.Init.DMAContinuousRequests = ENABLE;
27
  g_hadc1.Init.Overrun = OVR_DATA_OVERWRITTEN;
28
  HAL_ADC_Init(&g_hadc1);
29
30
  /* Discontinuous injected mode: 1st injected conversion for Vin on Ch2 */
31
  InjectionConfig.InjectedChannel = ADC_CHANNEL_1;
32
  InjectionConfig.InjectedRank = ADC_INJECTED_RANK_1;
33
  InjectionConfig.InjectedSamplingTime = ADC_SAMPLETIME_19CYCLES_5;
34
  InjectionConfig.InjectedSingleDiff = ADC_SINGLE_ENDED;
35
  InjectionConfig.InjectedOffsetNumber = ADC_OFFSET_NONE;
36
  InjectionConfig.InjectedOffset = 0;
37
  InjectionConfig.InjectedNbrOfConversion = 1;
38
  InjectionConfig.InjectedDiscontinuousConvMode = ENABLE;
39
  InjectionConfig.AutoInjectedConv = DISABLE;
40
  InjectionConfig.QueueInjectedContext = DISABLE;
41
  InjectionConfig.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_HRTIM_TRG2;
42
  InjectionConfig.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONV_EDGE_RISING;
43
  HAL_ADCEx_InjectedConfigChannel(&g_hadc1, &InjectionConfig);
44
45
  /* Configure the 2nd injected conversion for Vout on Ch4 */
46
  InjectionConfig.InjectedChannel = ADC_CHANNEL_3;
47
  InjectionConfig.InjectedRank = ADC_INJECTED_RANK_2;
48
  InjectionConfig.InjectedSamplingTime = ADC_SAMPLETIME_19CYCLES_5;
49
  HAL_ADCEx_InjectedConfigChannel(&g_hadc1, &InjectionConfig);
50
  g_hadc1.Instance->CFGR |= ADC_CFGR_DMAEN;
51
  /* Run the ADC calibration in single-ended mode */
52
  HAL_ADCEx_Calibration_Start(&g_hadc1, ADC_SINGLE_ENDED);
53
54
  /* Start ADC2 Injected Conversions */
55
  HAL_ADCEx_InjectedStart_IT(&g_hadc1);

Viele Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.