Auch wenn ich nicht Howard Carpendale bin: Hello again.. (du ich moechte ... das Problem nicht sehn, viel zu schad ist die Zeit ... uhuhuuuuu) Aaalso, ich werkel mit einem STM32F030 und beschreibe aus diesem heraus seinen eigenen Flash-Speicher ab Adresse 0x8003800 (zum Ablegen von Daten - ich weiß dass der Flash nicht so oft beschrieben werden kann wie ein EEPROM). Das funktioniert auch alles supi... Einziger Wermutstropfen: wenn ich mittels st-flash write meinedatei.bin 0x800000 die Firmware update, sind auch die geloescht. Wie kann ich verhindern, dass beim reprogramming der Firmware der Bereich ab 0x800300 NICHT geloescht wird ?
Ohne es selber getestet zu haben würde ich es mal mit
1 | st-flash write asdf.bin 0x8000000 0x3800 |
versuchen. Der letzte Parameter wird jedenfalls bei st-flash --help als "<size>" bezeichnet. Edit: Ansonsten würde ich es mit OpenOCD versuchen. Da verwendet man meistens den Befehl "write_image erase firmware.bin 0x8000000", wobei das "erase" ebenfalls optional ist und falls nicht explizit gewählt, nur so viel in den Flash geschrieben wird, wie in der firmware.bin steckt.
:
Bearbeitet durch User
Ralph S. schrieb: > wenn ich mittels > > st-flash write meinedatei.bin 0x800000 > > die Firmware update, sind auch die geloescht. Wie kann ich verhindern, > dass beim reprogramming der Firmware der Bereich ab 0x800300 NICHT > geloescht wird ? Die Ausgaben von st-flash legen nahe, daß das Programm die Größe der zu schreibenden Firmware vorher testet und dann nur die Pages löscht, die nachher auch beschrieben werden sollen. Wenn dein Datenbereich auf einer Page nach der letzten von der Firmware benutzten anfängt, sollte st-flash den in Ruhe lassen.
Christopher J. schrieb: > Ohne es selber getestet zu haben würde ich es mal mit > st-flash write asdf.bin 0x8000000 0x3800 > versuchen. Der letzte Parameter wird jedenfalls bei st-flash --help als > "<size>" bezeichnet. ... das war das erste was ich versucht hatte:
1 | stm32@linux:/home/f030_example/flashwrite# st-flash write flashwrite.bin 0x8000000 0x3800 |
2 | 2016-11-16T23:31:02 WARN src/stlink-sg.c: Failed to find an stlink v1 by VID:PID |
3 | 2016-11-16T23:31:02 ERROR src/stlink-sg.c: Could not open stlink device |
Scheinbar sucht er hier einen st-link v1 (den ich nicht habe) Christopher J. schrieb: > Ansonsten würde ich es mit OpenOCD versuchen. Da verwendet man meistens > den Befehl "write_image erase firmware.bin 0x8000000", wobei das "erase" Hmmm, ich hab mir noch keine Gedanken darüber gemacht, wie ich openocd über ein Makefile laufen lassen kann ! Axel S. schrieb: > Wenn dein Datenbereich auf einer > Page nach der letzten von der Firmware benutzten anfängt, sollte > st-flash den in Ruhe lassen. leider tut er genau das eben nicht ! Kann das vllt. auch daran liegen, dass ich im Linkerscript den ganzen Speicherbereich angebe und im erzeugten Hexfile des Compilats die höchste Adresse angegeben ist (und deshalb alles gelöscht wird). ===> Hexfile genauer ansehen und Linkerscript verändern
Hexfile und Linkerscript überprüft, daran liegt es leider nicht !
Ralph S. schrieb: > ... das war das erste was ich versucht hatte: > stm32@linux:/home/f030_example/flashwrite# st-flash write flashwrite.bin > 0x8000000 0x3800 > 2016-11-16T23:31:02 WARN src/stlink-sg.c: Failed to find an stlink v1 by > VID:PID > 2016-11-16T23:31:02 ERROR src/stlink-sg.c: Could not open stlink device > > Scheinbar sucht er hier einen st-link v1 (den ich nicht habe) Sieht für mich nach einem Bug aus. Ralph S. schrieb: > Hmmm, ich hab mir noch keine Gedanken darüber gemacht, wie ich openocd > über ein Makefile laufen lassen kann ! Das hier ist mal ganz dreist aus der libopencm3 zusammenkopiert (Beispiel für F0-Disco):
1 | # Be silent per default, but 'make V=1' will show all compiler calls. |
2 | ifneq ($(V),1) |
3 | Q := @ |
4 | NULL := 2>/dev/null |
5 | endif |
6 | |
7 | OOCD ?= openocd |
8 | OOCD_INTERFACE ?= stlink-v2-1 |
9 | OOCD_TARGET ?= stm32f0x |
10 | |
11 | ifeq ($(OOCD_FILE),) |
12 | %.flash: %.elf |
13 | @printf " FLASH $<\n" |
14 | $(Q)(echo "halt; program $(*).elf verify reset" | nc -4 localhost 4444 2>/dev/null) || \ |
15 | $(OOCD) -f interface/$(OOCD_INTERFACE).cfg \ |
16 | -f target/$(OOCD_TARGET).cfg \ |
17 | -c "program $(*).elf verify reset exit" \ |
18 | $(NULL) |
19 | else |
20 | %.flash: %.elf |
21 | @printf " FLASH $<\n" |
22 | $(Q)(echo "halt; program $(*).elf verify reset" | nc -4 localhost 4444 2>/dev/null) || \ |
23 | $(OOCD) -f $(OOCD_FILE) \ |
24 | -c "program $(*).elf verify reset exit" \ |
25 | $(NULL) |
26 | endif |
Was OpenOCD wiederum mit "program firmware.elf" genau mit dem Flash anstellt weiß ich nicht aber du kannst dir das ja anpassen. Edit: $(NULL) vergessen ;)
:
Bearbeitet durch User
Ralph S. schrieb: > Wie kann ich verhindern, > dass beim reprogramming der Firmware der Bereich ab 0x800300 NICHT > geloescht wird ? Das hängt von deinem Flascher-Programm ab. Entweder kannst du ihm sagen, daß es nur die benutzten Sektoren löschen soll oder eben nicht, dann wird eben alles gelöscht, bevor dein Programm einprogrammiert wird. W.S.
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.