Hallo, wie kann ich bei einem STM32 (hier ein STM32F103VB)gleich beim Flashen des Programms auch die Option Bytes verändern (Setzen der Read Out Protection)? Ich stelle mir das so ähnlich skriptgesteuert vor, wie bei den AVRs mit einer Batchdatei und mehreren AVRDUDE Aufrufen. Zur Verfügung stehen momentan nur einfache Hilfsmittel wie CoIDE und ST-Link V2. Gibt es für das ST-Link Utility Tool Kommandozeilenparameter? Eine Batchdatei mit mehreren Aufrufen zum Programmieren und Setzen der Option Bytes wäre vollkommen OK.
Wenn ich das richtig verstehe, könnte ich das mit einem J-Link Debugger oder Falsher ARM von Segger und dem Tool J-Flash bewerkstelligen. Aber gibt es auch ein Kommandozeilentool für den ST-Link?
Mit dem St-Link und dem STM ST-Link-Utility kannst Du das machen. Für Scripts gibt es eine Command line Version (CL). Viele Grüße, Stefan
:
Bearbeitet durch User
Stefan K. schrieb: > Mit dem St-Link und dem STM ST-Link-Utility kannst Du das machen. > Für Scripts gibt es eine Command line Version (CL). Ah super, danke für die Info. Das war mir nicht bekannt.
Ich habe mir nun eine einfache Batch Datei gebastelt, mit der ich per ST-Link Adapter und ST-Link_CLI Tool meine Hex Datei programmieren kann. Es wird auch ein Verify gemacht (-V) und die Readout Protection gesetzt. Nur das Programm startet danach nicht automatisch. Aber das kann ich verschmerzen. Einfach folgendes in eine Textdatei kopieren, anpassen und als .bat speichern.
1 | @echo off |
2 | title Fensertitel |
3 | echo Batch Programmierung mit ST-Link_CLI.Exe Tool und mit ST-Link Adapter |
4 | echo Nach dem Programmieren wird die Read-Out Protection gesetzt! |
5 | echo. |
6 | |
7 | set hex-file=Dateiname.hex |
8 | set hex-path="PfadZurDatei" |
9 | set tool-path="C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility" |
10 | |
11 | echo Folgende Datei wird auf den Controller geflashed: |
12 | echo Pfad: %hex-path:~1,-1%\ |
13 | echo Datei: %hex-file% |
14 | echo. |
15 | pause
|
16 | |
17 | REM %tool-path%\ST-LINK_CLI -List |
18 | %tool-path%\ST-LINK_CLI -c SWD -P %hex-path%\%hex-file% -V -OB RDP=1 |
19 | REM %tool-path%\ST-LINK_CLI -HardRst |
20 | pause
|
Alternativ kann man auch folgendes in seine Software einfügen
1 | if (FLASH_OB_GetRDP() != SET) { |
2 | |
3 | FLASH_OB_Unlock(); |
4 | |
5 | FLASH_OB_RDPConfig(OB_RDP_Level_1); |
6 | |
7 | // Start the Option Bytes programming process
|
8 | if (FLASH_OB_Launch() != FLASH_COMPLETE) { |
9 | // User can add here some code to deal with this error
|
10 | }
|
11 | |
12 | FLASH_OB_Lock(); |
13 | }
|
dann kann man das setzen auch nicht mehr vergessen :) Edit: Wobei mein Beispiel für einen STM32F415 ist, aber beim STM32F103 ist es ähnlich.
:
Bearbeitet durch User
Über die JFlash Debugger von Segger lassen sich die Option-Bytes eines STM32 uC wie folgt programmieren:
1 | device stm32l073rz |
2 | if 1 |
3 | speed 1000 |
4 | con |
5 | sleep 100 |
6 | w4 0x4002200C 0x89ABCDEF // Unlock FLASH_PECR |
7 | w4 0x4002200C 0x02030405 |
8 | w4 0x40022014 0xFBEAD9C8 // Unlock option byte block |
9 | w4 0x40022014 0x24252627 |
10 | w4 0x40022018 0x00000F00 // Clear all error bits in the FLASH_SR |
11 | sleep 1 |
12 | w4 0x1FF80000 0xFF4400BB // Set ROP to Level 1. 0xAA = Level 0; 0xCC = Level 2 |
13 | sleep 1 // Format: 0xFF; nRDP; 0x00; RDP |
14 | sleep 100 // It is not possible to check the Status register in a commander file, |
15 | sleep 100 // therefore we just wait here a fixed amount of time |
16 | w4 0x40022004 0x00040000 // Set OBL_LAUNCH bit |
17 | sleep 100 // It is not possible to check the Status register in a commander file, |
18 | sleep 100 // therefore we just wait here a fixed amount of time |
19 | r // Reset device |
20 | sleep 100 |
21 | q |
https://wiki.segger.com/STM32
Und wie geht das über den ROM-USB Bootloader? 'dfu-util --list' meint: Found DFU: [0483:df11] ver=2200, devnum=116, cfg=1, intf=0, path="3-1.4", alt=1, name="@Option Bytes /0x1FFFF800/01*016 e", serial="FFFFFFFEFFFF" Found DFU: [0483:df11] ver=2200, devnum=116, cfg=1, intf=0, path="3-1.4", alt=0, name="@Internal Flash /0x08000000/032*0001Kg", serial="FFFFFFFEFFFF" also 'dfu-util -a 1 -i 0' und was dann?
Der Vollständigkeit halber: mit dfu-util geht das relativ einfach, ist aber alles andere als komfortabel (soweit ich das ausprobiert hab, die Dokumentation gibt da nicht viel her). Mit einem STM32L433 zeigt dfu-util
1 | $ dfu-util -l |
2 | [...] |
3 | Found DFU: [0483:df11] ver=2200, devnum=61, cfg=1, intf=0, path="1-8", alt=3, name="@Device Feature/0xFFFF0000/01*004 e", serial="206434AB5246" |
4 | Found DFU: [0483:df11] ver=2200, devnum=61, cfg=1, intf=0, path="1-8", alt=2, name="@OTP Memory /0x1FFF7000/01*0001Ke", serial="206434AB5246" |
5 | Found DFU: [0483:df11] ver=2200, devnum=61, cfg=1, intf=0, path="1-8", alt=1, name="@Option Bytes /0x1FFF7800/01*040 e", serial="206434AB5246" |
6 | Found DFU: [0483:df11] ver=2200, devnum=61, cfg=1, intf=0, path="1-8", alt=0, name="@Internal Flash /0x08000000/0128*0002Kg", serial="206434AB5246" |
Die Option Bytes sind also bei 0x1FFF7800. Auslesen ist einfach nur:
1 | $ dfu-util -a 1 -s 0x1FFF7800 -U option.bin |
2 | [...] |
3 | Limiting upload to end of memory segment, 40 bytes |
4 | Upload [=========================] 100% 40 bytes |
5 | Upload done. |
Der unkomfortable Teil ist dann das Ändern der Option Bytes, da musste erstmal der Hexeditor für herhalten. Anschließend Schreibt man die Option Bytes wieder zurück. Man muss auch nicht alles neu schreiben sondern kann auch nur ein paar Bytes in die Datei packen und auch die Adresse anpassen. Die restlichen Bytes bleiben dabei unverändert. Zum Beispiel die ersten 4 Byte überschreiben:
1 | $ dfu-util -a 1 -s 0x1FFF7800 -D option3.bin |
2 | [...] |
3 | Downloading to address = 0x1fff7800, size = 4 |
4 | Download [ ] 0% 0 bytesdfu-util: Error during download get_status |
Der Fehler kommt, weil der STM32 nach dem Schreiben einen Reset auslöst, ist aber trotzdem erfolgreich. Angeblich gibt es noch die Option :will-reset um das zu umgehen, aber zumindest mein dfu-util 0.9 kennt das nicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.