Forum: Mikrocontroller und Digitale Elektronik STM32 ADC 1 und 2 Probleme


von Mark S. (Gast)


Lesenswert?

Hi,

ich versuche gerade den ADC 1 und 2 meines stm32H743zi in betrieb zu 
nehmen. Es soll immer wieder eine Sequenz von Kanälen durchlaufen 
werden. Mit ADC1 klappt alles einwandfrei, nur ADC2 macht Probleme (es 
wird kein Interrupt ausgelöst und auch kein Interrupt Flag gesetzt).

Die Interruptroutine ist gerade einfach nur Daten auslesen um zu schauen 
ob alles funktioniert.
1
  RCC->AHB1ENR = RCC->AHB1ENR | RCC_AHB1ENR_ADC12EN;
2
  RCC->APB4ENR = RCC->APB4ENR | RCC_APB4ENR_SYSCFGEN;
3
  RCC->APB4ENR = RCC->APB4ENR | RCC_APB4ENR_VREFEN;
4
5
  ADC12_COMMON->CCR = (ADC12_COMMON->CCR & ~ADC_CCR_PRESC) | (ADC_CCR_PRESC_0 | ADC_CCR_PRESC_1 | ADC_CCR_PRESC_3);  // Set Prescaler
6
7
  ADC1->CFGR = (ADC1->CFGR & ~ADC_CFGR_RES);
8
  ADC1->SMPR1 = (ADC1->SMPR1 & 0x00000000) | 0x3FFFFFFF;
9
  ADC1->SQR1 = (0x00000006U | (0x00000002U << 6) | (0x00000003U << 12) | (0x00000006U << 18) | (0x0000000AU << 24));
10
  ADC1->SQR2 = (0x00000012U | (0x00000013U << 6));
11
  VREFBUF->CSR |= VREFBUF_CSR_HIZ;
12
13
  NVIC_SetPriority(ADC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 6, 0));
14
  NVIC_EnableIRQ(ADC_IRQn);
15
16
  ADC1->CFGR |= ADC_CFGR_CONT;
17
  ADC1->CFGR &= ~ADC_CFGR_DISCEN;
18
  ADC1->CR &= ~ADC_CR_DEEPPWD;
19
  ADC1->CR |= ADC_CR_ADVREGEN;
20
        ADC1->CR |= ADC_CR_ADEN;
21
  ADC1->IER |= (ADC_IER_EOC | ADC_IER_EOC);
22
  ADC1->CR |= ADC_CR_ADSTART;
23
24
  ADC2->CFGR = (ADC2->CFGR & ~ADC_CFGR_RES);
25
  ADC2->SMPR1 = (ADC2->SMPR1 & 0x00000000) | 0x3FFFFFFF;
26
  ADC2->SQR1 = (0x00000002U | (0x00000002U << 6) | (0x00000006U << 12));
27
28
  ADC2->CFGR |= ADC_CFGR_CONT;
29
  ADC2->CFGR &= ~ADC_CFGR_DISCEN;
30
  ADC2->CR &= ~ADC_CR_DEEPPWD;
31
  ADC2->CR |= ADC_CR_ADVREGEN;
32
  ADC2->CR |= ADC_CR_ADEN;
33
  ADC2->IER |= (ADC_IER_EOS | ADC_IER_EOC);
34
  ADC2->CR |= ADC_CR_ADSTART;
1
void ADC_IRQHandler(void)
2
{
3
  if(ADC1->ISR & ADC_ISR_EOC)
4
  {
5
    ADCData.ui32_ADCDataArray[0] = ADC1->DR;
6
  }
7
  else
8
  {
9
    ;
10
  }
11
  if(ADC2->ISR & ADC_ISR_EOC)
12
  {
13
    ADCData.ui32_ADCDataArray[1] = ADC2->DR;
14
  }
15
  else
16
  {
17
    ;
18
  }
19
  ADC1->ISR &= ~ADC_ISR_EOC;
20
  ADC1->ISR &= ~ADC_ISR_EOS;
21
  ADC2->ISR &= ~ADC_ISR_EOC;
22
  ADC2->ISR &= ~ADC_ISR_EOS;
23
}

von Jim M. (turboj)


Lesenswert?

Der Footer mit den unbedingten Bit Löschungen im Handler kann Dir den 
ADC2 Interrupt ausmachen, bevor der oben behandelt wurde (und 
andersherum). Das sollte man anders lösen.

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.