Forum: Mikrocontroller und Digitale Elektronik STM32F4 In Application Programming


von Peter P. (Gast)


Lesenswert?

Hallo, ich habe da mal eine Frage?

Ich möchte einen Can-Bootloader für den STM32F4 schreiben. Der 
Bootloader muss ja im Speicher an die Stelle 0x8000000. Das wenn ich den 
Bootloade schreibe. muss ich ein ganz normales Projekt erstellen ohne 
etwas am Linker zu ändern etc.

Für die User Application sieht das ja etwas anders aus. Was muss ich da 
alles ändern?

Die nächste Frage wäre: Nachdem eine Spannung angelegt wird, startet der 
Chip immer an 0x8000000 und ich muss aus dem Bootloader in die 
Userapplication springen? Oder startet der Code in der Stelle der User 
Application und man muss von dieser in de Bootloader springen...Das wäre 
mir nämlich lieber.

(Mod.: Tippfehler in Topic korrigiert)

von holger (Gast)


Lesenswert?

>Die nächste Frage wäre: Nachdem eine Spannung angelegt wird, startet der
>Chip immer an 0x8000000 und ich muss aus dem Bootloader in die
>Userapplication springen? Oder startet der Code in der Stelle der User
>Application und man muss von dieser in de Bootloader springen...Das wäre
>mir nämlich lieber.

Der Bootloader startet. DU ganz alleine bist dafür verantwortlich
in die Applikation zu springen. Wann und warum ist deine Sache.
Und DU bist auch dafür verantwortlich hinter dir aufzuräumen
und alle Ressourcen die der Bootloader benutzt abzuschalten
bevor du in die Applikation springst.

>Für die User Application sieht das ja etwas anders aus. Was muss ich da
>alles ändern?

Du musst ein Linker Script erstellen was den Bootloader berücksichtigt.
Die können ja nicht im selben Speicher liegen.

Damit ist deine Frage beantwortet.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Nur ergänzend und evtl. auch für den Anwendungsfall überflüssig: Es gibt 
auch die Möglichkeit, den Bootloader in einen anderen Adressbereich zu 
legen, indem man die Einsprungadresse im zweiten Eintag der Cortex M3 
Vektortabelle (Reset) auf die Startadresse des Bootloaders zeigen lässt. 
Beim Schreiben der Nutzeranwendung merkt sich der Bootloader die 
Startadresse der Anwendung (zweites DWORD), schreibt diese zur späteren 
Verwendung in einen reservierten Bereich und "biegt" vor Beschreiben des 
Flash-Speichers die Resetadresse wieder auf sich selbst um. Ist die 
Startbedingung für den Bootloader nicht erfüllt, liest der Bootloader 
die vorher gespeicherte Startadresse der Nutzanwendung, beschreibt die 
bis dato veränderte Register mit "reset defaults", setzt den 
Stackpointer auf den Intialwert der Anwendung (erster Eintrag 
Vektortabelle) und verzweigt in das Anwendungsprogramm. Einen Bootloader 
so zu implementieren ist etwas schwieriger (initale Flashprogrammierung, 
Stackpointer, Vektortabelle des Bootloaders...). Vorteil ist jedoch, 
dass die Nutzanwendung ohne Änderung mit und ohne Bootloader 
funktioniert (vergleichbar mit der üblichen Vorgehensweise bei 
AVR/BOOTRST/IVSEL). Der Entwickler der Endanwendung muss lediglich den 
durch den Bootloader reduzierten Speicherplatz berücksichtigen, Flashen, 
Debuggen, Linker- und Compileroptionen bleiben ansonsten wie gehabt.

von Peter P. (Gast)


Lesenswert?

Hat vielleicht jemand ein Minimalbeispiel eines Bootloaders für mich?

von Steel (Gast)


Lesenswert?

Peter P. schrieb:
> startet der Code in der Stelle der User
> Application und man muss von dieser in de Bootloader springen...Das wäre
> mir nämlich lieber.

Nein, das wäre dir nicht lieber. Dann ist nämlich dein Chip "Tot" wenn 
das Flashen der User-App aus irgendwelchen Gründen mal nicht klappt oder 
die User-App sich wegen eines Softwarefehlers "äufhängt".

von Peter P. (Gast)


Lesenswert?

Hi nochmal,

ich bin jetzt schon etwas weiter... ich kann soweit Flash löschen und 
beschreiben. Als Protokoll möchte ich mein altes benutzen und anpassen, 
welches ich auch schon für die AVRs genutzt habe.

Jetzt möchte ich mir zum testen eine Blinky UserApp erstellen, welche 
ich zum Testen nutzen kann. Ich benutze CooIDE und habe in den 
Configurations unter Link bei IROM1  0x8004000 eingestellt und in der 
System_stm32f4xx.c

#define VECT_TAB_OFFSET  0x4000


laut Beispiel von ST ist das Alles, was nötig ist.

Wenn ich die App jetzt flashe und mit dem Debugger in den Speicher 
schaue, steht alles an 0x8000000 und nicht wie gewollt an 0x8004000.

funktionieren tut die App natürlich auch nicht, weil die Vectortabelle 
an der falschen stelle sitzt.... wenn ich die Vectortabelle zurückstelle 
und die linker Einstellung beibehalte gehts wieder...
Also scheint die Linkereinstellung ja keinerlei Auswirkung auf die 
Speicherposition zu haben...   Oder funktioniert das einfach nur nicht, 
weil mein ST-Link einfach immer an die Stelle 0x800000 schreibt?

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

In Map-File und evtl. Disassembly nachgeschaut, ob das erwartete 
Speicherlayout dort wiederzufinden ist?

von Peter P. (peter---p)


Angehängte Dateien:

Lesenswert?

Martin Thomas schrieb:
> In Map-File und evtl. Disassembly nachgeschaut, ob das erwartete
> Speicherlayout dort wiederzufinden ist?




Habe ich jetzt mal gemacht... Das Setzen der Vectortabelle klappt. Aber 
der Programmcode schaut merkwürdig aus (siehe Anhang)

wenn die Startadresse im Linker nicht ändere sieht alles ganz norml aus!

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Peter Pan schrieb:
> Martin Thomas schrieb:
>> In Map-File und evtl. Disassembly nachgeschaut, ob das erwartete
>> Speicherlayout dort wiederzufinden ist?
>
>
>
>
> Habe ich jetzt mal gemacht... Das Setzen der Vectortabelle klappt. Aber
> der Programmcode schaut merkwürdig aus (siehe Anhang)
>
> wenn die Startadresse im Linker nicht ändere sieht alles ganz norml aus!

Disassembly-Ansicht in Eclipse bringt nicht so wirklich weiter. Gemeint 
war das Map-File, das vom Linker erzeugt werden kann (vgl. Option -Map 
der Dokumentation zum Linker) und das Disassembly, das per objdump (vgl. 
Dokumentaiton zu Binutils) erzeugt wird. Kenne die IDE nicht und daher 
auch nicht die dafür notwendigen Einstellungen in den Dialogboxen aber 
die erforderlichen Werkzeuge sind Teil der von CoIDE genutzten GNU 
Toolchain, also auf dem Entwicklungsrechner vorhanden.

von Peter P. (peter---p)


Angehängte Dateien:

Lesenswert?

hier mal beide map files im anhang..
ich kenne mich damit nicht sonderlich gut aus, wie der ein oder andere 
an dieser stelle sicher schon gemerkt hat, aber  für ich sieht das 
relativ plausiebel aus.

von Peter P. (peter---p)


Lesenswert?

Scheinbar ein Problem mit dem integriertem Flashloader von CooIDE.

http://www.coocox.org/forum/topic.php?id=2553#post-7097

kann das jemand bestätigen?

von Michael (Gast)


Lesenswert?


von Peter P. (Gast)


Lesenswert?

Kenne ich aber mein stm hängt an nem 1 mbps can der onboard bootloader 
arbeitet default mit 125 kbps


Habe jetzt meine app mit cooflash an 0x8004000 flashen können an 
0x8000000 habe ich meinen unfertigen bootloader gepackt, der nur an 
0x8004004 springt... Und es blinkt!!!

Nur wenn ich die .elf flashe gehts nicht..... Die .bin funktioniert



Etweder ich durchblicke da was nicht oder es scheint tatsächlich einen 
bug zu geben

von Alfred (Gast)


Lesenswert?

Hallo Peter!

Ich habe vor eine ähnliche Projekt zu realisieren,
wo ich über CAN meinen uC flashen kann, ohne den onboard Bootloader zu 
benutzen.
Hat es bei dir geklappt?
Wie weit stehst du jetzt?
Hat wer vielleicht ein ähnliches Beispielprojekt wo ich Informationen 
finden kann?

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.