Forum: Mikrocontroller und Digitale Elektronik STM32 "Autostart"


von Robin D. (robin_d)


Lesenswert?

Morgen zusammen,
nachdem ich vor einem Jahr angefangen habe mich mit den ARM Cortex-M 
Microcontrollern zu beschäftigen, habe ich am Samstag nun zum ersten mal 
ein Programm (Blink Led) auf den STM32F3Discovery programmiert/geflasht. 
Ich hab den STM32F3 mit einen externen STlink-V3 verbunden und mit der 
Software "STM32CubeProgrammer" programmiert/geflasht. Ich hab den 
ProgrammCounter auf 0x8000000 gesetzt und Run geklickt. Die Led blinkte 
wie geplant, ich habe die Verbindung getrennt und den STlink-V3 von 
Board getrennt. Nach dem ich es eine weile bestaunt hatte, habe ich die 
den Reset Button geklickt und die Led blinkte nicht mehr. Also habe ich 
alles wieder angeschlossen und mit der Software wieder verbunden. Ich 
hab den ProgrammCounter wieder auf 0x8000000 und Run geklickt, es lief 
wieder. Und wieder dasselbe nach einem Reset/Strom Trennung ist es ganz 
still. Und das ist jetzt der aktuelle Status.

Weitere Informationen (auch unwichtige Infos sind dabei):
---------------------
Vor einem Jahr habe ich angefangen ein eigenen Compiler zu 
Programmieren. Ich hatte dann noch den Assembler geschrieben, ein 
Debugger mit einen Simulator, welcher die Register und Arbeitsspeicher 
simuliert und ich habe getestet und getestet. Mein erstes Programm in 
meiner Programmiersprache lief auf einen AVR  Atmega328p. Nach dem das 
alles geklappt hatte wollte ich es auf den ARM Cortex-M Microcontrollern 
ausprobieren, nach Wochen mit den Dokumentationen hatte ich dann auch 
angefangen mein Compiler für die ARM Microcontrollern umzubauen.

Vor ca. 1 Woche kam dann meine Pakete mit den Controllern an :)
und ich habe direkt Donnerstag und Freitag Urlaub genommen.
Am Samstag war es dann soweit und ich hab mein erstes Programm auf ein 
STM32 programmiert/geflasht. Und die Freude war um so größer das die 
ganzen mühen eine LED zum blinken gebracht haben :D

Und jetzt sind wir beim Problem. Er braucht jetzt immer eine Starthilfe. 
Ich muss mit der Software verbinden und den ProgrammCounter auf 
0x8000000 setzen und Run klicken damit mein Programm läuft. In der 
Befürchtung das mein Compiler schuld hat habe ich eins in Assembler 
geschrieben und mit ARM-GCC compiliert ... selbes Ergebniss. Ich hab das 
auch noch an 2 weiteren STM32F401 ausprobiert ... selbes Ergebniss. Beim 
ersten habe ich es nochmal meinen Compiler probiert und beim zweiten nur 
mit ARM-GCC ... aber kein unterschied. Ein paar mal habe ich beim 
Flashen den haken in der Software angewählt "Run after programming" dann 
kommt eine Warn Box hoch mit "Core is locked up". Ein bisschen bin ich 
leider verzweifelt... Es funktioniert sowohl als auch nicht.

Hier ist einmal die Assembler Datei welche ich mit ARM-GCC übersetzt 
habe, welche meine LED an Port PA2 zum blinken bringt:
Der Sprunkpunkt "Wait_InSeconds_1" wurde von meinen Compiler generiert 
und ich diese Funktion einfach mal hier in die Assembler Datei mit 
verwendet.
https://github.com/Robinterra/blinkledYamaSTM32/blob/master/asm/program.S

Ich vermute einfach das mir noch wissen fehlt oder so... Vlt habe ich 
vor lauter lesen der Dokus auch einfach was übersehen und finde es 
nicht, daher ist mir jede Hilfe recht auch wenn diese erstmal nochmal 
die Grundlagen zu den ARM Cortex-M befasst. Vielen Dank :)

von pegel (Gast)


Lesenswert?

Robin D. schrieb:
> STM32F3Discovery

Robin D. schrieb:
> mit einen externen STlink-V3 verbunden

Wozu? Hast Du dabei wenigstens den internen STlink-V2 getrennt?
Oder gekillt?

von Robin D. (robin_d)


Lesenswert?

Wozu?
Da ich keine Erfahrung hatte wie der STlink angeschlossen wird... an 
welche Pins etc... In der Dokumentation (Theorie) ist das eine Sache, 
aber bevor ich den an meine STM32F401 anschließe wollte ich es einmal am 
Board ausprobiert haben. Und mir fehlt ein USB-Mini Kabel -.- aber das 
ist mir auch erst aufgefallen als ich das Board ohne STlink-V3 mit dem 
PC verbinden wollte

Hast Du dabei wenigstens den internen STlink-V2 getrennt?
Ja. Ich habe ihn getrennt.

Da ich heute wieder auf der Arbeit bin, habe ich Zugang zu einem 
USB-Mini Kabel und kann danach auch den STlink-V2 verwenden.

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Robin D. schrieb:
> Ich hab den ProgrammCounter auf 0x8000000 gesetzt

Das macht keinen Sinn. An dieser Stelle steht der initiale 
Stack-Pointer. Den kann man nicht ausführen. Danach kommt die 
ISR-Tabelle. Das Layout davon ist von der Hardware vorgegeben. Erst 
danach kommt der Programmcode. Es muss also im Flash an der Stelle 
0x8000000 der initiale Stack-Pointer stehen, an 0x8000004 die Adresse 
des Reset-Handler, dann die weiteren ISR-Adressen, dann der Code dieser 
Funktionen. Die Adressen in der ISR-Tabelle müssen alle das niedrigste 
Bit gesetzt haben, damit der Core sie als Thumb-Code erkennt.

von Robin D. (robin_d)


Lesenswert?

Dann scheint das vlt schonmal die richtige Richtung zu sein. Ich 
schreibe/flashe mein Programm direkt ab 0x8000000. Ich begebe mich dann 
mal nach der Arbeit auf die Suche wie dieses Layout auszusehen hat und 
melde mich dann danach mit hoffentlich positiven Nachrichten.

: Bearbeitet durch User
von Robin D. (robin_d)


Lesenswert?

Ich hab bisher folgenden Code aus den Beispielen gekonnt ignoriert. Ich 
vermute das ich das der erste Eintrag dann in den SP geschrieben wird...
der Zweite ist die Start Adresse meines Programms und dann der Platz 
"space" für die ISR Tabelle ... ist das so korrekt?
1
.word 0x200...
2
.word 0x800...
3
.space 0xe4
4
5
...
6
Programm ...

von Programmierer (Gast)


Lesenswert?

Ja, wobei es fehleranfällig ist die Adressen explizit anzugeben statt 
das den Linker machen zu lassen.

Hier: 
https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Project_template_.26_makefile 
wird ein Minimal-Assembler-Projekt für den STM32F103 gezeigt.

von Robin D. (robin_d)


Lesenswert?

Vielen Dank für die Unterstützung :)
Ich werde das ja dann in meinen Compiler hinterlegen müssen.
Die .space und .word muss ich dann auch noch in meinem Assembler 
hinzufügen.
Ein Linker habe ich noch nicht programmiert.

Werde also noch genug zu tun haben.

von Uwe Bonnes (Gast)


Lesenswert?

Programmzaehler fuer THUMB Befehle muss Bit 0 gesetzt haben!

von Robin DAndrea (Gast)


Lesenswert?

Alle Tipps haben sehr geholfen. Von "Programmierer":
Die Informationen das zuerst die Stackpointer adresse kommt und danach 
der Reset Handler etc.

Ich hab mein Assembler um .space und .data erweitert und nun kann ich es 
problemlos mit mein Compiler programmieren.

und auch deine Antwort "Uwe Bonnes" hat sehr geholfen, erst nach dem ich 
den 0 bit gesetzt habe, lief mein Programm auch nach dem ich den 
Microcontroller vom Strom getrennt habe. Vielen vielen Dank.

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.