FMC auf STM32F4 konfigurieren?

Gast #5259047
Ich versuche erfolglos, den SDRAM-Baustein auf dem 
STM32F429-Discovery-Board zu verwenden.

Das Beispiel aus dem CubeHAL funktioniert erstmal. Ich habe dann ein 
Projekt von CubeMX erzeugen lassen, welches den FMC verwendet (SDRAM2, 
#0). Wenn ich nun main.c und main.h aus dem Beispiel-Projekt in mein 
Projekt kopiere (und minimal anpasse, z.B. Header), dann funktioniert 
das Beispiel plötzlich nicht mehr.

system_stm32f4xx.c sieht in meinem Projekt lediglich erweitert aus, das 
stm32f4xx_hal_conf.h ist im Wesentlichen gleich.

Hat jemand das Disco-Board schon einmal richtig konfiguriert? Ich nehme 
an, die Timing-Werte können erstmal auf 16 stehen bleiben? Meine 
Refresh-Rate ist vermutlich korrekt berechnet (1125 für 72 MHz).

Und wieso klappt das Übertragen der Sourcen vom Beispiel in mein Projekt 
nicht, wenn ich main.* komplett ersetze und die o.g. Dateien fast gleich 
sind?
Gast
lars schrieb:
> Wenn ich nun main.c und main.h aus dem Beispiel-Projekt in mein
> Projekt kopiere

Wer macht denn so etwas?
CubeMX hat dir doch schon alles zurecht gebaut.
Nur noch die Inits einfügen und vor allem verstehen was die paar Zeilen 
bedeuten.
Gast
pegel schrieb:
> lars schrieb:
>> Wenn ich nun main.c und main.h aus dem Beispiel-Projekt in mein
>> Projekt kopiere
>
> Wer macht denn so etwas?
> CubeMX hat dir doch schon alles zurecht gebaut.
> Nur noch die Inits einfügen und vor allem verstehen was die paar Zeilen
> bedeuten.

Jo, das ist zu Testzwecken. Denn das, was CubeMX mir erzeugt, 
funktioniert nicht. Obwohl ich es prinzipiell verstehe.

Inzwischen scheine ich auch herausgefunden zu haben, woran es liegt: Die 
GPIO-Pins des FMC werden nicht konfiguriert. Ich dachte, das passiert 
automatisch irgendwo tief unten. Tatsächlich scheint das 
SystemInit_ExtMemCtl() in system_stm32f4xx.c zu erledigen, aber nur wenn 
DATA_IN_ExtSDRAM gesetzt ist?!

Welcher Programmteil konfiguriert normalerweise die GPIO-Pins? CubeMX 
setzt diese auf Alternate Function, genügt das?
Gast
Wie ich sehe, benutzt du noch die alten Versionen.
CubeMX 4.22.1 und HAL 1.16.0

Hast du vor zu aktualisieren?
CubeMX 4.23.0 und HAL 1.18.0

Die alten Versionen habe ich schon gelöscht.
Sonst müsste ich wieder fast 1 GB runter laden.

Naja, ich gucke mal in die .ioc.
Gast
Ich weiß nicht, ob mein Anliegen klar geworden ist: Das Beispiel 
funktioniert einwandfrei, aber jetzt will ich das selbst mit CubeMX (und 
z.B. einem anderen Takt) konfigurieren.

Das neue CubeMX wollte ich gerade installieren, aber dem Verzeichnis 
fehlen site.xml und features/, womit Eclipse das Plugin nicht sieht -> 
Murks.
Ich habe den Kampf in den letzten Wochen auch gekämpft. Offenbar ist 
neben der Initialisierung des FMC durch den CubeMX-Code auch die 
Initialisierug des SDRAMs selbst nötig. In der Datei 
*\STM32Cube_FW_F4_V1.18.0\Drivers\BSP\STM32F429I-Discovery\stm32f429i_di 
scovery_sdram.c  bin ich dann fündig geworden:
1
void BSP_SDRAM_Initialization_sequence(uint32_t RefreshCount)
2
{
3
  __IO uint32_t tmpmrd =0;
4
  
5
  /* Step 1:  Configure a clock configuration enable command */
6
  Command.CommandMode             = FMC_SDRAM_CMD_CLK_ENABLE;
7
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK2;
8
  Command.AutoRefreshNumber       = 1;
9
  Command.ModeRegisterDefinition  = 0;
10

11
  /* Send the command */
12
  HAL_SDRAM_SendCommand(&SdramHandle, &Command, SDRAM_TIMEOUT);
13

14
  /* Step 2: Insert 100 us minimum delay */ 
15
  /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
16
  HAL_Delay(1);
17

18
  /* Step 3: Configure a PALL (precharge all) command */ 
19
  Command.CommandMode             = FMC_SDRAM_CMD_PALL;
20
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK2;
21
  Command.AutoRefreshNumber       = 1;
22
  Command.ModeRegisterDefinition  = 0;
23

24
  /* Send the command */
25
  HAL_SDRAM_SendCommand(&SdramHandle, &Command, SDRAM_TIMEOUT);  
26
  
27
  /* Step 4: Configure an Auto Refresh command */ 
28
  Command.CommandMode             = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
29
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK2;
30
  Command.AutoRefreshNumber       = 4;
31
  Command.ModeRegisterDefinition  = 0;
32

33
  /* Send the command */
34
  HAL_SDRAM_SendCommand(&SdramHandle, &Command, SDRAM_TIMEOUT);
35
  
36
  /* Step 5: Program the external memory mode register */
37
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
38
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
39
                     SDRAM_MODEREG_CAS_LATENCY_3           |
40
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
41
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
42
  
43
  Command.CommandMode             = FMC_SDRAM_CMD_LOAD_MODE;
44
  Command.CommandTarget           = FMC_SDRAM_CMD_TARGET_BANK2;
45
  Command.AutoRefreshNumber       = 1;
46
  Command.ModeRegisterDefinition  = tmpmrd;
47

48
  /* Send the command */
49
  HAL_SDRAM_SendCommand(&SdramHandle, &Command, SDRAM_TIMEOUT);
50
  
51
  /* Step 6: Set the refresh rate counter */
52
  /* Set the device refresh rate */
53
  HAL_SDRAM_ProgramRefreshRate(&SdramHandle, RefreshCount); 
54
}

Danach war das SDRAM ansprechbar. Die "richtigen" Timingparameter sind 
übrigens auch in der Datei bzw. teilweise im dazugehörigen H-File.
Gast
Diese Initialisierungssequenz aus dem Beispiel ("Steps 3-8") habe ich in 
meinem Programm auch, mit angepaßtem Timing und Refresh Rate.

Da ich einen bei mir funktionierenden LL-Schnipsel habe, konnte ich 
ermitteln, welche Schritte bei mir offenbar fehlen:

1. Das Setzen der FMC-Pins auf Alternate Function
2. RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;

Im Datenblatt steht auch noch, dass ggf. der andere FMC-Controller noch 
gesetzt werden muß:

3. FMC_Bank5_6->SDCR[0] = ...;

Wenn ich mir die HAL-Dateien (oberflächlich) anschaue, dann finde ich 
keinen der Punkte.
Gast
Punkte 1 und 2 sind definitiv im erstellten Projekt.
Ich fürchte, du machst noch grundlegende Fehler bei der 
Projekterstellung aus CubeMX, bzw. bei der Bedienung von CubeMX.

Probier doch erst mal eine einfache Peripherie mit CubeMX, wie zum 
Beispiel den UART zum laufen zu bekommen.
Gast
GPIO, SDIO und RCC funktionieren, es fehlt mir nur noch der FMC.

Anbei sind meine Einstellungen in CubeMX, vielleicht erkennst Du ja, was 
ich falsch mache. Die Timing-Werte habe ich auf 16 gelassen, mehr tut ja 
nicht weh, oder?

Das CubeMX-Projekt habe ich nochmal in der aktuellen Version angehängt.
Angehängte Dateien:
Gast
Das neue CubeMX erzeugt übrigens einige .tmp Dateien in meinem Src/ 
Verzeichnis, darunter auch mx_fmx_MSP.tmp, welches im Prinzip die 
Pin-Definitionen für den FMC enthält. Allerdings finde ich den 
entsprechenden Code nicht in meinem main.c wieder.
Gast
Genau das scheint das Problem zu sein.
Ob das nun durch Übernahme aus der alten Version, oder durch einen Bug 
passiert ist, weiß ich nicht.

Ich erstelle Projekte immer mit extra .c/.h Dateien siehe Bild.

Damit ist alles schön gegliedert.

Übrigens ist SWD immer noch nicht aktiv.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.