STM32 injected ADC + DMA Transfer

Gast #4664265
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.