Forum: Mikrocontroller und Digitale Elektronik STLINK V2 und China Boards


von Ralph S. (jjflash)


Lesenswert?

Hallo und guten Abend,

ich "bastle" schon eine Weile an meiner eigenen (Textmode)IDE unter 
Linux. Mittlerweile habe ich hierfür auch ARM - STM32  und 8Bit STM8 
Controller hinzugefügt.

Beide kann ich mit einem Chinaclone STLINKV2 flashen.

Soweit FAST alles gut, aber eben nur FAST.

Ein Minimumboard STM32F103C8 Board geht sofort.

Ein Board auf dem ein Maple Leaf Mini Bootloader ist geht nicht sofort 
(ich will logischerweise nicht mit Maple Leaf Libraries hantieren). 
Hierfür muß ich den Bootloader entfernen.

Dieses gestaltet sich unter Linux (für mich) als unmöglich. Ich habe 
keine Software gefunden, die das "Protection readout" beim Löschen 
zurücksetzt. Dieses konnte ich leider nur unter Windows mit den 
originalen ST Programmen bewerkstelligen. Nachdem dieses gelöscht ist, 
funktioniert dieser Maple Clone auch.

Selbiges gilt für das Ultrabilligboard mit einem STM8S103F3 (1€ aus 
China). Auch hier kann ich mit dem STLINKV2 erst dann auf das Board 
zugreifen, wenn ich unter Windows zuvor das Readout protection Byte beim 
Löschen zurückgesetzt habe.

Unter Linux verwende ich

- für die STM32 Controller das Programm: st-flash
- für den STM8 Controller das Programm: stm8flash

Kennt jemand Programme unter Linux, bei denen ich bei neuen 
(unbehandelten) Chinaboards diese Protection Bytes löschen kann (ist 
halt "nervig" neue Boards erst an einen Windowsrechner hängen zu 
müssen).

Gruß,
Ralph

von Gerd E. (robberknight)


Lesenswert?

Mal OpenOCD probiert?

von Ralph S. (jjflash)


Lesenswert?

Hab ich... funzt nicht !

Auch ein Schreiben eines einzelnen Bytes (bspw. 0xaa beim STM8) an die 
Adresse im Speicher, die das Protectionbyte enthällt funktioniert nicht 
... Leider

von na Boar (Gast)


Lesenswert?

(ist halt "nervig" neue Boards erst an einen Windowsrechner
>hängen zu müssen).

Das St-Link Utility funktioniert WIMRE auch unter wine.

von Axel S. (a-za-z0-9)


Lesenswert?

Ralph S. schrieb:
> Unter Linux verwende ich
>
> - für die STM32 Controller das Programm: st-flash
> - für den STM8 Controller das Programm: stm8flash
>
> Kennt jemand Programme unter Linux, bei denen ich bei neuen
> (unbehandelten) Chinaboards diese Protection Bytes löschen kann (ist
> halt "nervig" neue Boards erst an einen Windowsrechner hängen zu
> müssen).

Wenn du ein J-Link hast, dann kannst du einen STM32xx mit dem JLinkSTM32 
Tool unlocken.

Ralph S. schrieb:
> Auch ein Schreiben eines einzelnen Bytes (bspw. 0xaa beim STM8) an die
> Adresse im Speicher, die das Protectionbyte enthällt funktioniert nicht

Kannst du das genauer ausführen? Hast du beachtet, daß du zwei Bytes 
schreiben muß, um die Protection ein- bzw. auszuschalten?

Ich habe gerade das gleiche Problem gehabt und mich geärgert, daß 
stm8flash beim Lesen eines geschützten STM8F103 ungerührt Bullshit liest 
und beim Schreiben mit einer unspezifischen Fehlermeldung abbricht. Auch 
ich mußte meinen ST-Link erstmal an das Notfall-Windows auf dem Laptop 
stöpseln um mit STVP zu schauen, was da los ist.

Ich gehe aber davon aus, daß es funktionieren sollte, die Protection 
durch Beschreiben der config area abzuschalten. Muß ich bei Gelegenheit 
mal ausprobieren.

von Ralph S. (jjflash)


Lesenswert?

na Boar schrieb:
> Das St-Link Utility funktioniert WIMRE auch unter wine.

... meines Wissens funktioniert ein serielles ST-LINK Gerät, ein USB 
ST-LINK/V2 funktioniert unter WINE deshalb nicht, weil von WINE aus 
keinen Zugriff auf USB hast...

Axel S. schrieb:
> Kannst du das genauer ausführen? Hast du beachtet, daß du zwei Bytes
> schreiben muß, um die Protection ein- bzw. auszuschalten?

Hab ich beachtet...

Das Problem ist, dass das Protectionbyte nur mit einem Löschvorgang 
geschrieben werden kann, dem Löschvorgang kann ich aber unter den 
CLI-Tools unter Linux eben nicht mitgeben, dass das POB geloescht wird.

Wie das die Windows-Tools von ST das machen weiß ich nicht.

Smile, im übrigen hab ich ja das eigentliche größere (und gleiche) 
Problem mit STM32... der STM8 ist ja (zumindest für mich einfach nur mal 
zum Ausprobieren gewesen).

By the way:

Ich such mich gerade dämlich nach dem Datenblatt eines STM8S103F. Es 
schwirren zwar ewig viele herum, aaaaaber:

Da steht dann bspw, dass die Adresse von UART1_BRR1 (Baudratenregister 
1) = 0x5232 ist, aber ich finde zu keinem der internen 
Peripherieregister die Bitbelegung und die Bedeutung dazu.

Kennt da jemand eine Quelle ?

von Max M. (maxmicr)


Angehängte Dateien:

Lesenswert?

Ralph S. schrieb:
> aber ich finde zu keinem der internen
> Peripherieregister die Bitbelegung und die Bedeutung dazu

Meinst du das hier?

von Ralph S. (jjflash)


Lesenswert?

Max M. schrieb:
> Meinst du das hier?

Vielen Dank, genau DAS ist das, was ich gesucht habe ! (Allerdings weiß 
ich noch nicht so recht, WIE TIEF ich einsteigen mag, UART, SPI und I2C 
halt ...

Danke noch mal .

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Ralph S. schrieb:
> ... meines Wissens funktioniert ein serielles ST-LINK Gerät, ein USB
> ST-LINK/V2 funktioniert unter WINE deshalb nicht, weil von WINE aus
> keinen Zugriff auf USB hast...
>

Man kann Code schreiben, der die Zugriffe auf libusb umsetzt:
https://github.com/UweBonnes/wine Branch stlink

von Axel S. (a-za-z0-9)


Lesenswert?

Axel S. schrieb:
> Ich gehe aber davon aus, daß es funktionieren sollte, die Protection
> durch Beschreiben der config area abzuschalten. Muß ich bei Gelegenheit
> mal ausprobieren.

Und funktioniert. Es gibt aber einen Trick. Hier ist, wie sich ein 
geschützter STM8S103F3 verhält (China-Board im Auslieferungszustand)

1
$stm8flash -c stlinkv2 -p stm8s103f3 -s opt -r opt.bin
2
Determine OPT area
3
Reading 64 bytes at 0x4800... OK
4
Bytes received: 64
5
6
$hd opt.bin 
7
00000000  71 71 71 71 71 71 71 71  71 71 71 71 71 71 71 71  |qqqqqqqqqqqqqqqq|
8
*
9
00000040
10
11
$stm8flash -c stlinkv2 -p stm8s103f3 -s flash -r flash.bin
12
Determine FLASH area
13
Reading 8192 bytes at 0x8000... OK
14
Bytes received: 8192
15
16
$hd flash.bin 
17
00000000  71 71 71 71 71 71 71 71  71 71 71 71 71 71 71 71  |qqqqqqqqqqqqqqqq|
18
*
19
00002000

Man beachte, daß alle Speicherbereiche scheinbar problemlos ausgelesen 
werden, es steht aber nur Müll (0x71) drin. Programmieren schlägt fehl:

1
$make
2
sdcc -mstm8 --max-allocs-per-node 1000 -DSTM8S103  -c blinky.c -o blinky.rel
3
sdcc -mstm8 --out-fmt-ihx  blinky.rel -o blinky.ihx
4
5
$make flash
6
stm8flash -c stlinkv2 -p stm8s103f3 -w blinky.ihx
7
Determine FLASH area
8
Writing Intel hex file 225 bytes at 0x8000... Tries exceeded
9
Makefile:29: recipe for target 'flash' failed
10
make: *** [flash] Error 255

Zum Unlocken müssen wir die Option-Area beschreiben. Allerdings reicht 
es nicht, nur das erste Byte zu setzen. Es müssen alle Optionbytes 
geschrieben werden; und zwar vor allem müssen die negierten Optionbytes 
auch negiert sein. Ich schreibe hier einfach die Defaultwerte rein.

1
$hd unlock.bin 
2
00000000  00 00 ff 00 ff 00 ff 00  ff 00 ff                 |...........|
3
0000000b
4
5
$stm8flash -c stlinkv2 -p stm8s103f3 -s opt -w unlock.bin
6
Determine OPT area
7
Writing binary file 11 bytes at 0x4800... OK
8
Bytes written: 11

Und schon funktioniert auch das Flashen wieder:

1
$make flash
2
stm8flash -c stlinkv2 -p stm8s103f3 -w blinky.ihx
3
Determine FLASH area
4
Writing Intel hex file 225 bytes at 0x8000... OK
5
Bytes written: 225
6
7
$stm8flash -c stlinkv2 -p stm8s103f3 -s flash -r flash.bin
8
Determine FLASH area
9
Reading 8192 bytes at 0x8000... OK
10
Bytes received: 8192
11
12
$hd flash.bin 
13
00000000  82 00 80 83 82 00 00 00  82 00 00 00 82 00 00 00  |................|
14
00000010  82 00 00 00 82 00 00 00  82 00 00 00 82 00 00 00  |................|
15
*
16
00000060  82 00 00 00 82 00 80 a4  82 00 00 00 82 00 00 00  |................|
17
00000070  82 00 00 00 82 00 00 00  82 00 00 00 82 00 00 00  |................|
18
00000080  cc 80 c0 ae 00 01 27 07  72 4f 00 00 5a 26 f9 ae  |......'.rO..Z&..|
19
00000090  00 00 27 09 d6 80 e0 d7  00 01 5a 26 f7 72 5f 00  |..'.......Z&.r_.|
20
000000a0  01 cc 80 80 72 5d 00 01  27 06 72 5a 00 01 20 0b  |....r]..'.rZ.. .|
21
000000b0  ae 50 05 f6 a8 20 f7 35  14 00 01 35 00 53 44 80  |.P... .5...5.SD.|
22
000000c0  35 20 50 07 35 20 50 08  35 20 50 05 35 07 53 47  |5 P.5 P.5 P.5.SG|
23
000000d0  35 9c 53 48 35 01 53 43  35 01 53 40 9a 8f 20 fd  |5.SH5.SC5.S@.. .|
24
000000e0  81 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
25
000000f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
26
*
27
00002000


Nachtrag: zum Locken des STM8 reicht es, 0xAA nach OPT0 zu schreiben:

1
$hd lock.bin 
2
00000000  aa                                                |.|
3
00000001
4
5
$stm8flash -c stlinkv2 -p stm8s103f3 -s opt -w lock.bin
6
Determine OPT area
7
Writing binary file 1 bytes at 0x4800... OK
8
Bytes written: 1
9
10
$stm8flash -c stlinkv2 -p stm8s103f3 -s opt -r opt.bin
11
Determine OPT area
12
Reading 64 bytes at 0x4800... OK
13
Bytes received: 64
14
15
$hd opt.bin 
16
00000000  71 71 71 71 71 71 71 71  71 71 71 71 71 71 71 71  |qqqqqqqqqqqqqqqq|
17
*
18
00000040

: Bearbeitet durch User
von Ralph S. (jjflash)


Lesenswert?

... da habe ich mir doch glatt noch ein STM8 bestellt ... nur um zu 
sehen ob das so funktioniert ... und in meine "nie erscheinende 
Distribution" als Script Eingang findet (da ich nun kein Chinaboard im 
Auslieferungszustand habe).

Aaaaaber ich werde es so wie du das beschrieben hast an dem nicht 
"gesperrten" Board-chen ausprobieren.

Hmmm, mit STM32 hast du nichts am Hut, wäre irgendwie klasse, wenn es 
eine ähnliche Lösung für das STM32F103CBT6 Board mit Maple Leaf mini 
Bootloader geben würde... (werde ich allerdings einmal nach deinem 
Schema so mal für den STM32 versuchen, vielleicht klappts).

von Axel S. (a-za-z0-9)


Lesenswert?

Ralph S. schrieb:
> ... da habe ich mir doch glatt noch ein STM8 bestellt ... nur um zu
> sehen ob das so funktioniert ... und in meine "nie erscheinende
> Distribution" als Script Eingang findet (da ich nun kein Chinaboard im
> Auslieferungszustand habe).

Mußt du nicht mal. Wenn du das Board sperrst, indem du 0xAA nach OPT0 
schreibst, verhält es sich genauso wie im Auslieferungszustand.

Nochwas: wenn man 0x00 nach OPT0 schreibt, dann löscht der STM8 ganz wie 
spezifiziert seinen Flash, Config und EEPROM. Man kann das alles dann 
auch auslesen (kommt überall 0x00 raus). In das Flash schreiben kann man 
aber erst wieder, wenn man saubere Werte in die Config Area geschrieben 
hat. Das Manual sagt darüber nichts, sondern behauptet im Gegenteil, daß 
invalide Option-Bytes (das negierte Byte paßt nicht zum Optionbyte) so 
behandelt werden, als würden die Defaults drin stehen. Stimmt nur leider 
nicht.

> Hmmm, mit STM32 hast du nichts am Hut, wäre irgendwie klasse, wenn es
> eine ähnliche Lösung für das STM32F103CBT6 Board mit Maple Leaf mini
> Bootloader geben würde...

Funktioniert für mich mit openocd. Testsubjekt ist ein 
STM32F103C8T6 STM32 Billig Board am ST-Link V2 (China-Klon)

1
~ $openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg
2
Open On-Chip Debugger 0.8.0 (2014-10-20-21:48)
3
Licensed under GNU GPL v2
4
For bug reports, read
5
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
6
Info : This adapter doesn't support configurable speed
7
Info : STLINK v2 JTAG v27 API v2 SWIM v6 VID 0x0483 PID 0x3748
8
Info : using stlink api v2
9
Info : Target voltage: 3.243973
10
Info : stm32f1x.cpu: hardware has 6 breakpoints, 0 watchpoints

Das folgende mache ich jetzt interaktiv. Man kann die Kommandos aber 
auch in ein .cfg File schreiben und das mit dem -f 
Kommandozeilenschalter direkt von openocd ausführen lassen:

1
~ $telnet localhost 4444
2
Trying ::1...
3
Trying 127.0.0.1...
4
Connected to localhost.
5
Escape character is '^]'.
6
Open On-Chip Debugger
7
> init
8
> reset halt
9
target state: halted
10
target halted due to debug-request, current mode: Thread 
11
xPSR: 0x01000000 pc: 0x080075d0 msp: 0x20005000
12
> stm32f1x unlock 0
13
device id = 0x20036410
14
flash size = 49713kbytes
15
Device Security Bit Set
16
target state: halted
17
target halted due to breakpoint, current mode: Thread 
18
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
19
stm32x unlocked.
20
INFO: a reset or power cycle is required for the new settings to take effect.
21
> reset halt
22
target state: halted
23
target halted due to debug-request, current mode: Thread 
24
xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc
25
> exit
26
Connection closed by foreign host.

Locken geht genauso, nur daß man "lock 0" statt "unlock 0" verwendet. 
Die Anleitung stammt im wesentlichen von hier: 
https://stackoverflow.com/questions/32509747/stm32-read-out-protection-via-openocd

von Ralph S. (jjflash)


Lesenswert?

Axel S. schrieb:
> Funktioniert für mich mit openocd. Testsubjekt ist ein
> STM32F103C8T6 STM32 Billig Board am ST-Link V2 (China-Klon)

Mit diesem Billigboard habe ich auch keine Probleme und ohne jetzt mein 
Script hier zur Verfügung zu haben glaube ich, dass ich es für dieses 
Board zumindest so ähnlich auch gelöst habe (das ist das Board mit den - 
für mich - außerordentlich häßlichen gelben Steckbrückenjumpern).

Mit dem Billigboard STM32F103CBT6 (man beachte das B) hat das aber 
leider nicht funktioniert, irgendwie scheint sich bei diesem Board (es 
ist ein Maple Leaf Mini - Clone) der aufgespielte USB-Bootloader zu 
sperren.

Aaaaaalerdings weiß ich nicht, ob ich nach dem

-init
ein
-reset halt

gemacht hatte...

Ich werde das so noch einmal ausprobieren.

Vielen Dank für die Mühe

Gruß,

Ralph

von Tim  . (cpldcpu)


Lesenswert?

Vielleicht baut das einfach mal jemand in STM8FLASH ein? Der Autor 
akzeptiert pull-requests...

https://github.com/vdudouyt/stm8flash

von Axel S. (a-za-z0-9)


Lesenswert?

Tim  . schrieb:
> Vielleicht baut das einfach mal jemand in STM8FLASH ein?

Hab ich kurz drüber nachgedacht. Und es dann verworfen. Das "unlock.bin" 
File kann man sich mit "echo -e ..." trivial selber erzeugen. Und 
insbesondere auch gleich passend zu den gewünschten Option-Bits. Denn 
meistens wird man ja nicht beim Factory-Default bleiben wollen.

Was nett wäre, wäre ein GUI-Tool analog STVP, das die Option-Bits aus 
einer menschenlesbaren GUI passend erzeugt und dann stm8flash passend 
aufruft. Das kann man im Prinzip recht schnell in PerlTk oder TclTk 
hinrotzen. Der Aufwand steckt dann darin, ihm die ganzen Flavours an 
STM8 Controllern beizubringen. Aber da ich vermutlich nicht mehr als 
zwei oder drei Mitglieder der Familie jemals einsetzen werde, ist es mir 
den Aufwand ehrlich gesagt nicht wert ...

von Tim  . (cpldcpu)


Lesenswert?

Ich war mal so frei:

https://github.com/cpldcpu/stm8flash

Jetzt gibt es eine Option "-u", die die option Bytes auf den factory 
default State setzt und die Write Protection entfernt.

Ist am Ende halt doch einfacher, als sich eine Anleitung zu ergooglen.

von Axel S. (a-za-z0-9)


Lesenswert?

Tim  . schrieb:

> https://github.com/cpldcpu/stm8flash
>
> Jetzt gibt es eine Option "-u", die die option Bytes auf den factory
> default State setzt und die Write Protection entfernt.

Gut gemeint. Vfg bsg qnf Trtragrvy iba "thg trznpug". (rot13)

> Ist am Ende halt doch einfacher, als sich eine Anleitung zu ergooglen.

In diesem speziellen Fall wird es dadurch leider nicht einfacher, 
sondern schwieriger. Denn du setzt stillschweigend voraus, daß jeder der 
den Code verwendet, auch weiß daß er zusammen mit -u auch noch -b (und 
die Anzahl der Optionbytes) angeben muß. Das geht weder aus der 
Fehlermeldung hervor, noch aus dem README noch hast du es hier erwähnt.

Aber das ist noch nicht alles. Ich zähle mal die Probleme auf, die ich 
auf Anhieb sehe:

1. du setzt voraus, daß das erste Optionbyte für ROP zuständig ist und 
zum Unlocken auf 0x00 gesetzt werden muß. Das stimmt z.B. schon mal 
nicht für den STM8L052C6 (und vermutlich für alle STM8L nicht). Da muß 
man 0xAA schreiben um ROP zu deaktivieren.

2. du setzt voraus, daß alle weiteren Optionbytes paarweise auftreten 
und daß das erste Byte immer 0x00 und das zweite 0xFF sein muß. Stimmt 
ebenfalls nicht für die STM8Lxxx

Und das ist genau das, was ich weiter oben meinte mit

Axel S. schrieb:
> Der Aufwand steckt dann darin, ihm die ganzen Flavours an
> STM8 Controllern beizubringen.

Denn wenn man das richtig machen wöllte, dann müßte man die Default- 
Optionbytes in das stm8_devices[] Array in stm8.c packen. Und zwar 
idealerweise für alle STM8 µC die stm8flash kennt. Wenn du dir diese 
Arbeit machen willst, dann wäre das eine runde Sache. Aber so wie es 
jetzt ist, sehe ich es eher als Verschlimmerung denn als Verbesserung.

von Tim  . (cpldcpu)


Lesenswert?

Axel S. schrieb:

>Gut gemeint. Vfg bsg qnf Trtragrvy iba "thg trznpug". (rot13)

Du darfst gerne mithelfen ;)

> In diesem speziellen Fall wird es dadurch leider nicht einfacher,
> sondern schwieriger. Denn du setzt stillschweigend voraus, daß jeder der
> den Code verwendet, auch weiß daß er zusammen mit -u auch noch -b (und
> die Anzahl der Optionbytes) angeben muß. Das geht weder aus der
> Fehlermeldung hervor, noch aus dem README noch hast du es hier erwähnt.

Nö, muss man nicht. Es funktioniert auch, den kompletten OPT-Bereich mit 
dem definierten Muster zu beschreiben.

Ich hatte zunächst eine Erweiterung der Device-Definition eingebaut, 
welche die Anzahl der Bytes genau definiert. Ich habe das aber später 
verworfen, da es auch so funktioniert.

Axel S. schrieb:
> 1. du setzt voraus, daß das erste Optionbyte für ROP zuständig ist und
> zum Unlocken auf 0x00 gesetzt werden muß. Das stimmt z.B. schon mal
> nicht für den STM8L052C6 (und vermutlich für alle STM8L nicht). Da muß
> man 0xAA schreiben um ROP zu deaktivieren.

Hm... das war mir nicht bewusst, und ist eine ziemlich schwache Nummer 
von ST. Offensichtlich ist es notwendig, die Device-Definition zu 
erweitern.

Gibt es weitere Ausnahmen?

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Tim  . schrieb:
> Axel S. schrieb:
>> 1. du setzt voraus, daß das erste Optionbyte für ROP zuständig ist und
>> zum Unlocken auf 0x00 gesetzt werden muß. Das stimmt z.B. schon mal
>> nicht für den STM8L052C6 (und vermutlich für alle STM8L nicht). Da muß
>> man 0xAA schreiben um ROP zu deaktivieren.
>
> Hm... das war mir nicht bewusst, und ist eine ziemlich schwache Nummer
> von ST. Offensichtlich ist es notwendig, die Device-Definition zu
> erweitern.
>
> Gibt es weitere Ausnahmen?

Davon würde ich ausgehen. Wie gesagt: ich verwende nur eine Handvoll 
STM8 Derivate. Zu denen habe ich die Datenblätter hier liegen, in die 
ich schnell mal geschaut habe. Angesichts des eher überschaubaren 
Nutzens habe ich mich dagegen entschieden, die gefühlt 100 weiteren 
Varianten des STM8 auch noch zu studieren.

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.