STM32L4 ADC Problem

Gast #5260113
Lesenswert?
• ▲
▼
Hallo zusammen

ich versuche gerade den ADC meines stm32L443 zum laufen zu bekommen 
(erstmal ohne DMA und mit normalen Interrupt und externer VREF). Mit den 
internen Kanälen für VBAT und VTemp funktioniert das auch alles 
wurderbar, aber sobald ich einen externen Pin benutzen will klappt das 
nicht mehr. Der Interrupt wird nicht mehr aufgerufen aber die Bits in 
den Registern sagen mir, dass der ADC läuft.
1
void MD_ADC_ADCConfig(void)
2
{
3
  MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_ADC, ENABLE);
4
  MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_GPIOA, ENABLE);
5
  MD_RCC_AHB2PeriphClockEnable(MD_RCC_AHB2_GPIOB, ENABLE);
6
  GPIOA->MODER = (GPIOA->MODER | GPIO_MODER_MODER0 | GPIO_MODER_MODER2 | GPIO_MODER_MODER3 | GPIO_MODER_MODER6 | GPIO_MODER_MODER7);
7
  GPIOB->MODER = (GPIOB->MODER | GPIO_MODER_MODER0 | GPIO_MODER_MODER1);
8
  ADC1_COMMON->CCR = (((ADC1_COMMON->CCR | ADC_CCR_TSEN | ADC_CCR_VBATEN) & ~ADC_CCR_VREFEN) | ADC_CCR_PRESC_2 | ADC_CCR_PRESC_1);
9
  ADC1->CFGR = ((ADC1->CFGR & ~ADC_CFGR_ALIGN) & ~ADC_CFGR_RES);
10
  ADC1->SQR1 = (0x0000009U | (0x00000005U << 6) | (0x00000012U << 12) | (0x00000011U << 18) | (0x00000012U << 24));
11
  ADC1->SQR2 = (0x00000011U | (0x00000012U << 6) | (0x00000011U << 12) | (0x00000012U << 18) | (0x00000011U << 24));
12
  ADC1->SMPR1 |= 0x3FFFFFFF;
13

14
  NVIC_SetPriority(ADC1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 6, 0));
15
  NVIC_EnableIRQ(ADC1_IRQn);
16

17
  ADC1->CFGR |= ADC_CFGR_DISCEN;
18
  ADC1->CFGR &= ~ADC_CFGR_CONT;
19
  ADC1->CR &= ~ADC_CR_DEEPPWD;
20
  ADC1->CR |= ADC_CR_ADVREGEN;
21
  ADC1->CR |= ADC_CR_ADEN;
22
  ADC1->IER |= (ADC_IER_EOCIE);
23
  ADC1->CR |= ADC_CR_ADSTART;
24
}
25

26
void ADC1_IRQHandler(void)
27
{
28
  static uint8_t Counter = 1;
29
  uint8_t ui8_DataArrayPosition;
30
  if(!(ADC1->ISR & ADC_ISR_EOS))
31
  {
32
    ui8_DataArrayPosition = ui8_ConversionSequence[Counter-1];
33
    if(ui8_DataArrayPosition <= 18)
34
    {
35
      ADCData.ui8_ADCDataArray[ui8_DataArrayPosition] = ADC1->DR;
36
    }
37
    else
38
    {
39
      ;
40
    }
41
    if(Counter >= (ADC1->SQR1 & ADC_SQR1_L))
42
    {
43
      Counter = 1;
44
    }
45
    else
46
    {
47
      Counter++;
48
    }
49
  }
50
  else
51
  {
52
    Counter = 1;
53
  }
54
  ADC1->ISR &= ~ADC_ISR_EOC;
55
  ADC1->ISR &= ~ADC_ISR_EOS;
56
  asm("nop");
57
}

Habe ich zufällig etwas vergessen zu konfigurieren ?

Gruß
Benni
#5260235
Lesenswert?
• ▲
▼
Benni S. schrieb:
> ADC1->SQR1 = (0x0000009U | (0x00000005U << 6) | (0x00000012U << 12) |
> (0x00000011U << 18) | (0x00000012U << 24));
>   ADC1->SQR2 = (0x00000011U | (0x00000012U << 6) | (0x00000011U << 12) |
> (0x00000012U << 18) | (0x00000011U << 24));

Die Shifts passen nicht. SQx ist immer fünf Bit breit und die Länge L in 
SQR1 belegt die ersten vier Bits. Außerdem weiß ich nicht ob du mit 
0x12U jetzt tatsächlich Kanal 18 meinst oder doch Kanal 12 und wenn es 
Kanal 18 sein soll, warum schreibst du dann nicht einfach 18U?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 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.