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.eat0420c/Cortex-M3-Errata-r2p0-v2.pdf 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...
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.
Aber der Cortex-M4 ist von dem LDRD Bug doch gar nicht betroffen...
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.