Vielleicht kann mir jemand aus dem Forum bei einem ganz speziellen
Problem helfen.
Ausgangssituation:
4 verschiedene Computer unter Linux (Porteus Live-Linux mit Kernel
4.9.0) jeweils getestet mit 32 und 64 Bit und alle denselben Fehler !!!
Programmieradapter:
- original STMicro ST-LINK/V2
- Chinaclone ST-LINK v2 (mit Update von ST und ohne Update von ST)
- ST-Link eines Nucleo-Boards
- ST-Link eines Discoveryboards
Ursprünglich hat mal das nachfolgende Problem funktioniert und jetzt
nachdem ich Daten, Installationen und eigene Programme zusammenfasse und
dokumentiere funktioniert etwas erschreckenderweise nicht mehr, was vor
3 oder 4 Jahren (und anderem Linuxkernel) funktioniert hatte.
Was funktioniert:
Flashen eines STM32F4xx funktioniert in jeglicher Konstellation
problemlos (auch ein schwarzes STM32F407 Chinaboard).
Lange Zeit habe ich mit der Live-Version STM32F103 (Eigenbauboard und
BluePill) nur mittels Bootloader geflasht, ebenso STM32F030.
Jetzt wollte ich (im Zuge des Zusammenfassens) eben auch per ST-Link V2
flashen und das will nicht mehr, egal welche Version von st-flash
(Texane) ich installiert habe (Versionen von 1.2 bis 1.5), es will
einfach nicht.
Egal ob Cortex M0 oder M3.
In jedem Fall zeigt sich folgendes:
Anstehendes dauerndes Reset am Zielsystem und Flashversuch (mit
Mass-Erase) ausgeführt (funktioniert natürlich nicht), Programmer von
USB-Anschluss getrennt und wieder eingesteckt, erneuter Flashversuch =>
Programm wird korrekt geflasht.
Nur diese gerade eben beschriebene Vorgehensweise flasht mein Zielsystem
(was für mich natürlich inakzeptabel ist).
Was ich nicht verstehe ist, dass dieselbe Konstellation (mit gleicher
Zielhardware) mit einer älteren Linuxversion einmal funktioniert hatte
(welche weiß ich nicht mehr, aber als nächsten Schritt werde ich ältere
Live-Versionen mit älteren Kerels ausprobieren).
Kann sich jemand darauf einen Reim machen und hat vielleicht einen Tip?
Ich hatte schon ein Programm geschrieben, der den angeschlossenen
Programmer auf dem USB sucht und diesen gezielt zurück setzt was leider
jedoch auch nicht funktioniert!
Gibt es ein alternatives Konsolenprogramm zum Flashen unter Linux (ein
freies Open-Source) das ich nicht kenne und verwenden kann?
Du hättest wenigstens die Fehlermeldung zeigen sollen.
Ich habe mit dem Programm kein Probem. Was stellt denn dein Target mit
der SWD Schnittstelle an. Deaktiviert es diese etwa (bei Cube-MX ist das
der Default)?
Es könnte hilfreich sein, dein Programm so umzuschreiben, dass es nach
dem Reset ein paar Sekunden wartet, bevor es die SWD Schnittstelle
deaktiviert.
Alternativ kannst du den Boot0 Pin auf High setzen, um zu verhindern,
dass die SWD Schnittstelle deaktiviert wird. Der Bootloader lässt sie
aktiv.
> Gibt es ein alternatives Konsolenprogramm zum Flashen unter Linux
Das naheliegendste Programm wäre wohl der STM32 Cube Programmer. Für die
GUI brauchst du Oracle JRE 8, das darin enthaltene Kommandozeilentool
läuft auch mit anderen Java Versionen.
https://www.st.com/en/development-tools/stm32cubeprog.html
Das Kommandozeilentool ist
/opt/STM32CubeProgrammer/bin/STM32_Programmer.sh
Für dieses Programm musst du allerdings wahrscheinlich die Firmware
deines ST-Link aktualisieren. In der GUI sind dazu nur wenige
offensichtliche Klicks nötig, geht auch mit dem China-Stick.
Stefanus F. schrieb:> Ich habe mit dem Programm kein Probem. Was stellt denn dein Target mit> der SWD Schnittstelle an. Deaktiviert es diese etwa (bei Cube-MX ist das> der Default)?
Ich werkel mit libopencm3... für das Flashen mit texane st-flash habe
ich jetzt ein "Bare-Metal" Version eines einfachen Blinkprogramms
gemacht. Geht auch nicht.
Eine ältere Liveversion (mit Kernel 3.17.4) funktioniert lustigerweise
problemlos (wobei ich irgendwie nicht so recht daran glaube, dass der
Kernel schuld daran ist, sondern irgendein nachgeladener Treiber).
Stefanus F. schrieb:> Alternativ kannst du den Boot0 Pin auf High setzen, um zu verhindern,> dass die SWD Schnittstelle deaktiviert wird. Der Bootloader lässt sie> aktiv.
Werde ich mit der Bluepill ausprobieren (bei meinem Eigenbauboard wird
Booto und Boot1 über einen ATtiny13 gesteuert, der den Bootloadermodus
aktiviert. Auf diesem Board sind SWDIO und SWCLK nur als gedachter
Rettungsanker vorhanden.
Stefanus F. schrieb:> Das naheliegendste Programm wäre wohl der STM32 Cube Programmer. Für die> GUI brauchst du Oracle JRE 8, das darin enthaltene Kommandozeilentool> läuft auch mit anderen Java Versionen.>> https://www.st.com/en/development-tools/stm32cubeprog.html>> Das Kommandozeilentool ist> /opt/STM32CubeProgrammer/bin/STM32_Programmer.sh
Werde ich ausprobieren wobei ich die GUI nicht benötige. Allerdings muß
ich gucken, ob der Cubeprogrammer freie Software ist, ansonsten hat es
sich für mich da dann erledigt (weil ich das LiveLinux weitergeben
möchte).
Ralph S. schrieb:> Gibt es ein alternatives Konsolenprogramm zum Flashen unter Linux (ein> freies Open-Source) das ich nicht kenne und verwenden kann?
OpenOCD fungiert nicht nur als GDB-Server, sondern man kann damit auch
flashen.
Warum es mit st-flash nicht geht ist schwer einzuschätzen. Hast du denn
die ST-Link Firmware auf dem neuesten Stand? Falls nicht würde ich das
als erstes mal aktualisieren.
Wenn du mal den genauen Konsolen-In- und Output von st-flash hier rein
packst kann ich es mal bei mir versuchen zu reproduzieren (mit einem 4.x
Kernel, wobei ich x nicht im Kopf habe aber es ist ein Arch-Linux, also
auf jeden Fall ein aktueller Kernel)
root@porteus:/home/mcu/develop/stm32f103/blinky# make flash
2
st-flash erase
3
st-flash 1.5.1-25-gcf67780
4
2019-05-02T20:30:21 INFO common.c: Loading device parameters....
5
2019-05-02T20:30:21 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
6
2019-05-02T20:30:21 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0 bytes (0 KiB) in pages of 1024 bytes
7
Mass erasing
8
st-flash write blinky.bin 0x8000000
9
st-flash 1.5.1-25-gcf67780
10
2019-05-02T20:30:21 INFO common.c: Loading device parameters....
11
2019-05-02T20:30:21 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
12
2019-05-02T20:30:21 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0 bytes (0 KiB) in pages of 1024 bytes
13
Unknown memory region
Nach dieser Aktion mit dem permanent betätigtem Reset gelingt ein
korrektes Flashen, wenn man Reset gedrückt hält und mit dem Aufruf den
Reset loslässt:
1
root@porteus:/home/mcu/develop/stm32f103/blinky# make flash
2
st-flash erase
3
st-flash 1.5.1-25-gcf67780
4
2019-05-02T20:32:47 INFO common.c: Loading device parameters....
5
2019-05-02T20:32:47 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
6
2019-05-02T20:32:47 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
7
Mass erasing
8
st-flash write blinky.bin 0x8000000
9
st-flash 1.5.1-25-gcf67780
10
2019-05-02T20:32:47 INFO common.c: Loading device parameters....
11
2019-05-02T20:32:47 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410
12
2019-05-02T20:32:47 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes
13
2019-05-02T20:32:47 INFO common.c: Attempting to write 1504 (0x5e0) bytes to stm32 address: 134217728 (0x8000000)
14
Flash page at addr: 0x08000400 erased
15
2019-05-02T20:32:47 INFO common.c: Finished erasing 2 pages of 1024 (0x400) bytes
16
2019-05-02T20:32:47 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id
17
2019-05-02T20:32:47 INFO flash_loader.c: Successfully loaded flash loader in sram
18
2/2 pages written
19
2019-05-02T20:32:47 INFO common.c: Starting verification of write complete
20
2019-05-02T20:32:47 INFO common.c: Flash written and verified! jolly good!
Ist der Flashvorgang einmal gelungen, bewirkt ein Betätigen des Resets,
dass anschließend ein Flashvorgang korrekt durchgeführt wird.
Dieses Verhalten ist bei allen benutzten Programmern (Chinaclone,
Originaler ST-Link und ST-Link der Nucleo und Discoveyboards) gleich.
Leider besitze ich kein Nucleo oder Discovery-Board mit STM32F103, hier
hätte ich dann ST-Link mit dem Nucleoboard noch getestet.
Ralph S. schrieb:> Ist der Flashvorgang einmal gelungen, bewirkt ein Betätigen des Resets,> dass anschließend ein Flashvorgang korrekt durchgeführt wird.
Klingt nach dem Klassiker: Wenn das Programm auf dem uC die
"WFI"-Instruktion benutzt, kann der ST-Link keine Verbindung aufbauen.
Der J-Link hat damit kein Problem. Einer der Gründe warum sich diese
Investition lohnt...
Dr. Sommer schrieb:> Wenn das Programm auf dem uC die> "WFI"-Instruktion benutzt
Tut es aber nicht !
Abgesehen davon funktioniert das alles korrekt mit alter Liverversion
und mit neuer eben nicht. Gerade habe ich Einen STM32F3xx probiert: Hier
funktioniert es (genauso wie oben bereits geschrieben mit F4)
Zock schrieb:> Da ist clone() drin bitte noch mal mit "-f"
-f zeichnet auch die Kindprozesse auf, dann sind die Ausgaben noch
länger (und clone sowieso).
Wie dem auch sei, strace mit Option -f
Mein Problem ist gefixed !
Das hier habe ich im Netz gefunden (aber den Link dazu finde ich nicht
mehr).
Die Datei common.c um einen Eintrag ergänzen hat es gebracht:
1
diff --git a/src/common.c b/src/common.c
2
index ebc1f8e..448c83d 100644
3
--- a/src/common.c
4
+++ b/src/common.c
5
@@ -628,6 +628,9 @@ int stlink_load_device_params(stlink_t *sl) {