Beschreibung :
Mit dieser Library kann das externe SD-RAM auf dem STM32F746 Discovery-Board benutzt werden.
Das RAM hat eine Speichergröße von 128MBit (8MByte nutzbar) und hängt am FMC-Bus der CPU. Ich habe mehrere Funktionen geschrieben um Daten auf das RAM zu lesen und zu schreiben.
Module :
1 | stm32_ub_sdram.h, stm32_ub_sdram.c |
Includes :
1 | #include "stm32_ub_system.h" |
Defines :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #define SDRAM_MAX_ADR 0x800000 // max=8MByte #define SDRAM_START_ADR ((uint32_t)0xC0000000) #define SDRAM_MEMORY_WIDTH FMC_SDRAM_MEM_BUS_WIDTH_16 #define SDCLOCK_PERIOD FMC_SDRAM_CLOCK_PERIOD_2 #define SDRAM_TIMEOUT ((uint32_t)0xFFFF) #define REFRESH_COUNT ((uint32_t)0x0603) #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) #define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) #define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) #define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) #define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) #define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) |
Funktionen :
1 2 3 4 5 6 7 8 9 | ErrorStatus UB_SDRAM_Init(void); void UB_SDRAM_Write8b(uint32_t adr, uint8_t wert); uint8_t UB_SDRAM_Read8b(uint32_t adr); void UB_SDRAM_Write16b(uint32_t adr, uint16_t wert); uint16_t UB_SDRAM_Read16b(uint32_t adr); void UB_SDRAM_Write32b(uint32_t adr, uint32_t wert); uint32_t UB_SDRAM_Read32b(uint32_t adr); ErrorStatus UB_SDRAM_WriteBuffer32b(uint32_t* ptrBuffer, uint32_t startAdr, uint32_t lenBuffer); ErrorStatus UB_SDRAM_ReadBuffer32b(uint32_t* ptrBuffer, uint32_t startAdr, uint32_t lenBuffer); |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | //-------------------------------------------------------------- // File : main.c // Datum : 01.01.2016 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F746 // Board : STM32F746-Discovery-Board // IDE : OpenSTM32 // GCC : 4.9 2015q2 // Module : CubeHAL // Funktion : Hauptprogramm //-------------------------------------------------------------- #include "stm32_ub_system.h" #include "stm32_ub_sdram.h" #include "stm32_ub_led.h" int main(void) { uint32_t adr; uint8_t sollwert, istwert; ErrorStatus ramcheck; // init vom System UB_System_Init(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init vom externen SDRAM (und test ob es vorhanden ist) ramcheck=UB_SDRAM_Init(); if(ramcheck==SUCCESS) { // zum test RAM komplett füllen sollwert=0xA1B2; for(adr=0;adr<SDRAM_MAX_ADR;adr+=2) { UB_SDRAM_Write16b(adr,sollwert); sollwert++; } // Ram wieder auslesen und prüfen sollwert=0xA1B2; for(adr=0;adr<SDRAM_MAX_ADR;adr+=2) { istwert=UB_SDRAM_Read16b(adr); if(istwert!=sollwert) { // RAM-Inhalt fehlerhaft ramcheck=ERROR; } sollwert++; } } while(1) { if(ramcheck==SUCCESS) { // wenn kein Fehler -> gruene LED leuchtet UB_Led_On(LED_GREEN); } else { // wenn Fehler -> gruene LED blinkt UB_Led_Toggle(LED_GREEN); HAL_Delay(500); //Delay in ms } } } |
Hier die Library zum Download :
03 = SDRAM : f746_sdram_v100