Forum: Compiler & IDEs Keil & STM32F103 Flash Definition?


von Tamer (Gast)


Lesenswert?

Hallo,

der STM32F103x gibts in div. Varianten, so zb. mit 64kb und 128 kb Flash 
ROM. Dabei ist es so dass das Flash lt. DB an Adresse 0x0800 0000 
beginnt und bis 0x0801 FFFF reicht, eine Unterscheidung des Berichs 
zwischen den beiden Varianten gibts im DB nicht, dh. ich muss davon 
ausgehen das die 64kb Variante bis 0x0801 0000 adressiert werden kann. 
Die Pages sind 1kb groß so dass 64 möglich wären.

Nun zur Frage, obwohl im Keil der richtige Controller mit 64kb 
ausgewählt wird kann ich im Code:

#define Page65 0x0801 0400

definieren obwohl das Flash nur bis 0x0801 0000 reicht..!? eine 
Fehlermeldung oder Warnung gibts nicht.. aber was passiert wenn das 
Programm während dem Ablauf in diesen Bereich schreiben will? Stürzt es 
ab oder passiert einfach nix?

Gruss Tamer

von Programmierer (Gast)


Lesenswert?

Tamer schrieb:
> #define Page65 0x0801 0400

#define definiert nur dumme Textersetzungen. Da kannst du hinschreiben 
was du willst, wie zum Beispiel die in C ungültige Folge "0x0801 0400" 
(das Leerzeichen ist verboten). z.B.

#define Page65 Hans Wurst !

stört überhaupt nicht. Erst wenn Page65 irgendwo im Code genutzt wird 
und die Textersetzung in ungültigem C resultiert, gibts da Probleme.

Tamer schrieb:
> aber was passiert wenn das
> Programm während dem Ablauf in diesen Bereich schreiben will?
Kommt drauf an wie du das machst. Wenn du das #define gar nicht nutzt 
sondern, wie man das korrekterweise mit Linkerscripten macht, erhälst du 
vermutlich einen Linker-Fehler.
> Stürzt es ab oder passiert einfach nix?
Wenn du über die direkte Adresse im Code schreibst, kriegst du 
vermutlich einen BusFault Error o.ä.

von W.S. (Gast)


Lesenswert?

Tamer schrieb:
> Dabei ist es so dass das Flash lt. DB an Adresse 0x0800 0000
> beginnt und bis 0x0801 FFFF reicht

Das wäre mir aber absolut neu. Bei dem Chip, den ich vor Jahren verbaut 
habe: STM32F103ZET6 sieht die Speicheraufteilung etwa so aus:

; interner ROM:         0h .. 0007FFFFh    (512 KB)
; interner RAM:  20000000h .. 2000FFFFh    ( 64 KB)
; externer RAM:  60000000h .. 600FFFFFh    (  1 MB) an NE1 (PD7)
; externer RAM2: 64000000h .. 6407FFFFh    (512 KB)

und der Anfang von link.xcl sieht so aus:
--device=DARMSTM
--compatible=cortex-m3
--output linked.elf
--ro-base 0x00000000
--rw-base 0x20000000
...

Also lies das refMan nochmal gründlich. Der Flash startet bei den 
STM32F103xxx immer bei 0

W.S.

von Tassilo H. (tassilo_h)


Lesenswert?

Stimmt nicht, was ab 0x00000000 eingeblendet ist, ist variabel, das kann 
Flash oder RAM sein. Das Flash liegt erstmal immer bei 0x080000000. Ob 
Flash oder SRAM bei 0 gespiegelt wird, hängt von den BOOTx Pins ab.

von W.S. (Gast)


Lesenswert?

Tassilo H. schrieb:
> Stimmt nicht, was ab 0x00000000 eingeblendet ist, ist variabel,

Wenn du es so nimmst, dann erwähne auch den Bootlader.

Aber praktikabel ist ohnehin nur die eine Einstellung, wo der Flash bei 
0 beginnt. Die Version mit dem RAM ab 0 funktioniert ja nur dann, wenn 
man den RAM mit irgend etwas sinnvollem zuvor gefüllt hat.

Aber das hat es ja im konkreten Betrieb in einem Gerät nicht, da gibt es 
nach dem Einschalten von Vcc garnix sinnvolles im RAM - was bleibt, ist 
der Flash und zwar ab 0, sonst geht da nix.

Ob es Sinn macht, nach dem Startup aus dem Flash von eben diesem Flash 
irgend etwas in den RAM zu kopieren und dann die softwareseitige 
Umschaltung zu tun, sei mal dahingestellt. Ich würde in solchem Fall 
eher den RAM dort lassen wo er ist und das betreffende Codestück für die 
RAM-Adresse linken.

W.S.

von Jim M. (turboj)


Lesenswert?

Tamer schrieb:
> definieren obwohl das Flash nur bis 0x0801 0000 reicht..!? eine
> Fehlermeldung oder Warnung gibts nicht.. aber was passiert wenn das
> Programm während dem Ablauf in diesen Bereich schreiben will? Stürzt es
> ab oder passiert einfach nix?

Müsste man ausprobieren. Bei einigen Cortex M3 Varianten gibt es einen 
(Hard-)Fault, wenn auf nicht definierten Speicher zugegriffen wird. Das 
entscheidet aber der Hersteller selbst.

Es könnte auch einfach das zuätzliche Addressbit ignoriert werden, so
dass Du dann real auf 0x0800 0400 zugreifst. Ausprobieren dürfte 
schneller gehen als die umfangreiche Doku zu wälzen.

von Tamer (Gast)


Lesenswert?

Hallo,

es ist schon seltsam, es sieht so aus als dass der uC immer 128kb hat, 
obwohl er als 64kb angeboten wird. Wir haben es ausprobiert, man kann 
die Speicheradressen nach 64kb beschreiben und auch auslesen!

Ich muss bei ST nachfragen wie das zu verstehen ist

von W.S. (Gast)


Lesenswert?

Tamer schrieb:
> Ich muss bei ST nachfragen wie das zu verstehen ist

Lieber nicht.
Ich habe sowas bei NXP erlebt. Diese Chips sind welche, wo bei der 
Endkontrolle im Bereich >64K irgend ein Speicherfehler festgestellt 
wurde. Also werden sie als 64 K Versionen gelabelt und verkauft.

W.S.

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.