Forum: Compiler & IDEs Rowley Crossworks und "STM32F469NI Discovery" ext. Mem, definieren


von Josef E. (meridian)


Lesenswert?

Hallo zusammen,
 irgendwie bekomme ich die "Applications" Beispiele, z.B. STemWin Demo
 aus dem "STM32Cube_FW_F4_V1.16.0" mit crossworks nicht zum laufen.

 Das Problem liegt wohl bei der fehlerhaften Initialiserung des externen
 128Mb Flash und Ram.
 STemWin legt z.B. sein FrameBuffer im Code auf 0xC0000000  (RAM2),
 von dem her ist die Nutzung wohl zwingend.

 In Flash_placement.xml und STM3F469NI_Memorymap.xml habe ich die
 MemorySegment-Namen angepasst, aber die ProgramSection default 
belassen.

 In der thumb_crt0.s habe ich, weil in den "Edit Properties" nicht
 gefunden, die Nutzung von ext. Mem. mit
                   #ifndef INITIALIZE_SECONDARY_SECTIONS . . .
 manuell gesetzt.


 Der "HardFault" beim debuggen erfolgt in der GUIDEMO.c   _Main()  bei
 _hDialogControl = GUI_CreateDialogBox(_aFrameWinControl,
 GUI_COUNTOF(_aFrameWinControl), &_cbFrameWinControl, WM_HBKWIN, xSize - 
CONTROL_SIZE_X, ySize - CONTROL_SIZE_Y);
 in <GUI_ALLOC_LockH>.

 Wäre sehr dankbar für Tipps, oder wenn jemand ein Lösungsweg anbieten 
könnte.

Grüße
meridian

von Til S. (Firma: SEGGER) (til_s)


Lesenswert?

Prinzipiell kannst du den emWin Framebuffer hinlegen, wo du möchtest. 
Einzige Voraussetzung ist, das der Speicher initialisiert ist und du 
dort keine anderen Daten liegen hast.
Am saubersten ist es natürlich sich ein Segment in den Linkerfiles zu 
erzeugen und den Framebuffer als Array in dieses Segment zu legen:

int FrameBuffer[320*240] _attribute_ ((section 
("FrameBufferSection")));

Ich würde bei dir vermuten, das du externes SDRAM hast aber dieses nicht 
initialisert wird. Du kannst ja einfach im Memory Fenster schauen, ob du 
den Speicher lesen/schreiben kannst.

von Josef E. (meridian)


Lesenswert?

Hallo Til,
besten Dank für die  Info.
Ja, das STM32F469 Discovery Board hat externes SDRAM und FLASH und bis 
letzte Woche konnte ich kein Memory-Fenster für SDRAM und FLASH (jew. 
16MB) in Crossworks sehen bzw. initialisieren. Ich möchte ja mehrere 
DEMOS aus dem STM32CubeF4 testen, dafür alle FrameBuffer im Source-Code 
anzupassen scheint mir aufwendig. Davon ausgehend, dass alle Projekte 
aus dem Cube auf Keil und IAR IDE's zugeschnitten sind und laufen, 
müsste es für Crossworks wohl auch eine Lösung und dies mit wenig 
Aufwand geben.

Mittlerweile habe ich zumindest das SDRAM1 initialisiert, als 
Memory-Fenster sichtbar und das Stemwin-DEMO läuft.

Schritte bis dahin, u.a.
       - alle benutzten Middleware Library müssen GCC compliert sein
       - in der flash_placement.xml von crossworks, SDRAM1 erweitert mit
             <ProgramSection alignment="4" Load="No" name=".ExtRAMData" 
/>
       - in der system_stm32f4xx.c die Configuration gesetzt:
            #define DATA_IN_ExtSDRAM
       - in der thumb_crt0.s die secondary section definiert
      #ifndef INITIALIZE_SECONDARY_SECTIONS
      #define INITIALIZE_SECONDARY_SECTIONS 1
      #endif
       - HEAP und MAIN STACK Size verdoppelt (512Bytes)
       - in der stm32469_discovery_sdram.c, Func.: void 
BSP_SDRAM_Init....
          nach jedem HAL_SDRAM_SendCommand(...
          eine Delay-Zeit von 300ms eingefügt.
  . . .

Da mir das benutzte Discovery-Board gut gefällt und crossworks, wenn man 
sich damit länger  beschäfftigt,  zu handeln ist, versuche ich mich noch 
an der Initialisierung des ext. FLASH
und werde hier noch eine kleine Anleitung einstellen.

Gruß

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.