Forum: Mikrocontroller und Digitale Elektronik OpenOCD STM32F4 Flash Adresse


von Christian T. (chris94)


Lesenswert?

Guten Morgen

Ich arbeite derzeit an einem Projekt für einen STM32F4VET, welches aus 
einem Bootloader und dem eigentlichen Programm besteht. Als IDE benutze 
ich CLion, dort wird zum flashen und debuggen OpenOCD verwendet.

Der Programmcode funktioniert ohne Probleme, wenn ich die .hex des 
Bootloaders (mit Flash Erase) und anschließend die des eigentlichen 
Programms (ohne Flash Erase) per ST-Link-Utility flashe. Ein Problem mit 
dem eigentlichen Programm besteht also nicht. Im ST-Link-Utility ist 
klar zu erkennen, dass die richtigen Flash Bereiche beschrieben werden. 
Eine kontrolle der .map Dateien bestätigt dies.

Versuche ich jedoch aus CLion heraus das eigentliche Programm per 
OpenOCD zu flashen, werden Veränderungen am ersten Sektor vorgenommen, 
in welchem mein Bootloader liegt, sodass dieser nicht mehr ausführbar 
ist. An den Parametern mit denen OpenOCD aufgerufen wird ist zu 
erkennen, dass die .elf Datei benutzt wird, nicht die .hex.
Ich verwende die Konfigurationsdatei "stm32f412g-disco.cfg". Diese und 
die ihr angehängten Konfigurationsdateien habe ich bereits erfolglos 
nach einer festen Flashadresse durchsucht.

Ich habe versucht mit dem elf-Viewer "ELF Parser" zu schauen, ob in der 
.elf Datei die richtige Flash-Adresse enthalten ist, dort bin ich im Tab 
PHeaders auf die Adresse von Sector 0 gestoßen. Ich bin mir jedoch nicht 
sicher ob dies das Problem ist, da in der .hex, welche aus der .elf 
erzeugt wird die richtige Adresse enthalten ist.

Geplante Flash Nutzung:
Sector 0 (0x08000000-0x08003FFF): Bootloader,
Sector 1 (0x08004000-0x08007FFF): EEPROM-Emulation,
Sector 2 (0x08008000-...) und folgende: Programm

Auszug aus *_FLASH.ld des Bootloaders:
1
MEMORY
2
{
3
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 256K
4
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 16K
5
}

Auszug aus *_FLASH.ld des Programms:
1
MEMORY
2
{
3
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 256K
4
  FLASH    (rx)    : ORIGIN = 0x8008000,   LENGTH = 480K
5
}

CLion Befehlszeile zum Aufruf von OpenOCD:
1
D:\OpenOCD-20211118-0.11.0\bin\openocd.exe -s D:\OpenOCD-20211118-0.11.0\share\openocd\scripts -f board/stm32f412g-disco.cfg -c "tcl_port disabled" -c "gdb_port disabled" -c "tcl_port disabled" -c "program \"D:/*****/STM32-Project-Test/cmake-build-debug/STM32-Project-Test.elf\"" -c reset -c shutdown

Ich hoffe es kann mir jemand helfen...

Viele Grüße
Chris

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kannst du vielleicht das ELF-File einfach mal hier anhängen?

Du hast übrigens 2x "tcl_port disabled" – sollte eines der beiden 
vielleicht "telnet_port disabled" hätte werden sollen?

: Bearbeitet durch Moderator
von Christian T. (chris94)


Angehängte Dateien:

Lesenswert?

Jörg W. schrieb:
> Du hast übrigens 2x "tcl_port disabled" – sollte eines der beiden
> vielleicht "telnet_port disabled" hätte werden sollen?

Die Befehlszeile wird vom CLion Plugin automatisch generiert, da kann 
ich bis auf die Auswahl der .cfg leider keinen Einfluss drauf nehmen.

Jörg W. schrieb:
> Kannst du vielleicht das ELF-File einfach mal hier anhängen?

Ist im Anhang.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
$ arm-none-eabi-objdump -h STM32-Project-Test.elf 
2
 
3
STM32-Project-Test.elf:     file format elf32-littlearm
4
5
Sections:
6
Idx Name          Size      VMA       LMA       File off  Algn
7
  0 .isr_vector   000001c4  08008000  08008000  00008000  2**0
8
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
9
  1 .text         0000274c  080081c4  080081c4  000081c4  2**2
10
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
11
  2 .rodata       00000010  0800a910  0800a910  0000a910  2**2
12
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
13
  3 .ARM.extab    00000018  0800a920  0800a920  0000a920  2**2
14
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
15
  4 .ARM          000000d0  0800a938  0800a938  0000a938  2**2
16
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
17
  5 .preinit_array 00000000  0800aa08  0800aa08  00010438  2**0
18
                  CONTENTS, ALLOC, LOAD, DATA
19
  6 .init_array   00000004  0800aa08  0800aa08  0000aa08  2**2
20
                  CONTENTS, ALLOC, LOAD, DATA
21
  7 .fini_array   00000004  0800aa0c  0800aa0c  0000aa0c  2**2
22
                  CONTENTS, ALLOC, LOAD, DATA
23
  8 .data         00000438  20000000  0800aa10  00010000  2**3
24
                  CONTENTS, ALLOC, LOAD, DATA
25
  9 .bss          000000e8  20000438  0800ae48  00010438  2**2
26
                  ALLOC
27

Die Startadresse (Section .isr_vector) ist 0x8008000, das passt also.

Habe keinen STM32 zur Hand um zu gucken, was da bei mir passiert. Sieht 
zumindest auf den ersten Blick nicht falsch aus so.

von Uwe Bonnes (Gast)


Lesenswert?

Nur ein Sektor fuer EEPROM-Emulation? Mit zwei Sektoren geht es 
einfacher, wenn ein Sektor voll ist.

von Christian T. (chris94)


Lesenswert?

Das Thema kann geschlossen werden, der Fehler lag an einem Tippfehler... 
Funktioniert jetzt wie es soll.

Trotzdem Danke!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Danke für die Rückmeldung, alles klar!

von Nop (Gast)


Lesenswert?

Christian T. schrieb:
> Das Thema kann geschlossen werden, der Fehler lag an einem
> Tippfehler...

Es ist durchaus höflich, auch die Auflösung mitzuteilen, damit andere 
auch was davon haben können. Etwa über die Forensuche. Also was für ein 
Tippfehler?

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.