Forum: Mikrocontroller und Digitale Elektronik STM32L4 ADC Problem


von Benni S. (Gast)


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

von Christopher J. (christopher_j23)


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?

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.