ADC1 beim STM32H750

Gast #6150810
Lesenswert?

Der ADC1 soll kontinuierlich ADC_INP16 wandeln und in ADC1->DR ablegen. 
Der folgende Code startet nur eine einzelne Messung.
1
#define ANALOG_IN       3
2
#define ADC_PA0_KANAL  16               // ADC1_INP16
3

4
void adc1_init(void)
5
{
6
  RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN;  // PortA aktivieren
7
  RCC->AHB1ENR |= RCC_AHB1ENR_ADC12EN;  // dto. ADC_12
8
  RCC->D3CCIPR |= RCC_D3CCIPR_ADCSEL_1; // per_clk ADC_12 enable
9
  
10
  GPIOA->MODER |= ANALOG_IN;        // PA0 analog IN
11

12
  ADC12_COMMON->CCR = 
13
                ADC_CCR_PRESC_3 |   // Vorteiler /32
14
                ADC_CCR_CKMODE_1;   // Takt von per_clk
15
  
16
  ADC1->CR =    ADC_CR_BOOST |
17
                ADC_CR_ADVREGEN ;
18
  ADC1->SQR1 =  ADC_PA0_KANAL << ADC_SQR1_SQ1_Pos; // Eingangsanwahl
19
 
20
  ADC1->CFGR =  ADC_CFGR_RES_1 |    // 12 Bit
21
                ADC_CFGR_JQDIS |
22
                ADC_CFGR_OVRMOD |  
23
                ADC_CFGR_CONT;      // kontinuierlich
24
  ADC1->CR |=   ADC_CR_ADEN |
25
                ADC_CR_ADSTART;
26
}

Habe ich ein Bit vergessen oder muß eine andere Reihenfolge gewählt 
werden?
Gast #6150890
Lesenswert?

Dieter schrieb:
> Nur der H7 scheint bockig zu sein.
Das sehe ich auch so, deine Konfiguration ist erstmal in Ordnung, aber 
es scheint ihm irgendwas zu fehlen. Lösche einfach mal das EOC-Flag und 
schaue, ob er danach ne weitere Wandlung startet, falls ja hast du ne 
Spur.
Gast #6152119
Lesenswert?

Herausgefunden habe ich, dass
1
  ADC12_COMMON->CCR = 
2
                ADC_CCR_PRESC_3 |   // Vorteiler /32
3
                ADC_CCR_CKMODE_1;   // Takt von per_clk
doppelt gemoppelt ist. ADC_CCR_CKMODE_1 muss entfallen!
Jetzt läuft der ADC durch.
Freude kommt dennoch nicht auf: Die Kanalanwahl funktioniert nicht. 
Egal, was ich am vorgesehen Eingang anlege, der Messwert wackelt 
irgendwo bei 400.
Ein richtiges Kuckucksei dieser H750.

Matthias S. schrieb:
> Oh doch. Spätestens beim zweiten Kanal gehts nicht mehr ohne.

Habe ich letztens beim F746 auch gemacht; kein Problem!
Gast #6152132
Lesenswert?

Dieter schrieb:
> Egal, was ich am vorgesehen Eingang anlege, der Messwert wackelt
> irgendwo bei 400.
Klingt für mich als sein keine Signalmasse angeschlossen bzw. der ADC 
hat keinen Bezug zum Signal.

> ADC_CCR_CKMODE_1 muss entfallen!
Demnach läuft er jetzt im Asynchronous Mode? Oder hast du einen anderen 
Synchronous Mode gewählt?
Gast #6157219
Lesenswert?

Kleiner Hinweis:
Schau dir mal das Register ADCx->PCSEL an.

RM0433, 24.4.12 Channel preselection register (ADC_PCSEL)
For each channel selected through SQRx or JSQRx, the corresponding 
ADC_PCSEL bit must be previously configured.
Gast #6158395
Lesenswert?

STM32-EXPERTE schrieb im Beitrag #6157219:
> Schau dir mal das Register ADCx->PCSEL an.

Vielen Dank. Zwischenzeitlich hatte ich es auch schon gefunden.
Anschließend gab es gleich neue Probleme. In ADC1->SMPR2 lässt sich die 
Sampling-Zeit nur auf 0 oder 1 einstellen. Längere Zeiten stoppen den 
ADC.
Beim Versuch, eine automatische Mittelwertbildung über ADC1->CFGR2 
einzustellen, bleibt der ADC ebenfalls stehen.
Hast du dazu noch einen STM32-Expertentipp?

Johnny B. schrieb:
> Tja; mit Cube und HAL läuft der ADC normalerweise gleich out-of-the-box.

Probiere es aus und berichte, wo in der HAL der Fehler steckt ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren