st-linkv2 (china) mit st-flash (linux) nicht alles loeschen

OP #4795640
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 ?
#4795766
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.
#4795786
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.
OP #4795794
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
#4795805
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 ;)
Gast #4797946
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren