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
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)?
Genau, habe das schon irgendwo mal gelesen... hier (NationZ) Beitrag "Re: ALLPOWERS S2000 PRO Reparaturhilfe"
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.