mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 - LDRD Problem + Lösung


Autor: Michael Haustein (arm4arme)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich experimentiere gerade mit STM32 Value Line Discovery Board + Atollic 
True Studio herum.

Nachdem ich mich eigentlich recht gut unterwegs wähnte und schon einige 
Hürden mit der I2C Pheriperie überwunden hatte, mich sogar mit 
Strukturpointern angefreundet hatte, begegnete mir dieses Phänomen, was 
erst mal die ein herber Rückschlag wirkte:

Ich hatte mir ein Problem eingehandelt in I2C-Funktionen die vorher in 
dieser und anderen Programmen eigentlich schon stabil funktioniert 
hatten. Diese unscheinbare und eigentlich völlig unkritische wirkende 
Zeile hier war fast 2 Wochen mein Problem:

   I2C_Send7bitAddress(I2C1,i2c_adress, I2C_Direction_Receiver);

Nach dem Ausführen diese Zeile wurde immer wieder die lokale Variable 
"i2c_adress" gelöscht und das Programm blieb komplett hängen weil die 
nachfolgende while Bedingung nicht mehr "wahr" wurde:

Im Polling Mode folgt hier ja immer:
/* Test on EV6 and clear it */
while (!I2C_CheckEvent(I2C1, 
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
Aber diese Zeile hat nichts mit dem Problem zu tun...


Heute weiss woran das liegt. Schuld daran ist der ASM Befehl LDRD der im 
Zuge der Funktion I2C_Send7bitAddress() ausgeführt wird. Das entscheidet 
zumindest der GCC. Dieser Befehl aber ist buggy und sollte vom Compiler 
lieber vermieden werden. Aber das muss man dem erst einmal beibringen, 
wie ich später herausfinden sollte.

Beim Debuggen fiele mir im Disassembly der Befehl LDRD erstmalig auf, 
denn danach war die lokale Variable plötzlich 0x00. Als ich nachschaute, 
was dieser Befehl denn so tut, gelangte ich über ein paar Umwege dann zu 
diesem entscheidenden Link, fast schon durch Zufall. Von ARM selbst gibt 
es ein Document (Errata Notice) was ein Fehlverhalten des Cores erklärt. 
Man findet es hier: 
http://infocenter.arm.com/help/topic/com.arm.doc.e...

Die Lösung war schiesslich der Einsatz der Compiler Option
-mfix-cortex-m3-ldrd
in den Build Options des GCC.

Ich hoffe, diese Info hilft einigen von Euch weiter, die mit seltsamen 
Erscheinungen zu kämpfen haben. Es sind ja auch noch anderes Fehler im 
Cortex-M3 Core beschrieben. Man sollte solche Erratas tatsächlich nicht 
ignorieren...

Autor: Ewout Boks (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank !!!!!

 Ich hatte vergessen diesen fix beim compiler Anruf einzufügen.....hat 
mir 3 Tagen debuggen mit dem I2C CPAlv2 Biliothek auf STM32F373 
gekostet. Ach ja, so lernt man immer noch etwas neues.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

Da es geholfen hat, vermutlich doch.

Ist garnicht so selten, daß Bugs in neuere MCs mitgeschleift werden, 
wenn der Hersteller sie als nicht kritisch ansieht.
Oder wenn sie nur von einzelnen Bastlern reportet werden und nicht von 
einem Großkunden.

Autor: Heiko Jakob (heiko_j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...

Das STM32 value line Discovery hat aber nen M3. Genau gesagt nen 
STM32F100RB. Die Compileroption "-mfix-cortex-m3-ldrd" ist übrigens beim 
Aufruf mit "-mcpu=cortex-m3" implizit enthalten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.