Hallo, ich verwende einen STM32 mit 32 Mbyte externem SDRAM, den ich gerne über den STCube konfigurieren möchte. Beim Reiter FMC gibt es einen Unterreiter mit SDRAM1. Wähle ich Data: 32 Bits, kann ich bei der Option Byte enable zwischen disabled und 32-bit byte enable wählen. Was genau bewirken diese Einstellungen ? Wisst ihr, wann sie verwendet werden und wann nicht ? Im User Manual vom STM32F4 habe ich nichts genaues darüber gefunden. Vielen Dank.
Vmtl. beim SDRAM nicht nur komplette Speicherworte schreiben zu können, sondern darin die einzelne Bytes auswählen zu können.
Damit kann man festlegen, welches der 4 Bytes eines 32 Bit Datenworts wirklich gelesen bzw. geschrieben werden soll. Damit kann man ggf. Einzelzugriffe auf Bytes machen und muss nicht jedes mal ein ganzes 32 Bit Wort verarbeiten.
ok, vielen Dank für die Hilfe. Wenn ich mein SDRAM mit 32 Bit an den Controller angeschlossen habe, nach welchen Kriterien wähle ich dann aus, ob ich die Option: Byte enable auf disable oder auf 32-bit byte enable einstelle ? Bei 32-bit byte enable werden mir dann 4 Leitungen hinzugefügt, mit denen ich ein Byte des 32 Bit Dantenwortes auswählen kann.
@ RM0090 (Gast) >Wenn ich mein SDRAM mit 32 Bit an den Controller angeschlossen habe, >nach welchen Kriterien wähle ich dann aus, ob ich die Option: Byte >enable auf disable oder auf 32-bit byte enable einstelle ? Möglicherweise kann dann der Compiler etwas besseren Code erzeugen, wenn es um die Behandlung von Datentypen kleiner als 32 Bit geht. Damit könnte einige Speicherzugriffe schneller werden. Ob das aber wirklich nennenswert viel ausmacht, wage ich zu bezweifeln. >Bei 32-bit byte enable werden mir dann 4 Leitungen hinzugefügt, mit >denen ich ein Byte des 32 Bit Dantenwortes auswählen kann. Klar, denn ein 32 Bit Wort hat 4 Bytes. Allerdings muss dein SDRAM diese 4 Leitungen auch unterstützen, das haben nicht alle.
AHB transaction data size can be 8-, 16- or 32 bit wide whereas the accessed external device has a fixed data width. - AHB transaction size is smaller than the memory size: In this case, the FMC allows read/write transactions and accesses the right data trough its byte lanes BL[3:0] Ich sehe noch nicht ganz den Vorteil darin, die Option 32-bit byte enabled zu wählen.
RM0090 schrieb: > Ich sehe noch nicht ganz den Vorteil darin, die Option 32-bit byte > enabled zu wählen. Wenn Du über einen 32-Bit-Bus mal nur 8-Bit schreiben willst, muss die CPU ein read-modify-write durchführen. Wenn es die byte-enables gibt, reicht ein einfaches write. Aber damit das funktioniert müssen mehrere Kriterien erfüllt sein: der Speicher muss es können, der Speicherkontroller muss es können, die CPU muss es können und nicht zuletzt auch der Compiler. Jens
Jens schrieb: > der > Speicher muss es können, der Speicherkontroller muss es können, die CPU > muss es können und nicht zuletzt auch der Compiler. nanana.. Dem Compiler ist das egal. Die CPU kann es, der Speichercontroller kann es auch und jeder externe SDRAM kann es auch. Das, was der TO hier nachfragt, ist einerseits die richtige Beschaltung zwischen µC und RAM und andererseits die richtige Initialisierung des Speichercontrollers UND des RAM. Ja, der SDRAM muß eben auch richtig initialisiert werden, sonst geht es nicht. Wenn der TO in den Dokus von ST nix verstehbares gefunden hat, dann rate ich ihm, die Doku entsprechender Controller von NXP zu lesen. Dort ist es jedenfalls ausreichend beschrieben. W.S.
W.S. schrieb: > Dem Compiler ist das egal. Hmm. Ich bilde mir ein, das der Microblaze-GCC mal generell read-modify-write gemacht hat. Ist aber schon eine Weile her, da verblasst die Erinnerung...
Jens schrieb: > Hmm. Ich bilde mir ein, das der Microblaze-GCC mal generell > read-modify-write gemacht hat. Wenn die Befehlssatz-Architektur nur wortweise schreiben kann, dann wird der Compiler das natürlich berücksichtigen. Keine Ahnung wie das Microblaze hält. ARM Cores vor ARMv4 kennen zwar Bytes, aber keine Halbworte. Wenn GCC derart alte Cores noch unterstützt, dann wird er für 16-Bit Datentypen r-w-m durchführen, wenn ein entsprechender Core eingestellt wird. Spätere ARMs können auch Halbworte direkt schreiben. Da gibt es keinen Grund für den Compiler, das nicht zu nutzen. Wenn dann bestimmte Speicherinterfaces es nicht können, dann ist es Aufgabe des zuständigen Interface-Moduls, es umzusetzen. Es könnte bei Controllern auch Speicherbereiche für eine spezielle Funktion geben, auf die nicht in beliebiger Weise zugegriffen werden kann. Dann wäre es Sache der Software, das zu berücksichtigen.
Beispiel:
1 | short x; |
2 | |
3 | int get(void) |
4 | {
|
5 | return x; |
6 | }
|
7 | |
8 | void put(int y) |
9 | {
|
10 | x = y; |
11 | }
|
ARMv3, byteweise statt r-m-w:
1 | get: ldr r3, .L2 |
2 | ldrb r0, [r3, #1] @ zero_extendqisi2 |
3 | ldrb r2, [r3] @ zero_extendqisi2 |
4 | mov r0, r0, asl #24 |
5 | orr r0, r2, r0, asr #16 |
6 | bx lr |
7 | put: ldr r3, .L5 |
8 | strb r0, [r3] |
9 | mov r0, r0, asr #8 |
10 | strb r0, [r3, #1] |
11 | bx lr |
Laden ginge auf ganz alten Cores auch effizienter, da bei denen das Halbwort per LDR richtig geladen wird und nur die zero/sign-extension fehlt. ARMv4:
1 | get: ldr r3, .L2 |
2 | ldrsh r0, [r3] |
3 | bx lr |
4 | put: ldr r3, .L5 |
5 | strh r0, [r3] @ movhi |
6 | bx lr |
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.