Forum: Mikrocontroller und Digitale Elektronik External RAM am STM32F437


von Jochen (Gast)


Lesenswert?

Hallo zusammen,

an einem STM32F437 ist ein externes RAM angeschlossen.
Den FMC des Mikrocontrollers habe ich erfolgreich für den Zugriff auf 
das externe RAM konfiguriert. Ein einfacher selbstgeschriebener RAM-Test 
läuft auch erfolgreich über den gesamten Speicherbereich durch.
Hierbei wird das RAM jeweils vollständig 8Bit, 16Bit, 32Bit und 64Bit 
Werten beschrieben und ausgelesen.
Bisher wurde im Wesentlichen der interne Speicher des STM32F437 
verwendet und es wurden keine Probleme festgestellt. Durch eine 
Funktionserweiterung, die natürlich auch mehr RAM benötigt, liegen viele 
Variablen nun im externen Memory. Nun treten Fehler bei der 
Programmausführung auf. Mal läuft das System gar nicht hoch. Des öfteren 
treten größere Latenzen beim ausführen von Funktionen auf, die nicht 
hinnehmbar sind.
Forciere ich die Platzierung für diese Funktion relevanten Variablen in 
den internen RAM geht's wieder.
Habe dann das Timing des externen Speichers verlangsamt, aber das 
brachte auch kein Erfolg. Ein Blick ins Errata Sheet 
(http://www.st.com/content/ccc/resource/technical/document/errata_sheet/38/e6/37/64/08/38/45/67/DM00068628.pdf/files/DM00068628.pdf/jcr:content/translations/en.DM00068628.pdf) 
offenbarte den Fehler 2.11.4, aber wir haben die Revision "1" im 
Einsatz, die diesen Fehler nicht haben soll ...

Weiß nicht, was es sonst sein könnte bzw. wie ich überhaupt herausfinden 
kann, was genau die Fehlerursache ist. Mit "normalen" Debuggen komme ich 
hier nicht weiter...

Hat jemand einen Tipp, was ich wie untersuchen könnte um den Fehler 
einzugrenzen?

Vielen Dank und viele Grüße
Jochen

von W.S. (Gast)


Lesenswert?

Tja, vermutlich kannst du da garnichts machen. Soweit ich mich erinnere, 
haben einige ältere Chipversionen Probleme mit dem externen Bus. Ich hab 
hier z.B. einige Muster STM32F439BIT6, die am externen Bus angeblich nur 
SDRAM vertragen und eben keinen statischen Ram.

Mein Rat wäre in diesem Falle, auf nen LPC4088 umzusteigen, bei denen 
funktioniert der ext. Bus nachgewiesenermaßen. Klingt nicht gerade 
erhebend, aber besser so als noch ewig auf dem STM herumreiten, wenn's 
nicht will. Das Layout ist - wie ich mal eben voraussetze - in Ordnung 
und belastbar, ja?

W.S.

von derBesucher (Gast)


Lesenswert?

SRAM, PSRAM oder SDRAM sind möglich. Welcher wurde benutzt ?

>Des öfteren treten größere Latenzen beim ausführen von Funktionen auf,
>die nicht hinnehmbar sind.
ST betet immer vor, das internes RAM wesentlich schneller ist als extern 
angebundenes. Und selbst beim internen gibt es markante Unterschiede.

Aber die Fehlerbeschreibung ist sehr vage, nicht hinnehmbare Latenzen 
lässt viel Platz für Spekulationen

>auf nen LPC4088 umzusteigen,funktioniert ... nachgewiesenermaßen
wenn der Bauer nicht schwimmen kann, dann liegts an der Badehose

von m.n. (Gast)


Lesenswert?

W.S. schrieb:
> Mein Rat wäre in diesem Falle, auf nen LPC4088 umzusteigen, bei denen
> funktioniert der ext. Bus nachgewiesenermaßen.

Gibt es vielleicht noch einen ARM, bei dem ext. RAM funktioniert? :-(
Ich habe hier einen F407. Bei dem scheint es zu funktionieren.
Glück gehabt ;-)

@Jochen
Bei Deinen spärlichen Informationen zu Schaltung und Programm, kann man 
doch garnichts antworten.

von Jochen (Gast)


Lesenswert?

Guten Morgen!

Es handelt sich um ein SRAM (R1WV6416R). Das HW-Layout wurde nicht von 
mir gemacht.
Mir ist klar, das die Problembeschreibung nicht einfach ist. Mir reicht 
es ja, wenn ich Tipps bekommen könnte, was ich wie zu testen habe um den 
Fehler eingrenzen und identifizieren zu können.

Viele Grüße
Jochen

von 6a66 (Gast)


Lesenswert?

Jochen schrieb:
> Ein einfacher selbstgeschriebener RAM-Test
> läuft auch erfolgreich über den gesamten Speicherbereich durch.
> Hierbei wird das RAM jeweils vollständig 8Bit, 16Bit, 32Bit und 64Bit
> Werten beschrieben und ausgelesen.

Na, den würde ich doch man über einen Tag durchlaufen lassen. Aber einen 
vernünftigen Test der nicht Zelle N schreibt und dann auch gleich wieder 
liest. Sondern einen der erste eine Teil (e.g 256Byte mit jeweils 
unterschiedlichen Werten) beschreibt, dann wartet (mindestens ein paar 
Sekunden um den Refresh auch zu testen), und dann erst wieder liest.
Wenn der Nichts offenbart würde ich den externen Speicher mal aus dem 
Verdacht rausnehmen.


rgds

von 6a66 (Gast)


Lesenswert?

Jochen schrieb:
> (R1WV6416R)

Ok, das mit dem Refreysh hat sich dann erledigt, das Warten würde ich 
trotzdem machen :)

rgds

von RAc (Gast)


Lesenswert?

Kannst Du die FMC Initialisierung Online stellen? Bei meinen Kunden 
läuft der 27 (ist im Errata sheet gleichgestellt) mit externem SRAM ohne 
Probleme.

von Jochen (Gast)


Lesenswert?

6a66 schrieb:
> Sondern einen der erste eine Teil (e.g 256Byte mit jeweils
> unterschiedlichen Werten) beschreibt, dann wartet (mindestens ein paar
> Sekunden um den Refresh auch zu testen), und dann erst wieder liest.

20 Sekunden Pause zwischen Schreiben und Lesen funktioniert.

RAc schrieb:
> Kannst Du die FMC Initialisierung Online stellen?

Das sollte möglich sein:
1
/**
2
  * @brief  Configures the FMC and GPIOs to interface with the SRAM memory.
3
  *         This function must be called before any write/read operation
4
  *         on the SRAM.
5
  * @param  None
6
  * @retval None
7
  */
8
void External_Mem_GPIOConfig(void)
9
{
10
  GPIO_InitTypeDef GPIO_InitStructure; 
11
  
12
  /* Enable GPIOs clock */
13
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |
14
                         RCC_AHB1Periph_GPIOG, ENABLE);
15
16
17
  
18
/*-- GPIOs Configuration -----------------------------------------------------*/
19
/*
20
 +--------------------+---------------------+-----------------+----------------------+
21
 +                            SRAM pins assignment                                   +
22
 +--------------------+---------------------+-----------------+----------------------+
23
 | PD0  <-> FMC_D2    | PE0  <-> FMC_NBL    | PF0  <-> FMC_A0 | PG0  <-> FMC_A10     | 
24
 | PD1  <-> FMC_D3    | PE1  <-> FMC_NBL    | PF1  <-> FMC_A1 | PG1  <-> FMC_A11     | 
25
 | PD4  <-> FMC_NOE   | PE3  <-> Opt. (A19) | PF2  <-> FMC_A2 | PG2  <-> FMC_A12     | 
26
 | PD5  <-> FMC_NWE   | PE4  <-> Opt. (A20) | PF3  <-> FMC_A3 | PG3  <-> FMC_A13     | 
27
 | PD6  <-> FMC_NWAIT | PE5  <-> Opt. (A21) | PF4  <-> FMC_A4 | PG4  <-> FMC_A14     | 
28
 | PD7  <-> FMC_NE1   | PE7  <-> FMC_D4     | PF5  <-> FMC_A5 | PG5  <-> FMC_A15     | 
29
 | PD8  <-> FMC_D13   | PE8  <-> FMC_D5     | PF12 <-> FMC_A6 | PG9  <-> FMC_NE2     | 
30
 | PD9  <-> FMC_D14   | PE9  <-> FMC_D6     | PF13 <-> FMC_A7 | PG10 <-> RESETFLASH  |
31
 | PD10 <-> FMC_D15   | PE10 <-> FMC_D7     | PF14 <-> FMC_A8 |----------------------+ 
32
 | PD11 <-> FMC_A16   | PE11 <-> FMC_D8     | PF15 <-> FMC_A9 | 
33
 | PD12 <-> FMC_A17   | PE12 <-> FMC_D9     |-----------------+
34
 | PD13 <-> FMC_A18   | PE13 <-> FMC_D10    |
35
 | PD14 <-> FMC_D0    | PE14 <-> FMC_D11    |
36
 | PD15 <-> FMC_D1    | PE15 <-> FMC_D12    | 
37
 +---------------------|--------------------+
38
*/
39
  
40
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
41
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
42
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
43
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
44
  
45
  /* GPIOD configuration */
46
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);
47
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);
48
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FMC);
49
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FMC);
50
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_FMC);
51
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FMC);
52
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC);
53
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC);
54
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC);
55
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FMC); 
56
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FMC);
57
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FMC);
58
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);
59
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);
60
61
  
62
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_4  | GPIO_Pin_5  | 
63
                                GPIO_Pin_6  | GPIO_Pin_7  | 
64
                                GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_11 |
65
                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
66
67
  GPIO_Init(GPIOD, &GPIO_InitStructure);
68
69
70
  /* GPIOE configuration */
71
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FMC);
72
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FMC);
73
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource3 , GPIO_AF_FMC);
74
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FMC);
75
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FMC);
76
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC);
77
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC);
78
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC);
79
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC);
80
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC);
81
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC);
82
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC);
83
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC);
84
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC);
85
86
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_3 |  
87
                                GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_7 |
88
                                GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_11|
89
                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
90
91
  GPIO_Init(GPIOE, &GPIO_InitStructure);
92
93
94
  /* GPIOF configuration */
95
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC);
96
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC);
97
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC);
98
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC);
99
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC);
100
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC);
101
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC);
102
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC);
103
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC);
104
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC);
105
106
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3  | 
107
                                GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_12 | GPIO_Pin_13 |
108
                                GPIO_Pin_14 | GPIO_Pin_15;      
109
110
  GPIO_Init(GPIOF, &GPIO_InitStructure);
111
112
113
  /* GPIOG configuration */
114
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC);
115
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC);
116
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FMC);
117
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource3 , GPIO_AF_FMC);
118
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC);
119
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC);
120
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource9 , GPIO_AF_FMC);
121
122
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3 | 
123
                                GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_9;      
124
125
  GPIO_Init(GPIOG, &GPIO_InitStructure);
126
  
127
  /* Last but not least configure the RESET Pin for the NOR Flash */
128
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
129
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
130
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
131
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
132
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
133
  GPIO_Init(GPIOG, &GPIO_InitStructure);  
134
  /* Set RESET Pin to high => Activate NOR Flash */
135
  GPIO_WriteBit(GPIOG, GPIO_Pin_10, Bit_SET);
136
  
137
  return;
138
}
139
140
void External_Mem_SRAM_Init(void)
141
{
142
  
143
  FMC_NORSRAMInitTypeDef        FMC_NORSRAMInitStructure;
144
  FMC_NORSRAMTimingInitTypeDef  FMC_NORSRAMTimingStructure;  /* Enable FMC clock */
145
  
146
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE); /* RCC_AHB3Periph_FMC and RCC_AHB3Periph_FMC, are the same but with makro switches */
147
  
148
/*-- FMC Configuration ------------------------------------------------------*/
149
#if 0
150
  /* Use this access times @ 168 MHz */
151
  FMC_NORSRAMTimingStructure.FMC_AddressSetupTime       = 8;
152
  FMC_NORSRAMTimingStructure.FMC_AddressHoldTime        = 8;
153
  FMC_NORSRAMTimingStructure.FMC_DataSetupTime          = 8;
154
  FMC_NORSRAMTimingStructure.FMC_BusTurnAroundDuration  = 8;
155
  FMC_NORSRAMTimingStructure.FMC_CLKDivision            = 8;
156
  FMC_NORSRAMTimingStructure.FMC_DataLatency            = 8;
157
  FMC_NORSRAMTimingStructure.FMC_AccessMode             = FMC_AccessMode_A;   
158
#else  
159
  /* Use this access times @ 168 MHz */
160
  FMC_NORSRAMTimingStructure.FMC_AddressSetupTime       = 15;
161
  FMC_NORSRAMTimingStructure.FMC_AddressHoldTime        = 15;
162
  FMC_NORSRAMTimingStructure.FMC_DataSetupTime          = 20;
163
  FMC_NORSRAMTimingStructure.FMC_BusTurnAroundDuration  = 15;
164
  FMC_NORSRAMTimingStructure.FMC_CLKDivision            = 15;
165
  FMC_NORSRAMTimingStructure.FMC_DataLatency            = 15;
166
  FMC_NORSRAMTimingStructure.FMC_AccessMode             = FMC_AccessMode_A;   
167
#endif   
168
169
  FMC_NORSRAMInitStructure.FMC_Bank                     = FMC_Bank1_NORSRAM1;
170
  FMC_NORSRAMInitStructure.FMC_DataAddressMux           = FMC_DataAddressMux_Disable;
171
  FMC_NORSRAMInitStructure.FMC_MemoryType               = FMC_MemoryType_SRAM;
172
  FMC_NORSRAMInitStructure.FMC_MemoryDataWidth          = FMC_NORSRAM_MemoryDataWidth_16b;
173
  FMC_NORSRAMInitStructure.FMC_BurstAccessMode          = FMC_BurstAccessMode_Disable;
174
  FMC_NORSRAMInitStructure.FMC_AsynchronousWait         = FMC_AsynchronousWait_Disable;  
175
  FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity       = FMC_WaitSignalPolarity_Low;
176
  FMC_NORSRAMInitStructure.FMC_WrapMode                 = FMC_WrapMode_Disable;
177
  FMC_NORSRAMInitStructure.FMC_WaitSignalActive         = FMC_WaitSignalActive_BeforeWaitState;
178
  FMC_NORSRAMInitStructure.FMC_WriteOperation           = FMC_WriteOperation_Enable;
179
  FMC_NORSRAMInitStructure.FMC_WaitSignal               = FMC_WaitSignal_Disable;
180
  FMC_NORSRAMInitStructure.FMC_ExtendedMode             = FMC_ExtendedMode_Disable;
181
  FMC_NORSRAMInitStructure.FMC_WriteBurst               = FMC_WriteBurst_Disable;
182
  FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct    = &FMC_NORSRAMTimingStructure;
183
  FMC_NORSRAMInitStructure.FMC_WriteTimingStruct        = &FMC_NORSRAMTimingStructure;
184
 
185
  /* FMC SRAM Banke = Bank1_SRAM1 Bank */
186
  /* FMC SRAM memory de-initializtion */
187
  FMC_NORSRAMDeInit(FMC_Bank1_NORSRAM1);
188
  
189
  /* FMC SRAM bank initialization */
190
  FMC_NORSRAMInit(&FMC_NORSRAMInitStructure);
191
  
192
  /* Enable the SRAM memory bank */
193
  FMC_NORSRAMCmd(FMC_Bank1_NORSRAM1, ENABLE);
194
195
  return;
196
}

von 6a66 (Gast)


Lesenswert?

Jochen schrieb:
> 20 Sekunden Pause zwischen Schreiben und Lesen funktioniert.

Und wenn er mal die Nacht durchläuft - läuft er dann durch?

rgds

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

ok, wir benutzen andere libs, deswegen kann ich keinen direkten 
Vergleich ziehen, aber zwei Anregungen:

1. Du machst nicht so Dinge wie im Linker Command File den Stack ins 
externe SRAM zeigen zu lassen und in ein Unterprogramm zu springen, 
bevor das SRAM initialisiert ist?

2. Sieh Dir mal die Extended Mode Register BTCR und BWTR an, da kannst 
Du für Read und Write unterschiedliche Timings setzen. Bei Dir ist das 
disabled, aber in der funktionierenden Codebasis nutzen wir es.

von Jochen (Gast)


Lesenswert?

m.n. schrieb:
> Ich habe hier einen F407. Bei dem scheint es zu funktionieren.

Der F407 hat einen "Flexible static memory controller (FSMC)."
Ein F437 einen "Flexible memory controller (FMC)"

6a66 schrieb:
> Und wenn er mal die Nacht durchläuft - läuft er dann durch?

Dach macht meines Erachtens keinen Sinn. Die Laufzeitfehler treten ja 
sofort auf und nicht nach x Stunden Laufzeit.

Ruediger A. schrieb:
> 1. Du machst nicht so Dinge wie im Linker Command File den Stack ins
> externe SRAM zeigen zu lassen und in ein Unterprogramm zu springen,
> bevor das SRAM initialisiert ist?

Nein. Der Stack wird per Linkerfile in das interne RAM bugsiert. Genauer 
gesagt CCM. Da liegt er schon die ganze Zeit und es funktioniert.

Ruediger A. schrieb:
> 2. Sieh Dir mal die Extended Mode Register BTCR und BWTR an, da kannst
> Du für Read und Write unterschiedliche Timings setzen. Bei Dir ist das
> disabled, aber in der funktionierenden Codebasis nutzen wir es.

Es gibt die
* SRAM/NOR-Flash chip-select control registers 1..4 (FSMC_BCR1..4)
* SRAM/NOR-Flash chip-select timing registers 1..4 (FSMC_BTR1..4)
und
* SRAM/NOR-Flash write timing registers 1..4 (FSMC_BWTR1..4)

BTCR gibt es IMHO nicht.
Welche Timings verwendet ihr bei welchem RAM Baustein?

Danke & Grüße
Jochen

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Jochen schrieb:
>
> Ruediger A. schrieb:
>> 2. Sieh Dir mal die Extended Mode Register BTCR und BWTR an, da kannst
>> Du für Read und Write unterschiedliche Timings setzen. Bei Dir ist das
>> disabled, aber in der funktionierenden Codebasis nutzen wir es.
>
> Es gibt die
> * SRAM/NOR-Flash chip-select control registers 1..4 (FSMC_BCR1..4)
> * SRAM/NOR-Flash chip-select timing registers 1..4 (FSMC_BTR1..4)
> und
> * SRAM/NOR-Flash write timing registers 1..4 (FSMC_BWTR1..4)
>

uhm, das ist doch sicher ein Schreibfehler (du greifst nicht wirklich 
auf die external flash register zu, wenn Du das SRAM addressieren 
willst?)

Also erstmal sorry, ist bei uns ein 429 und kein 427, aber die sind ja 
durch dieselben App Notes abgedeckt. Beim 429 findest Du BWTR2 (also für 
Bank1) auf a000010C und das BTCR auf a000000c. Die Abkürzungen weichen 
je nach Ökosystem und IDE ab. Wichtig ist das EXTMOD Bit (das scheint 
mir bei deiner Conf disabled zu sein). Was Du willst ist zwischen

FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct    = 
&FMC_NORSRAMTimingStructure;
  FMC_NORSRAMInitStructure.FMC_WriteTimingStruct        = 
&FMC_NORSRAMTimingStructure;

die Struktur unterscheidlich zwischen Read und Write zu belegen, was 
aber nur geht, wenn das Extended bit gesetzt ist.

Typ und konkrete Timingdefs habe ich leider gerade nicht zur Hand. 
Welche RAM Chip hast Du?

Ah noch was: Unbedingt die beiden Strukturen

FMC_NORSRAMInitTypeDef        FMC_NORSRAMInitStructure;
FMC_NORSRAMTimingInitTypeDef  FMC_NORSRAMTimingStructure;

initialisieren, da sie auf dem Stack liegen!

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

Ruediger A. schrieb:
> das ist doch sicher ein Schreibfehler (du greifst nicht wirklich
> auf die external flash register zu, wenn Du das SRAM addressieren
> willst?)

Es geht darum, dass das SRAM an Bank 1 hängt. Und Die Bank 1 für NOR und 
PSRAM gedacht ist.
1
External device address mapping
2
From the FMC point of view, the external memory is divided into 6 fixed-size banks of
3
256 Mbyte each (see Figure 455):
4
 Bank 1 used to address up to 4 NOR Flash memory or PSRAM devices. This bank is
5
split into 4 NOR/PSRAM subbanks with 4 dedicated Chip Selects, as follows:
6
 Bank 1 - NOR/PSRAM 1
7
 Bank 1 - NOR/PSRAM 2
8
 Bank 1 - NOR/PSRAM 3
9
 Bank 1 - NOR/PSRAM 4
10
 Banks 2 and 3 used to address NAND Flash memory devices (1 device per bank)
11
 Bank 4 used to address a PC Card
12
 Bank 5 and 6 used to address SDRAM devices (1 device per bank).
13
For each bank the type of memory to be used can be configured by the user application
14
through the Configuration register.

Ruediger A. schrieb:
> Also erstmal sorry, ist bei uns ein 429 und kein 427, aber die sind ja
> durch dieselben App Notes abgedeckt.

Habe den F437. Aber auch die haben das selbe Errata. ;-)

Ruediger A. schrieb:
> Wichtig ist das EXTMOD Bit (das scheint
> mir bei deiner Conf disabled zu sein).

Habe den Ext.Mode enabled (FMC_NORSRAMInitStructure.FMC_ExtendedMode 
= FMC_ExtendedMode_Enable). Das Timing habe ich beibehalten. Ist weder 
besser noch schlechter geworden...

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Jochen schrieb:
>
> Ruediger A. schrieb:
>> Wichtig ist das EXTMOD Bit (das scheint
>> mir bei deiner Conf disabled zu sein).
>
> Habe den Ext.Mode enabled (FMC_NORSRAMInitStructure.FMC_ExtendedMode
> = FMC_ExtendedMode_Enable). Das Timing habe ich beibehalten. Ist weder
> besser noch schlechter geworden...

Klar, der Teil allein ist natürlich nicht sehr hilfreich... was ich 
meinte ist dass in unserer Konfiguration der DATAST Member vom BWTRx und 
BTCRx abweichen (beim Write Burst etwas geringer), also müsstest Du 
zwischen

FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct    =
&FMC_NORSRAMTimingStructure;

und

  FMC_NORSRAMInitStructure.FMC_WriteTimingStruct        =
&FMC_NORSRAMTimingStructure;

den DataSetupTime member ändern. Allerdings scheinen mir 20 bereits 
enorm hoch (bei uns 9 für read und 7 für write, also ffff0901 bzw. 
ffff0701). Hängt natürlich voll vom verwendeten Chip ab.

Kannst das ein Einzelproblem wie eine kalte Lötstelle am externen 
Adress- oder Datenbus sein, oder ist das Problem mit verschiedenen 
Hardwaren reproduzierbar?

P.S. LV1616RBG-5SI

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

Jochen schrieb:
> Habe den Ext.Mode enabled (FMC_NORSRAMInitStructure.FMC_ExtendedMode
> = FMC_ExtendedMode_Enable). Das Timing habe ich beibehalten. Ist weder
> besser noch schlechter geworden...

HA!
Hat wohl doch was gebracht! Das System läuft gerade stabil hoch! :-D
(Hatte noch durch Kompilerflags nicht alles kompiliert)

Ruediger A. schrieb:
> FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct    =
> &FMC_NORSRAMTimingStructure;
>
> und
>
>   FMC_NORSRAMInitStructure.FMC_WriteTimingStruct        =
> &FMC_NORSRAMTimingStructure;
>

Ja ne. Dann zwei unabhängige Structs für Read und Write. ;-)

Ruediger A. schrieb:
> Kannst das ein Einzelproblem wie eine kalte Lötstelle am externen
> Adress- oder Datenbus sein, oder ist das Problem mit verschiedenen
> Hardwaren reproduzierbar?

Kommt auf mehreren Baugruppen vor.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Jochen schrieb:
> Jochen schrieb:
>> Habe den Ext.Mode enabled (FMC_NORSRAMInitStructure.FMC_ExtendedMode
>> = FMC_ExtendedMode_Enable). Das Timing habe ich beibehalten. Ist weder
>> besser noch schlechter geworden...
>
> HA!
> Hat wohl doch was gebracht! Das System läuft gerade stabil hoch! :-D
> (Hatte noch durch Kompilerflags nicht alles kompiliert)
>

gern geschehen :-)

von Jochen (Gast)


Lesenswert?

Ruediger A. schrieb:
> gern geschehen :-)

Ja, DANKE!
Nur ... ich verstehe den Unterschied nicht. Bzw. warum der RAM-Test die 
ganze Zeit funktioniert hat, aber die Verwendung für Laufzeitvariablen 
nicht (wirklich).
Durch den "Extended Mode" wird ja das Timing des Speicherzugriffs 
verändert. Hätten dann nicht schon die Probleme bei dem RAM Test 
auffallen müssen?

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Jochen schrieb:
> Ruediger A. schrieb:
>> gern geschehen :-)
>
> Ja, DANKE!
> Nur ... ich verstehe den Unterschied nicht. Bzw. warum der RAM-Test die
> ganze Zeit funktioniert hat, aber die Verwendung für Laufzeitvariablen
> nicht (wirklich).
> Durch den "Extended Mode" wird ja das Timing des Speicherzugriffs
> verändert. Hätten dann nicht schon die Probleme bei dem RAM Test
> auffallen müssen?

interessante Frage, müsste man sich ein bisschen da hineinknien... ein 
Schuss ins Blaue besteht darin, dass je nachdem wie der Speichertest 
aufgesetzt ist vielleicht der Optimierer das so umbastelt, dass gar 
nicht wirklich geschrieben, sondern in-Cache verglichen wird? Oder das 
Buffered Write beim Cortex irgendwie Anders zuschlägt? Hast Du mal 
auszugsweise Assembly Code während des Speichertests und beim faultenden 
Zugriff?

: Bearbeitet durch User
von Jochen (Gast)


Lesenswert?

Ruediger A. schrieb:
> der Optimierer das so umbastelt, dass gar
> nicht wirklich geschrieben, sondern in-Cache verglichen wird?

Durch volatile und Verwendung einer Variablen, die zuerst zum 
Beschreiben des vollständigen Speichers und dann zum Lesen verwendet 
wird, sollte dies nicht möglich sein.

Ruediger A. schrieb:
> Oder das
> Buffered Write beim Cortex irgendwie Anders zuschlägt?

Der unterschied zwischen Mode 1 (Extended Mode disabled, default SRAM 
Zugriff) und Mode A (Extended Mode enabled) ist das Timming von "NOE" 
(Output enabled) beim Lesen aus dem Speicher. Sonst haben die Modi's 
keinen Unterschied, da ich am Timing nichts geändert habe und für beide 
die selbe Konfiguration verwende.

Ruediger A. schrieb:
> beim faultenden Zugriff?
Keine Ahnung wann es wo wie zu Zugriffsproblemen zur Laufzeit kommt. 
Breakpoints kann man da leider nicht setzen bzw. diese verändern das 
Timing des Laufzeitverhaltens ...

von m.n. (Gast)


Lesenswert?

Jochen schrieb:
> Keine Ahnung wann es wo wie zu Zugriffsproblemen zur Laufzeit kommt.

Ich würde mir die Signale zum RAM mal mit einem Oskar ansehen.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

m.n. schrieb:
> Jochen schrieb:
>> Keine Ahnung wann es wo wie zu Zugriffsproblemen zur Laufzeit kommt.
>
> Ich würde mir die Signale zum RAM mal mit einem Oskar ansehen.

Jo. Oder auch im Falle eines Faults die SCB Register CFSR,HFSR,DFSR,BFAR 
und AFSR genauer analysieren, ob die einen Hinweis geben (ist es z.B. 
ein Imprecise Fault?)

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.