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?
Gast
#5828561
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.
Gast
#5828603
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)
UDEV-Ruke in /etc/udev/rules.d vorhanden?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Ich hab die passende Datei mal angehängt.
Mein Makefile beherbergt direkt aufeinanderfolgende Aufrufe: st-flash erase st-flash write blinky.bin 0x8000000 Targetsystem: BluePill Fehlermeldung 1 (ohne irgendetwas am BluePill gemacht zu haben):
1 | |
2 | |
3 | |
4 | |
5 | |
Ausgabe bei permanent betätigtem Reset:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
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.
Harry L. schrieb: > UDEV-Ruke in /etc/udev/rules.d vorhanden? Rules sind vorhanden:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Inhalt 49-stlinkv2.rules:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Inhalt lsusb:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
Das heißt, die VID und PID des Programmers stimmt (natürlich) auch überein. Abgesehen davon hab ich mich hierfür als root eingeloggt.
Mach mal einen strace für den Gutfall und den Schlechtfall.
Weil die Ausgaben von strace lang sind, im Anhang
Gast
#5828726
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...
Gast
#5828734
Ralph S. schrieb: > Weil die Ausgaben von strace lang sind, im Anhang Da ist clone() drin bitte noch mal mit "-f"
Gast
#5828754
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
Gast
#5828850
Ralph S. schrieb: > Wie dem auch sei, strace mit Option -f Auf den ersten und zweiten Blick sehe ich da nix, man könnte mit wireshark noch mal den USB-Traffic sniffen, aber usb ist nicht mein Spezialgebiet, allerdings reicht da manchmal auch nachdenken und schlussfolgern. Der Unterschied ist hier: 1399 timerfd_settime(8, TFD_TIMER_ABSTIME, {it_interval={0, 0}, it_value={228, 759814000}}, NULL) = 0 1399 ioctl(9, USBDEVFS_SUBMITURB, 0x84225f8) = 0 1399 poll([{fd=6, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLOUT}], 3, 60000) = 1 ([{fd=9, revents=POLLOUT}]) 1399 ioctl(9, USBDEVFS_REAPURBNDELAY, 0xbf92563c) = 0 1399 timerfd_settime(8, 0, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 1399 ioctl(9, USBDEVFS_REAPURBNDELAY, 0xbf92563c) = -1 EAGAIN (Resource temporarily unavailable) 1399 stat64("/etc/localtime", {st_mode=S_IFREG|0777, st_size=2335, ...}) = 0 1399 write(2, "2019-05-02T21:49:58 ", 20) = 20 1399 write(2, "WARN common.c: ", 15) = 15 1399 write(2, "unknown chip id! 0x5fa0004\n", 27) = 27 1399 write(7, "\1", 1) = 1 1399 close(9) = 0 1399 read(6, "\1", 1) = 1 1399 poll([{fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 2, 0) = 0 (Timeout) 1399 write(7, "\1", 1) = 1 ---------------------------------------------------- 1446 ioctl(9, USBDEVFS_SUBMITURB, 0x91035f8) = 0 1446 poll([{fd=6, events=POLLIN}, {fd=8, events=POLLIN}, {fd=9, events=POLLOUT}], 3, 60000) = 1 ([{fd=9, revents=POLLOUT}]) 1446 ioctl(9, USBDEVFS_REAPURBNDELAY, 0xbfe8990c) = 0 1446 timerfd_settime(8, 0, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0 1446 ioctl(9, USBDEVFS_REAPURBNDELAY, 0xbfe8990c) = -1 EAGAIN (Resource temporarily unavailable) 1446 stat64("/etc/localtime", {st_mode=S_IFREG|0777, st_size=2335, ...}) = 0 1446 write(2, "2019-05-02T21:52:29 ", 20) = 20 1446 write(2, "INFO common.c: ", 15) = 15 1446 write(2, "Device connected is: F1 Medium-d"..., 61) = 61 1446 stat64("/etc/localtime", {st_mode=S_IFREG|0777, st_size=2335, ...}) = 0 1446 write(2, "2019-05-02T21:52:29 ", 20) = 20 1446 write(2, "INFO common.c: ", 15) = 15 1446 write(2, "SRAM size: 0x5000 bytes (20 KiB)"..., 87) = 87 1446 rt_sigaction(SIGINT, {0x80494b0, [INT], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 1446 rt_sigaction(SIGTERM, {0x80494b0, [TERM], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 1446 rt_sigaction(SIGSEGV, {0x80494b0, [SEGV], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 1446 clock_gettime(CLOCK_MONOTONIC, {376, 129890934}) = 0
Gast
#5829799
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
Warum auch immer das hier hilft, es hilft. Vielen Dank an alle die mir Ratschläge gegeben haben.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.