SDRAM - Byte Enable

Gast #4212500
Lesenswert?
• ▲
▼
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.
Gast #4212736
Lesenswert?
• ▲
▼
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.
#4212745
Lesenswert?
• ▲
▼
@ 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.
Gast #4212748
Lesenswert?
• ▲
▼
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.
Gast #4227473
Lesenswert?
• ▲
▼
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
Gast #4227486
Lesenswert?
• ▲
▼
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.
#4227541
Lesenswert?
• ▲
▼
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.
#4227565
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.