Forum: Mikrocontroller und Digitale Elektronik sSTM32L053, ADC und libopencm3 will nicht so wie ich will


von Ralph S. (jjflash)


Lesenswert?

Wie der Betreff sagt: Ein STM32L0 will beim Auslesen des ADC nicht so, 
wie ich es will.

Mit den Familien F0, F1, F3 und F4 funktioniert das mit liboencm3 
folgendermaßen:

[ccode]
void adc_setup(void)
{
  rcc_periph_clock_enable(RCC_ADC1);

  adc_power_off(ADC1);             // ADC waehrend Konfiguration aus

  // Konfiguration fuer einfache Wandlung
  adc_disable_scan_mode(ADC1);
  adc_set_single_conversion_mode(ADC1);
  adc_disable_external_trigger_regular(ADC1);
  adc_set_right_aligned(ADC1);

  adc_power_on(ADC1);
  delay(1);

  adc_reset_calibration(ADC1);
  adc_calibration(ADC1);

  delay(1);
}


int main(void)
{
  uint8_t adc_array[16];
  uint16_t mwert;
  .
  .
  .
  adc_setup();
  adc_array[0]= 0;                                  // ADC1 , Input 0
  adc_set_regular_sequence(ADC1, 1, adc_array);
  .
  .
  .
  adc_start_conversion_direct(ADC1);
  while (!(adc_eoc(ADC1)));                       // warten bis Wandlung 
fertig

  mwert = adc_read_regular(ADC1);                 // ADC-Wert holen
  .
  .
  .
}
[/code]

Hierzu wird aus der Library die Datei adc_common_v1.c hinzugelinkt. Für 
die L0 - Familie gibt es eine adc_common_v2.c. Diese hat aber (fast 
schon logischerweise) einige Funktionen der v1 nicht.

Natürlich habe ich (wider besseren Wissens) versucht, die v1 
hinzuzulinken, funktioniert aber mit einem L0 (erwartungsgemäß) nicht.

Ewiges suchen, lesen des Datenblatts, kontaktieren von Tante Gugel waren 
erfolglos.

Dann bin ich hergegangen und habe mir aus der CubeMx HAL die Strukturen 
herauskopiert und diese dem libopencm3 Projekt hinzugefügt und den ADC 
so programmiert, wie man das mit der HAL macht.

Das hat funktioniert !

Aber schön ist anderst !

Ich würde das gerne alleine mit der libopencm3 machen, komme aber nicht 
zurande.

Wenn hier also jemand auch mit libopencm3 werkelt und das auch noch mit 
der L0 - Familie und einen Beispielcode (für adc_common_v2) hat wäre ich 
schon dankbar.

Und hey: bitte bitte nehmt Abstand von: "Man arbeitet auch nicht mit 
libopencm3" oder "wieso nimmst du dann nicht HAL".

Mein Programm, das auf einem L053 läuft, ist fertig (und läuft jetzt 
halt mit einer "unschönen" Sequenz).

Mir gehts hier schlicht darum, dass ich das gerne meinen 
Funktionalitäten hinzufügen kann (mit libopencm3 only)

Gruß,

JJ

PS an Stefan: Ja ich kenne dein Buch, ja ich habe mir deine Sequenzen zu 
L0 angesehen, ja das geht so, ich will es aber dennoch mit libopencm3 
haben. By the way:

Bei deinen Anleitungen habe ich auch das hier gefunden:
1
    // Disable the ADC
2
    if (READ_BIT(ADC1->ISR, ADC_ISR_ADRDY))
3
    {
4
        SET_BIT(ADC1->ISR, ADC_ISR_ADRDY);
5
    }

Verstehe ich nicht ! Wenn das Flag gesetzt ist, muß ich es nicht noch 
einmal setzen. Zumindest bei einem L053 war dieses nicht notwendig.

Der direkt nachfolgende Code
1
    if (READ_BIT(ADC1->CR, ADC_CR_ADEN))
2
    {
3
        SET_BIT(ADC1->CR, ADC_CR_ADDIS);
4
    }

hatte gereicht.

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.