aboutsummaryrefslogtreecommitdiffstats
path: root/testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c
diff options
context:
space:
mode:
authorbarthess <barthess@yandex.ru>2014-10-25 15:26:29 +0300
committerbarthess <barthess@yandex.ru>2014-10-25 15:26:29 +0300
commitb47ddce74d284f5b1b6a1e67fcf81febf43f62cf (patch)
treeb60245d24a67aa5d3a8a7c0de8b7b5e0ad9cb8f0 /testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c
parente9f9ddaa12464a5706617814d2244b0937cdf9fc (diff)
downloadChibiOS-Contrib-b47ddce74d284f5b1b6a1e67fcf81febf43f62cf.tar.gz
ChibiOS-Contrib-b47ddce74d284f5b1b6a1e67fcf81febf43f62cf.tar.bz2
ChibiOS-Contrib-b47ddce74d284f5b1b6a1e67fcf81febf43f62cf.zip
FSMC. SDRAM driver cleanup. Needs review.
Diffstat (limited to 'testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c')
-rw-r--r--testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c96
1 files changed, 93 insertions, 3 deletions
diff --git a/testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c b/testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c
index ba2b2b4..68d9b44 100644
--- a/testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c
+++ b/testhal/STM32/STM32F4xx/FSMC_SDRAM/main.c
@@ -38,6 +38,85 @@ write memtest function using ideas from http://www.memtest86.com/technical.htm
#define USE_INFINITE_MEMTEST FALSE
/*
+ * FMC SDRAM Mode definition register defines
+ */
+#define FMC_SDCMR_MRD_BURST_LENGTH_1 ((uint16_t)0x0000)
+#define FMC_SDCMR_MRD_BURST_LENGTH_2 ((uint16_t)0x0001)
+#define FMC_SDCMR_MRD_BURST_LENGTH_4 ((uint16_t)0x0002)
+#define FMC_SDCMR_MRD_BURST_LENGTH_8 ((uint16_t)0x0004)
+#define FMC_SDCMR_MRD_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
+#define FMC_SDCMR_MRD_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)
+#define FMC_SDCMR_MRD_CAS_LATENCY_2 ((uint16_t)0x0020)
+#define FMC_SDCMR_MRD_CAS_LATENCY_3 ((uint16_t)0x0030)
+#define FMC_SDCMR_MRD_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
+#define FMC_SDCMR_MRD_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
+#define FMC_SDCMR_MRD_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)
+
+/*
+ * FMC_ReadPipe_Delay
+ */
+#define FMC_ReadPipe_Delay_0 ((uint32_t)0x00000000)
+#define FMC_ReadPipe_Delay_1 ((uint32_t)0x00002000)
+#define FMC_ReadPipe_Delay_2 ((uint32_t)0x00004000)
+#define FMC_ReadPipe_Delay_Mask ((uint32_t)0x00006000)
+
+/*
+ * FMC_Read_Burst
+ */
+#define FMC_Read_Burst_Disable ((uint32_t)0x00000000)
+#define FMC_Read_Burst_Enable ((uint32_t)0x00001000)
+#define FMC_Read_Burst_Mask ((uint32_t)0x00001000)
+
+/*
+ * FMC_SDClock_Period
+ */
+#define FMC_SDClock_Disable ((uint32_t)0x00000000)
+#define FMC_SDClock_Period_2 ((uint32_t)0x00000800)
+#define FMC_SDClock_Period_3 ((uint32_t)0x00000C00)
+#define FMC_SDClock_Period_Mask ((uint32_t)0x00000C00)
+
+/*
+ * FMC_ColumnBits_Number
+ */
+#define FMC_ColumnBits_Number_8b ((uint32_t)0x00000000)
+#define FMC_ColumnBits_Number_9b ((uint32_t)0x00000001)
+#define FMC_ColumnBits_Number_10b ((uint32_t)0x00000002)
+#define FMC_ColumnBits_Number_11b ((uint32_t)0x00000003)
+
+/*
+ * FMC_RowBits_Number
+ */
+#define FMC_RowBits_Number_11b ((uint32_t)0x00000000)
+#define FMC_RowBits_Number_12b ((uint32_t)0x00000004)
+#define FMC_RowBits_Number_13b ((uint32_t)0x00000008)
+
+/*
+ * FMC_SDMemory_Data_Width
+ */
+#define FMC_SDMemory_Width_8b ((uint32_t)0x00000000)
+#define FMC_SDMemory_Width_16b ((uint32_t)0x00000010)
+#define FMC_SDMemory_Width_32b ((uint32_t)0x00000020)
+
+/*
+ * FMC_InternalBank_Number
+ */
+#define FMC_InternalBank_Number_2 ((uint32_t)0x00000000)
+#define FMC_InternalBank_Number_4 ((uint32_t)0x00000040)
+
+/*
+ * FMC_CAS_Latency
+ */
+#define FMC_CAS_Latency_1 ((uint32_t)0x00000080)
+#define FMC_CAS_Latency_2 ((uint32_t)0x00000100)
+#define FMC_CAS_Latency_3 ((uint32_t)0x00000180)
+
+/*
+ * FMC_Write_Protection
+ */
+#define FMC_Write_Protection_Disable ((uint32_t)0x00000000)
+#define FMC_Write_Protection_Enable ((uint32_t)0x00000200)
+
+/*
******************************************************************************
* EXTERNS
******************************************************************************
@@ -62,7 +141,7 @@ static const size_t extram_size = 1024*1024;
* SDRAM driver configuration structure.
*/
static const SDRAMConfig sdram_cfg = {
- .sdcr1 = (uint32_t) FMC_ColumnBits_Number_9b |
+ .sdcr = (uint32_t) FMC_ColumnBits_Number_9b |
FMC_RowBits_Number_13b |
FMC_SDMemory_Width_16b |
FMC_InternalBank_Number_4 |
@@ -71,13 +150,24 @@ static const SDRAMConfig sdram_cfg = {
FMC_SDClock_Period_3 |
FMC_Read_Burst_Enable |
FMC_ReadPipe_Delay_1,
- .sdtr1 = (uint32_t) (2 - 1) | // FMC_LoadToActiveDelay = 2 (TMRD: 2 Clock cycles)
+ .sdtr = (uint32_t) (2 - 1) | // FMC_LoadToActiveDelay = 2 (TMRD: 2 Clock cycles)
(7 << 4) | // FMC_ExitSelfRefreshDelay = 7 (TXSR: min=70ns (7x11.11ns))
(4 << 8) | // FMC_SelfRefreshTime = 4 (TRAS: min=42ns (4x11.11ns) max=120k (ns))
(7 << 12) | // FMC_RowCycleDelay = 7 (TRC: min=70 (7x11.11ns))
(2 << 16) | // FMC_WriteRecoveryTime = 2 (TWR: min=1+ 7ns (1+1x11.11ns))
(2 << 20) | // FMC_RPDelay = 2 (TRP: 20ns => 2x11.11ns)
- (2 << 24) // FMC_RCDDelay = 2 (TRCD: 20ns => 2x11.11ns)
+ (2 << 24), // FMC_RCDDelay = 2 (TRCD: 20ns => 2x11.11ns)
+ /* NRFS = 4-1*/
+ .sdcmr = (3 << 5) | (FMC_SDCMR_MRD_BURST_LENGTH_2 |
+ FMC_SDCMR_MRD_BURST_TYPE_SEQUENTIAL |
+ FMC_SDCMR_MRD_CAS_LATENCY_3 |
+ FMC_SDCMR_MRD_OPERATING_MODE_STANDARD |
+ FMC_SDCMR_MRD_WRITEBURST_MODE_SINGLE) << 9,
+
+ /* if (STM32_SYSCLK == 180000000) ->
+ 64ms/4096=15.625us
+ 15.625us*90MHz=1406-20=1386 */
+ .sdrtr = 1386 << 1
};
/* benchmarking results in MiB/S */