Loading...
Searching...
No Matches
cpu_fmc.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2023 Gunar Schorcht
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser
5 * General Public License v2.1. See the file LICENSE in the top level
6 * directory for more details.
7 */
8
9#pragma once
10
56
57#include <stdint.h>
58
59#include "cpu.h"
60#include "periph/cpu_gpio.h"
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
73#ifndef FMC_BANK_CONFIG
74#define FMC_BANK_CONFIG(n) (&fmc_bank_config[n])
75#endif
76
85#if MODULE_PERIPH_FMC_32BIT || DOXYGEN
86#define FMC_DATA_PIN_NUMOF (32)
87#elif MODULE_PERIPH_FMC_16BIT
88#define FMC_DATA_PIN_NUMOF (16)
89#else
90#define FMC_DATA_PIN_NUMOF (8)
91#endif
92
103#if MODULE_PERIPH_FMC_NOR_SRAM || DOXYGEN
104#define FMC_ADDR_PIN_NUMOF (26)
105#elif MODULE_PERIPH_FMC_SDRAM
106#define FMC_ADDR_PIN_NUMOF (13)
107#else
108#define FMC_ADDR_PIN_NUMOF (0)
109#endif
110
111#if DOXYGEN
122#define FMC_RAM_ADDR 0x60000000
123
136#define FMC_RAM_LEN 1024K
137#endif
138
152
170
187
188
196typedef enum {
197 FMC_BURST_LENGTH_1 = 0, /* Burst length is 1 */
198 FMC_BURST_LENGTH_2 = 1, /* Burst length is 2 */
199 FMC_BURST_LENGTH_4 = 2, /* Burst length is 4 */
200 FMC_BURST_LENGTH_8 = 3, /* Burst length is 8 */
201 FMC_BURST_LENGTH_16 = 4, /* Burst length is 16 */
202 FMC_BURST_LENGTH_32 = 5, /* Burst length is 32 */
203 FMC_BURST_LENGTH_64 = 6, /* Burst length is 64 */
204 FMC_BURST_LENGTH_FULL = 7, /* Burst length is full page */
206
233
251
252
260typedef struct {
261 gpio_t pin;
263} fmc_gpio_t;
264
277typedef struct {
278 uint8_t bus;
279 uint32_t rcc_mask;
281#if FMC_ADDR_PIN_NUMOF || DOXYGEN
283#endif
284 /* signals used by all kind of memories */
290#if MODULE_PERIPH_FMC_NOR_SRAM
291 /* NORs, PSRAMs, and SRAMs use CLK, NOE, NWE, NE, and NADV signals **/
292 fmc_gpio_t clk_pin;
293 fmc_gpio_t noe_pin;
294 fmc_gpio_t nwe_pin;
295 fmc_gpio_t ne1_pin;
296 fmc_gpio_t ne2_pin;
297 fmc_gpio_t ne3_pin;
298 fmc_gpio_t ne4_pin;
299 fmc_gpio_t nadv_pin;
300#endif /* MODULE_PERIPH_FMC_NORSRAM */
301#if MODULE_PERIPH_FMC_SDRAM
302 /* SDRAMs use BAx, CLK, RAS, CAS, WE, ... signals **/
303 fmc_gpio_t ba0_pin;
304 fmc_gpio_t ba1_pin;
305 fmc_gpio_t sdclk_pin;
306 fmc_gpio_t sdnwe_pin;
307 fmc_gpio_t sdnras_pin;
308 fmc_gpio_t sdncas_pin;
309 fmc_gpio_t sdcke0_pin;
310 fmc_gpio_t sdcke1_pin;
311 fmc_gpio_t sdne0_pin;
312 fmc_gpio_t sdne1_pin;
313#endif /* MODULE_PERIPH_FMC_SDRAM */
314} fmc_conf_t;
315
319typedef enum {
321#if defined(FMC_Bank2_3_R_BASE)
322 FMC_BANK_2 = 2,
323#endif
324#if defined(FMC_Bank2_3_R_BASE) || defined(FMC_Bank3_R_BASE)
325 FMC_BANK_3 = 3,
326#endif
327#if defined(FMC_Bank4_R_BASE)
328 FMC_BANK_4 = 4,
329#endif
330#if defined(FMC_Bank5_6_R_BASE)
331 FMC_BANK_5 = 5,
332 FMC_BANK_6 = 6,
333#endif
334} fmc_bank_t;
335
346
355
359typedef struct {
363 uint32_t address;
364 uint32_t size;
365 union {
366 fmc_nor_sram_bank_conf_t nor_sram; /* Configuration in case of NOR/PSRAM/SRAM */
367 fmc_sdram_bank_conf_t sdram; /* Configuration in case of SDRAM */
368 };
370
371typedef uint8_t fmc_bank_id_t;
373
374#ifdef __cplusplus
375}
376#endif
377
GPIO CPU definitions for the STM32 family.
gpio_af_t
Override alternative GPIO mode options.
Definition periph_cpu.h:165
#define FMC_DATA_PIN_NUMOF
Number of data pins used.
Definition cpu_fmc.h:86
#define FMC_ADDR_PIN_NUMOF
Number of address pins used.
Definition cpu_fmc.h:104
fmc_mem_type_t
Memory types supported by the FMC controller.
Definition cpu_fmc.h:339
fmc_access_mode_t
Memory access modes for NOR/PSRAM/SRAM in extended mode.
Definition cpu_fmc.h:146
uint8_t fmc_bank_id_t
FMC bank identifier.
Definition cpu_fmc.h:371
fmc_bus_width_t
Memory data bus widths.
Definition cpu_fmc.h:350
fmc_bust_length_t
SDRAM Burst Length as an exponent of a power of two.
Definition cpu_fmc.h:196
fmc_bank_t
Memory banks.
Definition cpu_fmc.h:319
@ FMC_SDRAM
SDRAM Controller used.
Definition cpu_fmc.h:344
@ FMC_NOR
NOR Flash.
Definition cpu_fmc.h:342
@ FMC_SRAM
SRAM.
Definition cpu_fmc.h:340
@ FMC_PSRAM
PSRAM.
Definition cpu_fmc.h:341
@ FMC_NAND
NAND Flash.
Definition cpu_fmc.h:343
@ FMC_MODE_A
Access mode A.
Definition cpu_fmc.h:147
@ FMC_MODE_B
Access mode B.
Definition cpu_fmc.h:148
@ FMC_MODE_C
Access mode C.
Definition cpu_fmc.h:149
@ FMC_MODE_D
Access mode D.
Definition cpu_fmc.h:150
@ FMC_BUS_WIDTH_16BIT
16 bit data bus width
Definition cpu_fmc.h:352
@ FMC_BUS_WIDTH_32BIT
32 bit data bus width
Definition cpu_fmc.h:353
@ FMC_BUS_WIDTH_8BIT
8 bit data bus width
Definition cpu_fmc.h:351
@ FMC_BANK_1
Bank 1 is always available and used for NOR, PSRAM, SRAM.
Definition cpu_fmc.h:320
Bank configuration structure.
Definition cpu_fmc.h:359
fmc_bus_width_t data_width
Data bus width.
Definition cpu_fmc.h:362
uint32_t address
Address of the memory bank.
Definition cpu_fmc.h:363
uint32_t size
Size in bytes of the memory bank.
Definition cpu_fmc.h:364
fmc_mem_type_t mem_type
Type of memory.
Definition cpu_fmc.h:361
fmc_bank_t bank
Bank1 .
Definition cpu_fmc.h:360
FMC peripheral configuration.
Definition cpu_fmc.h:277
fmc_gpio_t nwait_pin
NWAIT pin.
Definition cpu_fmc.h:289
fmc_gpio_t data[FMC_DATA_PIN_NUMOF]
Data pins D0 ...
Definition cpu_fmc.h:280
uint8_t bus
AHB/APB bus.
Definition cpu_fmc.h:278
fmc_gpio_t nbl0_pin
NBL0 pin.
Definition cpu_fmc.h:285
fmc_gpio_t nbl1_pin
NBL1 pin.
Definition cpu_fmc.h:286
fmc_gpio_t nbl2_pin
NBL2 pin.
Definition cpu_fmc.h:287
uint32_t rcc_mask
Bit in clock enable register.
Definition cpu_fmc.h:279
fmc_gpio_t addr[FMC_ADDR_PIN_NUMOF]
Address pins A0 ... if any.
Definition cpu_fmc.h:282
fmc_gpio_t nbl3_pin
NBL3 pin.
Definition cpu_fmc.h:288
FMC GPIO configuration type.
Definition cpu_fmc.h:260
gpio_t pin
GPIO pin.
Definition cpu_fmc.h:261
gpio_af_t af
Alternate function.
Definition cpu_fmc.h:262
Bank configuration structure for NOR/PSRAM/SRAM.
Definition cpu_fmc.h:174
bool ext_mode
Extended mode used (separate read and write timings)
Definition cpu_fmc.h:180
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:184
bool wait_enable
Wait signal used for synchronous access.
Definition cpu_fmc.h:178
bool mux_enable
Multiplexed address/data signals used (only valid for PSRAMs and NORs.
Definition cpu_fmc.h:176
uint8_t sub_bank
Bank1 has 4 subbanks 1..4.
Definition cpu_fmc.h:175
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:182
Timing configuration for NOR/PSRAM/SRAM.
Definition cpu_fmc.h:159
uint8_t bus_turnaround
Bus turnaround phase duration [0..15], default 15.
Definition cpu_fmc.h:168
uint8_t clk_div
Clock divide ratio, FMC_CLK = HCLK / (DIV + 1)
Definition cpu_fmc.h:162
uint8_t data_setup
Data setup time [0..15], default 15.
Definition cpu_fmc.h:165
uint8_t addr_hold
Address hold time [0..15], default 15.
Definition cpu_fmc.h:164
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:160
uint8_t addr_setup
Address setup time [0..15], default 15.
Definition cpu_fmc.h:163
uint8_t data_latency
Data latency for synchronous access [0..15], default 15 (only used in read timing)
Definition cpu_fmc.h:166
Bank configuration structure for SDRAM.
Definition cpu_fmc.h:237
uint8_t cas_latency
CAS latency in SDCLK clock cycles [1..3].
Definition cpu_fmc.h:241
bool burst_write
Burst write mode enabled.
Definition cpu_fmc.h:246
uint8_t col_bits
Number column address bits [8..11].
Definition cpu_fmc.h:240
bool burst_read
Burst read mode enabled.
Definition cpu_fmc.h:245
uint8_t row_bits
Number row address bits [11..13].
Definition cpu_fmc.h:239
fmc_bust_length_t burst_len
Burst length as an exponent of a power of two.
Definition cpu_fmc.h:248
fmc_sdram_timing_t timing
SDRAM Timing configuration.
Definition cpu_fmc.h:249
bool write_protect
Write protection enabled.
Definition cpu_fmc.h:244
uint8_t read_delay
Delay for reading data after CAS latency in HCLKs [0..2].
Definition cpu_fmc.h:242
bool burst_interleaved
Burst mode interleaved, otherwise sequential.
Definition cpu_fmc.h:247
bool four_banks
SDRAM has four internal banks.
Definition cpu_fmc.h:243
uint8_t clk_period
CLK period [0,2,3] (0 - disabled, n * HCLK cycles)
Definition cpu_fmc.h:238
Timing configuration for SDRAM.
Definition cpu_fmc.h:210
uint8_t refresh_period
Refresh period in milliseconds.
Definition cpu_fmc.h:231
uint8_t row_precharge
Row precharge delay in SDCLK clock cycles [1..15], delay between Precharge and another command.
Definition cpu_fmc.h:214
uint8_t row_cylce
Row cycle delay in SDCLK clock cycles [1..15], delay between Refresh and Activate command.
Definition cpu_fmc.h:220
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:211
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:228
uint8_t self_refresh
Self refresh time in SDCLK clock cycles [1..15].
Definition cpu_fmc.h:223
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:225
uint8_t recovery_delay
Recovery delay in SDCLK clock cycles [1..15], delay between Write and Precharge command.
Definition cpu_fmc.h:217