Forum: Mikrocontroller und Digitale Elektronik st-linkv2 (china) mit st-flash (linux) nicht alles loeschen


von Ralph S. (jjflash)


Lesenswert?

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 ?

von Christopher J. (christopher_j23)


Lesenswert?

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
von Axel S. (a-za-z0-9)


Lesenswert?

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.

von Ralph S. (jjflash)


Lesenswert?

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

von Ralph S. (jjflash)


Lesenswert?

Hexfile und Linkerscript überprüft, daran liegt es leider nicht !

von Christopher J. (christopher_j23)


Lesenswert?

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
von W.S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.