cpu_fmc.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2023 Gunar Schorcht
3  * SPDX-License-Identifier: LGPL-2.1-only
4  */
5 
6 #pragma once
7 
54 #include <stdint.h>
55 
56 #include "cpu.h"
57 #include "periph/cpu_gpio.h"
58 
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 
70 #ifndef FMC_BANK_CONFIG
71 #define FMC_BANK_CONFIG(n) (&fmc_bank_config[n])
72 #endif
73 
82 #if MODULE_PERIPH_FMC_32BIT || DOXYGEN
83 #define FMC_DATA_PIN_NUMOF (32)
84 #elif MODULE_PERIPH_FMC_16BIT
85 #define FMC_DATA_PIN_NUMOF (16)
86 #else
87 #define FMC_DATA_PIN_NUMOF (8)
88 #endif
89 
100 #if MODULE_PERIPH_FMC_NOR_SRAM || DOXYGEN
101 #define FMC_ADDR_PIN_NUMOF (26)
102 #elif MODULE_PERIPH_FMC_SDRAM
103 #define FMC_ADDR_PIN_NUMOF (13)
104 #else
105 #define FMC_ADDR_PIN_NUMOF (0)
106 #endif
107 
108 #if DOXYGEN
119 #define FMC_RAM_ADDR 0x60000000
120 
133 #define FMC_RAM_LEN 1024K
134 #endif
135 
143 typedef enum {
149 
156 typedef struct {
159  uint8_t clk_div;
160  uint8_t addr_setup;
161  uint8_t addr_hold;
162  uint8_t data_setup;
163  uint8_t data_latency;
165  uint8_t bus_turnaround;
167 
171 typedef struct {
172  uint8_t sub_bank;
173  bool mux_enable;
175  bool wait_enable;
177  bool ext_mode;
193 typedef enum {
194  FMC_BURST_LENGTH_1 = 0, /* Burst length is 1 */
195  FMC_BURST_LENGTH_2 = 1, /* Burst length is 2 */
196  FMC_BURST_LENGTH_4 = 2, /* Burst length is 4 */
197  FMC_BURST_LENGTH_8 = 3, /* Burst length is 8 */
198  FMC_BURST_LENGTH_16 = 4, /* Burst length is 16 */
199  FMC_BURST_LENGTH_32 = 5, /* Burst length is 32 */
200  FMC_BURST_LENGTH_64 = 6, /* Burst length is 64 */
201  FMC_BURST_LENGTH_FULL = 7, /* Burst length is full page */
203 
207 typedef struct {
211  uint8_t row_precharge;
214  uint8_t recovery_delay;
217  uint8_t row_cylce;
220  uint8_t self_refresh;
228  uint8_t refresh_period;
230 
234 typedef struct {
235  uint8_t clk_period;
236  uint8_t row_bits;
237  uint8_t col_bits;
238  uint8_t cas_latency;
239  uint8_t read_delay;
240  bool four_banks;
242  bool burst_read;
243  bool burst_write;
257 typedef struct {
258  gpio_t pin;
260 } fmc_gpio_t;
261 
274 typedef struct {
275  uint8_t bus;
276  uint32_t rcc_mask;
278 #if FMC_ADDR_PIN_NUMOF || DOXYGEN
280 #endif
281  /* signals used by all kind of memories */
287 #if MODULE_PERIPH_FMC_NOR_SRAM
288  /* NORs, PSRAMs, and SRAMs use CLK, NOE, NWE, NE, and NADV signals **/
289  fmc_gpio_t clk_pin;
290  fmc_gpio_t noe_pin;
291  fmc_gpio_t nwe_pin;
292  fmc_gpio_t ne1_pin;
293  fmc_gpio_t ne2_pin;
294  fmc_gpio_t ne3_pin;
295  fmc_gpio_t ne4_pin;
296  fmc_gpio_t nadv_pin;
297 #endif /* MODULE_PERIPH_FMC_NORSRAM */
298 #if MODULE_PERIPH_FMC_SDRAM
299  /* SDRAMs use BAx, CLK, RAS, CAS, WE, ... signals **/
300  fmc_gpio_t ba0_pin;
301  fmc_gpio_t ba1_pin;
302  fmc_gpio_t sdclk_pin;
303  fmc_gpio_t sdnwe_pin;
304  fmc_gpio_t sdnras_pin;
305  fmc_gpio_t sdncas_pin;
306  fmc_gpio_t sdcke0_pin;
307  fmc_gpio_t sdcke1_pin;
308  fmc_gpio_t sdne0_pin;
309  fmc_gpio_t sdne1_pin;
310 #endif /* MODULE_PERIPH_FMC_SDRAM */
311 } fmc_conf_t;
312 
316 typedef enum {
318 #if defined(FMC_Bank2_3_R_BASE)
319  FMC_BANK_2 = 2,
320 #endif
321 #if defined(FMC_Bank2_3_R_BASE) || defined(FMC_Bank3_R_BASE)
322  FMC_BANK_3 = 3,
323 #endif
324 #if defined(FMC_Bank4_R_BASE)
325  FMC_BANK_4 = 4,
326 #endif
327 #if defined(FMC_Bank5_6_R_BASE)
328  FMC_BANK_5 = 5,
329  FMC_BANK_6 = 6,
330 #endif
331 } fmc_bank_t;
332 
336 typedef enum {
337  FMC_SRAM = 0,
338  FMC_PSRAM = 1,
339  FMC_NOR = 2,
340  FMC_NAND = 3,
341  FMC_SDRAM = 4,
343 
347 typedef enum {
352 
356 typedef struct {
360  uint32_t address;
361  uint32_t size;
362  union {
363  fmc_nor_sram_bank_conf_t nor_sram; /* Configuration in case of NOR/PSRAM/SRAM */
364  fmc_sdram_bank_conf_t sdram; /* Configuration in case of SDRAM */
365  };
367 
368 typedef uint8_t fmc_bank_id_t;
371 #ifdef __cplusplus
372 }
373 #endif
374 
GPIO CPU definitions for the STM32 family.
gpio_af_t
Override alternative GPIO mode options.
Definition: periph_cpu.h:162
#define FMC_DATA_PIN_NUMOF
Number of data pins used.
Definition: cpu_fmc.h:83
#define FMC_ADDR_PIN_NUMOF
Number of address pins used.
Definition: cpu_fmc.h:101
fmc_mem_type_t
Memory types supported by the FMC controller.
Definition: cpu_fmc.h:336
fmc_access_mode_t
Memory access modes for NOR/PSRAM/SRAM in extended mode.
Definition: cpu_fmc.h:143
uint8_t fmc_bank_id_t
FMC bank identifier.
Definition: cpu_fmc.h:368
fmc_bus_width_t
Memory data bus widths.
Definition: cpu_fmc.h:347
fmc_bust_length_t
SDRAM Burst Length as an exponent of a power of two.
Definition: cpu_fmc.h:193
fmc_bank_t
Memory banks.
Definition: cpu_fmc.h:316
@ FMC_SDRAM
SDRAM Controller used.
Definition: cpu_fmc.h:341
@ FMC_NOR
NOR Flash.
Definition: cpu_fmc.h:339
@ FMC_SRAM
SRAM.
Definition: cpu_fmc.h:337
@ FMC_PSRAM
PSRAM.
Definition: cpu_fmc.h:338
@ FMC_NAND
NAND Flash.
Definition: cpu_fmc.h:340
@ FMC_MODE_A
Access mode A.
Definition: cpu_fmc.h:144
@ FMC_MODE_B
Access mode B.
Definition: cpu_fmc.h:145
@ FMC_MODE_C
Access mode C.
Definition: cpu_fmc.h:146
@ FMC_MODE_D
Access mode D.
Definition: cpu_fmc.h:147
@ FMC_BUS_WIDTH_16BIT
16 bit data bus width
Definition: cpu_fmc.h:349
@ FMC_BUS_WIDTH_32BIT
32 bit data bus width
Definition: cpu_fmc.h:350
@ FMC_BUS_WIDTH_8BIT
8 bit data bus width
Definition: cpu_fmc.h:348
@ FMC_BANK_1
Bank 1 is always available and used for NOR, PSRAM, SRAM.
Definition: cpu_fmc.h:317
Bank configuration structure.
Definition: cpu_fmc.h:356
fmc_bus_width_t data_width
Data bus width.
Definition: cpu_fmc.h:359
uint32_t address
Address of the memory bank.
Definition: cpu_fmc.h:360
uint32_t size
Size in bytes of the memory bank.
Definition: cpu_fmc.h:361
fmc_mem_type_t mem_type
Type of memory.
Definition: cpu_fmc.h:358
fmc_bank_t bank
Bank1 .
Definition: cpu_fmc.h:357
FMC peripheral configuration.
Definition: cpu_fmc.h:274
fmc_gpio_t nwait_pin
NWAIT pin.
Definition: cpu_fmc.h:286
uint8_t bus
AHB/APB bus.
Definition: cpu_fmc.h:275
fmc_gpio_t nbl0_pin
NBL0 pin.
Definition: cpu_fmc.h:282
fmc_gpio_t nbl1_pin
NBL1 pin.
Definition: cpu_fmc.h:283
fmc_gpio_t nbl2_pin
NBL2 pin.
Definition: cpu_fmc.h:284
uint32_t rcc_mask
Bit in clock enable register.
Definition: cpu_fmc.h:276
fmc_gpio_t nbl3_pin
NBL3 pin.
Definition: cpu_fmc.h:285
FMC GPIO configuration type.
Definition: cpu_fmc.h:257
gpio_t pin
GPIO pin.
Definition: cpu_fmc.h:258
gpio_af_t af
Alternate function.
Definition: cpu_fmc.h:259
Bank configuration structure for NOR/PSRAM/SRAM.
Definition: cpu_fmc.h:171
bool ext_mode
Extended mode used (separate read and write timings)
Definition: cpu_fmc.h:177
fmc_nor_sram_timing_t w_timing
Write timings (only used if fmc_nor_sram_bank_conf_t::ext_mode is true)
Definition: cpu_fmc.h:181
bool wait_enable
Wait signal used for synchronous access.
Definition: cpu_fmc.h:175
bool mux_enable
Multiplexed address/data signals used (only valid for PSRAMs and NORs.
Definition: cpu_fmc.h:173
uint8_t sub_bank
Bank1 has 4 subbanks 1..4.
Definition: cpu_fmc.h:172
fmc_nor_sram_timing_t r_timing
Read timings (also used for write if fmc_nor_sram_bank_conf_t::ext_mode is false)
Definition: cpu_fmc.h:179
Timing configuration for NOR/PSRAM/SRAM.
Definition: cpu_fmc.h:156
uint8_t bus_turnaround
Bus turnaround phase duration [0..15], default 15.
Definition: cpu_fmc.h:165
uint8_t clk_div
Clock divide ratio, FMC_CLK = HCLK / (DIV + 1)
Definition: cpu_fmc.h:159
uint8_t data_setup
Data setup time [0..15], default 15.
Definition: cpu_fmc.h:162
uint8_t addr_hold
Address hold time [0..15], default 15.
Definition: cpu_fmc.h:161
fmc_access_mode_t mode
Access Mode used (only used if fmc_nor_sram_bank_conf_t::ext_mode is true)
Definition: cpu_fmc.h:157
uint8_t addr_setup
Address setup time [0..15], default 15.
Definition: cpu_fmc.h:160
uint8_t data_latency
Data latency for synchronous access [0..15], default 15 (only used in read timing)
Definition: cpu_fmc.h:163
Bank configuration structure for SDRAM.
Definition: cpu_fmc.h:234
uint8_t cas_latency
CAS latency in SDCLK clock cycles [1..3].
Definition: cpu_fmc.h:238
bool burst_write
Burst write mode enabled.
Definition: cpu_fmc.h:243
uint8_t col_bits
Number column address bits [8..11].
Definition: cpu_fmc.h:237
bool burst_read
Burst read mode enabled.
Definition: cpu_fmc.h:242
uint8_t row_bits
Number row address bits [11..13].
Definition: cpu_fmc.h:236
fmc_bust_length_t burst_len
Burst length as an exponent of a power of two.
Definition: cpu_fmc.h:245
fmc_sdram_timing_t timing
SDRAM Timing configuration.
Definition: cpu_fmc.h:246
bool write_protect
Write protection enabled.
Definition: cpu_fmc.h:241
uint8_t read_delay
Delay for reading data after CAS latency in HCLKs [0..2].
Definition: cpu_fmc.h:239
bool burst_interleaved
Burst mode interleaved, otherwise sequential.
Definition: cpu_fmc.h:244
bool four_banks
SDRAM has four internal banks.
Definition: cpu_fmc.h:240
uint8_t clk_period
CLK period [0,2,3] (0 - disabled, n * HCLK cycles)
Definition: cpu_fmc.h:235
Timing configuration for SDRAM.
Definition: cpu_fmc.h:207
uint8_t refresh_period
Refresh period in milliseconds.
Definition: cpu_fmc.h:228
uint8_t row_precharge
Row precharge delay in SDCLK clock cycles [1..15], delay between Precharge and another command.
Definition: cpu_fmc.h:211
uint8_t row_cylce
Row cycle delay in SDCLK clock cycles [1..15], delay between Refresh and Activate command.
Definition: cpu_fmc.h:217
uint8_t row_to_col_delay
Row to column delay in SDCLK clock cycles [1..16], delay between Activate and Read/Write command.
Definition: cpu_fmc.h:208
uint8_t load_mode_register
Load Mode Register to Activate delay in SDCLK clock cycles [1..15], delay between Load Mode Register ...
Definition: cpu_fmc.h:225
uint8_t self_refresh
Self refresh time in SDCLK clock cycles [1..15].
Definition: cpu_fmc.h:220
uint8_t exit_self_refresh
Exit self-refresh delay in SDCLK clock cycles [1..15], delay between Self-Refresh and Activate comman...
Definition: cpu_fmc.h:222
uint8_t recovery_delay
Recovery delay in SDCLK clock cycles [1..15], delay between Write and Precharge command.
Definition: cpu_fmc.h:214