Forum: Compiler & IDEs STM32 Option Bytes beim Flashen gleich mit verändern


von Bernd (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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?

von Stefan K. (stefan64)


Lesenswert?

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
von Bernd (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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

von Mike R. (thesealion)


Lesenswert?

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
von Jonny (Gast)


Lesenswert?

Ü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

von Ulli A. (Gast)


Lesenswert?

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?

von eric (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.