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.