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
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.
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
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.
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
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
Jochen schrieb: > (R1WV6416R) Ok, das mit dem Refreysh hat sich dann erledigt, das Warten würde ich trotzdem machen :) rgds
Kannst Du die FMC Initialisierung Online stellen? Bei meinen Kunden läuft der 27 (ist im Errata sheet gleichgestellt) mit externem SRAM ohne Probleme.
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 | }
|
Jochen schrieb: > 20 Sekunden Pause zwischen Schreiben und Lesen funktioniert. Und wenn er mal die Nacht durchläuft - läuft er dann durch? rgds
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.
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
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
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...
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
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.
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 :-)
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?
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
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 ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.