Forum: Mikrocontroller und Digitale Elektronik GD32F303: Bootloader der Originalfirmware für Open Source Projekt nutzen


von Hochsitz C. (hochsitzcola)


Lesenswert?

Ich bin gerade dabei, eine Firmware für E-Bike Controller der Fa. Bafang 
zu schreiben. Über SWD geflasht funktioniert das bereits, es ist aber 
für Otto-Normal-User eine riesige Hürde, den Controller 
auseinanderzuschrauben, ggf. Vergussmasse wegzupulen um dann einen SWD 
Programmer anzuschließen. Bafang macht Firmwareupdates über CAN. Tool 
und Firmwarefiles findet man einfach im Internet.
Jetzt möchte ich es ermöglichen, die offene Firmware über diesen Weg zu 
flashen. Da die Prozessoren nicht lesegeschützt sind, kann man sie 
leicht auslesen. Die offiziellen Update-Files werden 1:1 in den 
Flash-Speicher geschrieben, da ist also zum Glück nichts verschlüsselt. 
Das Programm startet offensichtlich an Adresse 0x08004000, auch wenn 
noch 32 Bytes davor geschrieben werden, die aber wohl nur zum Abgleich 
der Hardwareversion dienen.
Ich habe mir jetzt gedacht, ich schreibe meine Firmware einfach an diese 
Startadresse und der Bootloader springt die dann schon an, leider 
rebootet der Prozessor so ständig. Im Bootloader blinkt eine LED auf dem 
Board nervös, daher kann man das schön sehen. :-(

hier gibt es den Flash-Dump des Controllers, ein Bafang-Update-File und 
natürlich mein Projekt:
https://github.com/stancecoke/BAFANG_HUB_GD32F303RCT6/commit/77195818d6f7622e33b4172cb34941b24be92ce8

Ich habe es mit einem anderen Bootloader probiert, da hat es 
funktioniert, das Verschieben der Startadresse und der Interrupt-Vektor 
Offset scheinen korrekt implementiert zu sein. Auch wenn es 
interessanterweise relevant ist, an welcher Stelle im Code der 
Interrupt-Vektor Offset gesetzt wird. Direkt als erstes nach dem int 
main(void){ geht es nicht, gleich am Anfang der SystemInit() Funktion 
geht es....

Hat jemand eine Idee, warum der Prozessor immer rebootet? Ist das eher 
ein Bug in meinem Programm, das ständig einen Reset auslöst, oder checkt 
der Bootloader irgendwie, ob eine bekannte Firmware vorliegt und wenn 
der Check fehlschlägt, wird rebootet?

Gruß
hochsitzcola

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hochsitz C. schrieb:
> Hat jemand eine Idee, warum der Prozessor immer rebootet?

Im Debugger geprüft ob dein Code (Reset_Handler) überhaupt gestartet 
wird? Erwartet der Bootloader eine Checksum (CRC)?

von Alexander (alecxs)


Lesenswert?

Genau, habe das schon irgendwo mal gelesen... hier (NationZ)

Beitrag "Re: ALLPOWERS S2000 PRO Reparaturhilfe"

von Hochsitz C. (hochsitzcola)


Lesenswert?

Niklas G. schrieb:
> Im Debugger geprüft ob dein Code (Reset_Handler) überhaupt gestartet
> wird?

Ja, der Reset Handler wird angesprungen.
https://github.com/stancecoke/BAFANG_HUB_GD32F303RCT6/blob/77195818d6f7622e33b4172cb34941b24be92ce8/gcc_startup/startup_gd32f30x_hd.S#L23

also wird es wohl nicht am Bootloader liegen, sondern an meinem Code 
liegen?

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hochsitz C. schrieb:
> also wird es wohl nicht am Bootloader liegen, sondern an meinem Code
> liegen?

Klingt so. Ist doch super, debugge es step-by-step und du siehst wo es 
rausfliegt. Ggf. direkt am Anfang vom Reset_Handler die Interrupts 
abschalten (cpsid i), eventuell macht der Bootloader das nicht und 
irgendeine aktivierte Peripherie löst einen Interrupt aus der ins 
Nirvana geht. Auch immer das VTOR im Auge behalten.

Vielleicht ist auch Takt, Flash Wait States, ... Komisch konfiguriert 
vom Bootloader was dein Programm nicht mag.

von Hochsitz C. (hochsitzcola)


Lesenswert?

Ich werde wohl erst mal mit einem einfachen Blink-Beispiel anfangen, um 
zu schauen, ob das prinzipiell läuft, oder doch irgendwie der Bootloader 
reinspuckt.

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.