Forum: Compiler & IDEs Programmcode in externes NOR-Flash


von Luke (Gast)


Lesenswert?

Hallo zusammen!

An einem STM32F407 Controller von ST habe ich ein externes NOR-Flash.
Zur Laufzeit kann ich in dieses -über den initialisierten FSMC des 
Controllers- Daten erfolgreich schreiben und Lesen.
Aber wie bekomme ich Programmcode in das Flash geladen und ausgeführt?
Arbeite mit IAR Workbench.

Danke und Grüße
Mike

von foobar (Gast)


Lesenswert?

AN2784 erklärt das ziemlich gut.

von Luke (Gast)


Lesenswert?

Was? Kapitel 2.4?! Für mein Verständnis nicht verständlich genug.

Load the user code into the external NOR memory:
> "This operation requires a special configuration of the development toolchain:
> in the linker file, you have to specify the NOR Flash memory start address
> (or any other address) from where the user code is to be programmed."
1
define symbol __ICFEDIT_region_FLASH_start__ = 0x08000000;
2
define symbol __ICFEDIT_region_FLASH_end__   = 0x081FFFFF;
3
...
4
define symbol __region_External_NOR_FLASH_start__ = 0x64000000;
5
define symbol __region_External_NOR_FLASH_end__   = 0x640F9FFF;
6
7
define region FLASH_region  =   mem:[from __ICFEDIT_region_FLASH_start__ to __ICFEDIT_region_FLASH_end__]
8
                              | mem:[from __region_External_NOR_FLASH_start__ to __region_External_NOR_FLASH_end__];
9
...
10
place in FLASH_region  { readonly };

> "A specific loader for NOR Flash memories is also required"
Aha! Und welcher?

> "Once the user code has been loaded into the NOR Flash memory,
> a specific program should be loaded into the internal Flash memory
> in order to configure the FSMC, ..."
Beim F437 ist es der FMC. Code zur Initialisierung ist vorhanden.

> "... to jump and execute the user code (from the NOR Flash memory)."
Sieht wie aus? Zumal der "user code" ja sowohl im internen, wie auch 
externen Speicher liegen soll ...

von foobar (Gast)


Lesenswert?

Luke schrieb:
>> "A specific loader for NOR Flash memories is also required"
> Aha! Und welcher?

Den wirst du dir schreiben müssen. Du kannst dir anschauen wie das für 
den internen Flash funktioniert und muss das dann anpassen.

>> "Once the user code has been loaded into the NOR Flash memory,
>> a specific program should be loaded into the internal Flash memory
>> in order to configure the FSMC, ..."
> Beim F437 ist es der FMC. Code zur Initialisierung ist vorhanden.

Was hat das mit dem F437 zu tun? Gings nicht um den F407?
Die Aussage verstehe ich jetzt nicht.

>> "... to jump and execute the user code (from the NOR Flash memory)."
> Sieht wie aus? Zumal der "user code" ja sowohl im internen, wie auch
> externen Speicher liegen soll ...

Ein Jump halt.
Im internen Flash hast du sowas wie einen Bootloader der den FSMC 
initialisiert und dann deinen Entrypoint im externen Flash anspringt.
In Assembler:
b <function>
Vector Table Offset wirst auch noch anpassen müssen.

von S. R. (svenska)


Lesenswert?

Du musst dem Linker sagen, dass er deinen Code in den Adressraum des 
NOR-Flashes hineinlinken darf und sicherstellen, dass er das für die 
Initialisierung des FSMC nicht tut.

Im GCC macht man das per Linker-Script und __attribute__((section(X))) 
pro Symbol, im IAR gibt es ähnliche Methoden, deren Syntax ich aber 
gerade nicht im Kopf habe.

Wenn du den internen Flash programmierst, musst den du den NOR-Flash 
auch passend dazu programmieren, sonst gehen deine Sprünge ins Leere. 
Dazu wirst du vermutlich den NOR-Loader brauchen (der wieder vollständig 
aus dem internen Flash laufen muss).

von W.S. (Gast)


Lesenswert?

Luke schrieb:
> Aber wie bekomme ich Programmcode in das Flash geladen und ausgeführt?
> Arbeite mit IAR Workbench.

Es ist egal, was du für ne Workbench benutzt.

Im Prinzip mußt du dich erstmal fragen, WAS FÜR Programmcode du im 
externen Flash unterbringen willst. Immerhin startet so ein µC 
normalerweise ja vom eingebauten Flash und ich weiß jetzt nicht, ob dein 
konkreter Typ internen Flasch hat oder nicht.

Also, wenn du nen Chip mit internem Flash hast, dann mußt du dort 
natürlich all das unterbringen, was du zum konkreten Aufsetzen der 
Anwendung benötigst und du brauchst dort auch Routinen, die deinen 
externen Flash programmieren können, denn weder der eingebaute Bootlader 
noch die diversen SWD-Tools können das von hause aus.

Was deinen Code für den externen Flash betrifft, so brauchst du ja bloß 
die entsprechenden Linker-Direktiven (sowas wie RAM=.. und ROM=...) 
entsprechend festzulegen, das war's dann schon.

Ansonsten würde ich an deiner Stelle mir sowas wie ein kleines 
Betriebssystem schreiben, das die grundlegenden Dinge erledigt (diverse 
Standard-IO, Systemuhr, Eventverwaltung, Hintergrundmonitor usw) und das 
per SVC seine Dienste für eine quasi Anwendung bereitstellt. Bei der 
Lernbetty hatte ich sowas mal durchexerziert. Das hat den Vorteil, daß 
du bei deiner Anwendung im externen ROM dich nicht mehr mit 
Standard-Zeugs herumplagen mußt.

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.