Forum: Mikrocontroller und Digitale Elektronik STM32 programmieren bootloader


von har (Gast)


Lesenswert?

Hallo,

ich verwende einen STM32F303 und habe einen Code geschrieben, indem 
einfach nur eine LED eingeschaltet wird. Aus diesem Code habe ich ein 
File erstellt, welches 1160 Hex-Zahlen beinhaltet.

Weiters habe ich ein Programm geschrieben, welches mit dem Bootloader 
über die UART kommuniziert und alle Commands (Get, Read Memory, Write 
Memory,..) wie im Datenblatt AN3155 beschrieben, beinhaltet.

Nun bräuchte ich Hilfe, da ich nicht genau weiß, wie ich den STM32F303 
mittels dem File programmieren soll. Zwei Dinge sind mir dabei etwas 
unklar:
1) Wenn ich es richtig verstanden habe, sollte es mit dem "Write 
Memory"-Command funktionieren. Nur leider kann ich mit diesem Befehl nur 
bis zu 256 Bytes in den RAM oder Flash-Speicher schreiben. Aber wie 
bereits erwähnt, hat das eine erstellte File aber 1160 Hex-Zahlen...
2) Kann mir jemand allgemein die Vorgehensweise zum flashen erklären? 
Muss ich einfach den "Write Memory"- und anschließend den "Go"-Befehl 
ausführen und das war's dann?

Noch ein Hinweis: Ich weiß, dass es bereits Programme zum runterladen 
gibt, die das machen, was ich nun versuche zu ertellen. Ich möchte das 
aber gerne selber schaffen...

Danke für eure Hilfe!

von jiokd (Gast)


Lesenswert?

>Nur leider kann ich mit diesem Befehl nur
>bis zu 256 Bytes in den RAM oder Flash-Speicher schreiben.

Immerhin!

Dieses "write mem" hat sicher einen Parameter, der die Zieladresse 
definiert. Was hältst Du davon, den geeignet zu setzen?
Damit n Blöcke  a 256Bytes + einen Block mit dem Rest schreiben.

Zu dem Thema gibt es bei ST App-Note(s). Hast Du die konsultiert?


>Ich möchte das aber gerne selber schaffen...

Das ist löblich, schliesst aber nicht aus bei einem solchen Programm in 
den
Source-Code zu spicken, wenn man nicht mehr weiter weiss.

von Joe F. (easylife)


Lesenswert?

har schrieb:
> 1) Wenn ich es richtig verstanden habe, sollte es mit dem "Write
> Memory"-Command funktionieren. Nur leider kann ich mit diesem Befehl nur
> bis zu 256 Bytes in den RAM oder Flash-Speicher schreiben. Aber wie
> bereits erwähnt, hat das eine erstellte File aber 1160 Hex-Zahlen...

Du programmierst in 256 Byte Blöcken,
in deinem Fall also 5 Blöcke (= 1280 Bytes).
Im letzten Block füllst du die Bytes nach deiner Firmware mit 0xFF auf.

Die Adresse beim Write Memory command inkrementiers du für jeden Block 
um 256.
Der erste Block hat die Adresse 0x08000000.

Bevor du einen Block schreiben kannst, musst du den entsprechenden 
Speicherbereich im Flash erstmal erasen.
Es gibt 2 Erase Commands (Erase und Extended Erase), am besten erstmal 
mit Extended Erase versuchen, manche STM32 verstehen das "normale" 
Erase-Kommando nicht (wird dann mit einem NACK beantwortet).

> 2) Kann mir jemand allgemein die Vorgehensweise zum flashen erklären?
> Muss ich einfach den "Write Memory"- und anschließend den "Go"-Befehl
> ausführen und das war's dann?

Richtig.
Du springst nach dem schreiben der Firmware mit dem Go-Command einfach 
an die Adresse 0x08000000.

Wenn man es richtig gut machen will, liest man vor dem Go die 
geschriebenen Firmware-Blöcke nochmal mit Read Memory aus, um zu prüfen 
ob alles korrekt geschrieben wurde bevor man mit Go den Bootloader mode 
verlässt.
Wenn ein Fehler passiert ist, könnte die Firmware dann nochmal 
geschrieben werden.

von har (Gast)


Lesenswert?

Vielen Dank, die Tipps haben mir sehr geholfen! Es funktioniert!!

Nun hätte ich noch eine Frage:
Das ganze funktioniert, wenn ich den Write- sowie Go-Befehl an Adresse 
0x08000000 durchführe.
Aber leider kann ich die Daten nicht an eine beliebige Adresse schreiben 
und ausführen.
Im Grunde sollte die Vorgehensweise exakt die gleiche sein, nur dass ich 
halt eine andere Adresse angebe, oder?

von Joe F. (easylife)


Lesenswert?

Das funktioniert nicht, denn beim Booten erwartet der Bootloader an 
0x08000000 (bzw. an 0x08000004) eine Adresse, an der dann ausführbarer 
Code zu finden ist. Ausserdem muss der Code immer für den entsprechenden 
Speicherbereich compiliert sein, sonst stimmen die verwendeten Adressen 
nicht mehr.

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.