mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 10:52:44 +01:00
Merge #19910
19910: boards/stm32f469i-disco: enable FMC with SDRAM support r=aabadie a=gschorcht ### Contribution description This PR enables the FMC support on the `stm32f469i-disco` board and the on-board SDRAM ISSI IS42S32400F-6BL with 16 MByte. ### Testing procedure 1. `tests/periph/fmc` should succeed, just compile and flash the app with ``` BOARD=stm32f469i-disco make -C tests/periph/fmc flash term ``` 2. `tests/sys/malloc` should also use the SDRAM. Use ``` USEMODULE=periph_fmc_sdram CFLAGS='-DCHUNK_SIZE=131072' \ BOARD=stm32f469i-disco make -C tests/sys/malloc flash term ``` and check that the heap also uses the memory in the range from `0xc0000000` to `0xc0fffffff`. ### Issues/PRs references Co-authored-by: Gunar Schorcht <gunar@schorcht.net>
This commit is contained in:
commit
7c04094430
@ -10,6 +10,9 @@ config BOARD_STM32F469I_DISCO
|
||||
select HAS_PERIPH_ADC
|
||||
select HAS_PERIPH_DAC
|
||||
select HAS_PERIPH_DMA
|
||||
select HAS_PERIPH_FMC
|
||||
select HAS_PERIPH_FMC_SDRAM
|
||||
select HAS_PERIPH_FMC_32BIT
|
||||
select HAS_PERIPH_I2C
|
||||
select HAS_PERIPH_PWM
|
||||
select HAS_PERIPH_RTC
|
||||
|
@ -1,3 +1,7 @@
|
||||
ifneq (,$(filter saul_default,$(USEMODULE)))
|
||||
USEMODULE += saul_gpio
|
||||
endif
|
||||
|
||||
ifneq (,$(filter periph_fmc,$(USEMODULE)))
|
||||
FEATURES_REQUIRED += periph_fmc_32bit
|
||||
endif
|
||||
|
@ -5,6 +5,9 @@ CPU_MODEL = stm32f469ni
|
||||
FEATURES_PROVIDED += periph_adc
|
||||
FEATURES_PROVIDED += periph_dac
|
||||
FEATURES_PROVIDED += periph_dma
|
||||
FEATURES_PROVIDED += periph_fmc
|
||||
FEATURES_PROVIDED += periph_fmc_32bit
|
||||
FEATURES_PROVIDED += periph_fmc_sdram
|
||||
FEATURES_PROVIDED += periph_i2c
|
||||
FEATURES_PROVIDED += periph_rtc
|
||||
FEATURES_PROVIDED += periph_pwm
|
||||
|
@ -13,3 +13,7 @@ DIR_NAME_AT_REMED = "DIS_F469NI"
|
||||
|
||||
# openocd and cpy2remed programmers are supported
|
||||
PROGRAMMERS_SUPPORTED += openocd cpy2remed
|
||||
|
||||
# heap configuration
|
||||
FMC_RAM_ADDR=0xc0000000
|
||||
FMC_RAM_LEN=16384K
|
||||
|
@ -38,6 +38,7 @@ The MCU presents a large list of peripherals available, but specifically this de
|
||||
| USBs | 1 Full Speed |
|
||||
| Ethernet MAC | Yes |
|
||||
| RNG | Yes |
|
||||
| SDRAM | Yes (16 MByte) |
|
||||
| Vcc | 1.7V - 3.6V |
|
||||
| Datasheet | [MCU Datasheet](https://www.st.com/resource/en/datasheet/stm32f469ae.pdf) (pdf) |
|
||||
| Reference Manual | [Dev-Kit Reference Manual](https://www.st.com/resource/en/user_manual/um1932-discovery-kit-with-stm32f469ni-mcu-stmicroelectronics.pdf) (pdf)|
|
||||
|
@ -263,6 +263,129 @@ static const dac_conf_t dac_config[] = {
|
||||
#define DAC_NUMOF ARRAY_SIZE(dac_config)
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name FMC configuration
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* @brief FMC controller configuration
|
||||
*/
|
||||
static const fmc_conf_t fmc_config = {
|
||||
.bus = AHB3,
|
||||
.rcc_mask = RCC_AHB3ENR_FMCEN,
|
||||
#if MODULE_PERIPH_FMC_SDRAM
|
||||
.ba0_pin = { .pin = GPIO_PIN(PORT_G, 4), .af = GPIO_AF12, }, /* A14 signal */
|
||||
.ba1_pin = { .pin = GPIO_PIN(PORT_G, 5), .af = GPIO_AF12, }, /* A15 signal */
|
||||
.sdclk_pin = { .pin = GPIO_PIN(PORT_G, 8), .af = GPIO_AF12, }, /* SDCLK signal */
|
||||
.sdnwe_pin = { .pin = GPIO_PIN(PORT_C, 0), .af = GPIO_AF12, }, /* SDNWE signal */
|
||||
.sdnras_pin = { .pin = GPIO_PIN(PORT_F, 11), .af = GPIO_AF12, }, /* SDNRAS signal */
|
||||
.sdncas_pin = { .pin = GPIO_PIN(PORT_G, 15), .af = GPIO_AF12, }, /* SDNCAS signal */
|
||||
.sdcke0_pin = { .pin = GPIO_PIN(PORT_H, 2), .af = GPIO_AF12, }, /* SDCKE0 signal */
|
||||
.sdne0_pin = { .pin = GPIO_PIN(PORT_H, 3), .af = GPIO_AF12, }, /* SDNE0 signal */
|
||||
.addr = {
|
||||
{ .pin = GPIO_PIN(PORT_F, 0), .af = GPIO_AF12, }, /* A0 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 1), .af = GPIO_AF12, }, /* A1 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 2), .af = GPIO_AF12, }, /* A2 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 3), .af = GPIO_AF12, }, /* A3 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 4), .af = GPIO_AF12, }, /* A4 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 5), .af = GPIO_AF12, }, /* A5 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 12), .af = GPIO_AF12, }, /* A6 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 13), .af = GPIO_AF12, }, /* A7 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 14), .af = GPIO_AF12, }, /* A8 signal */
|
||||
{ .pin = GPIO_PIN(PORT_F, 15), .af = GPIO_AF12, }, /* A9 signal */
|
||||
{ .pin = GPIO_PIN(PORT_G, 0), .af = GPIO_AF12, }, /* A10 signal */
|
||||
{ .pin = GPIO_PIN(PORT_G, 1), .af = GPIO_AF12, }, /* A11 signal */
|
||||
},
|
||||
#endif
|
||||
.data = {
|
||||
{ .pin = GPIO_PIN(PORT_D, 14), .af = GPIO_AF12, }, /* D0 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 15), .af = GPIO_AF12, }, /* D1 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 0), .af = GPIO_AF12, }, /* D2 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 1), .af = GPIO_AF12, }, /* D3 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 7), .af = GPIO_AF12, }, /* D4 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 8), .af = GPIO_AF12, }, /* D5 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 9), .af = GPIO_AF12, }, /* D6 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 10), .af = GPIO_AF12, }, /* D7 signal */
|
||||
#if MODULE_PERIPH_FMC_32BIT
|
||||
{ .pin = GPIO_PIN(PORT_E, 11), .af = GPIO_AF12, }, /* D8 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 12), .af = GPIO_AF12, }, /* D9 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 13), .af = GPIO_AF12, }, /* D10 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 14), .af = GPIO_AF12, }, /* D11 signal */
|
||||
{ .pin = GPIO_PIN(PORT_E, 15), .af = GPIO_AF12, }, /* D12 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 8), .af = GPIO_AF12, }, /* D13 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 9), .af = GPIO_AF12, }, /* D14 signal */
|
||||
{ .pin = GPIO_PIN(PORT_D, 10), .af = GPIO_AF12, }, /* D15 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 8), .af = GPIO_AF12, }, /* D16 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 9), .af = GPIO_AF12, }, /* D17 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 10), .af = GPIO_AF12, }, /* D18 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 11), .af = GPIO_AF12, }, /* D19 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 12), .af = GPIO_AF12, }, /* D20 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 13), .af = GPIO_AF12, }, /* D21 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 14), .af = GPIO_AF12, }, /* D22 signal */
|
||||
{ .pin = GPIO_PIN(PORT_H, 15), .af = GPIO_AF12, }, /* D23 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 0), .af = GPIO_AF12, }, /* D24 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 1), .af = GPIO_AF12, }, /* D25 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 2), .af = GPIO_AF12, }, /* D26 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 3), .af = GPIO_AF12, }, /* D27 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 6), .af = GPIO_AF12, }, /* D28 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 7), .af = GPIO_AF12, }, /* D29 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 9), .af = GPIO_AF12, }, /* D30 signal */
|
||||
{ .pin = GPIO_PIN(PORT_I, 10), .af = GPIO_AF12, }, /* D31 signal */
|
||||
#endif
|
||||
},
|
||||
.nbl0_pin = { .pin = GPIO_PIN(PORT_E, 0), .af = GPIO_AF12, }, /* FMC_NBL0 signal (DQM0) */
|
||||
.nbl1_pin = { .pin = GPIO_PIN(PORT_E, 1), .af = GPIO_AF12, }, /* FMC_NBL1 signal (DQM1) */
|
||||
.nbl2_pin = { .pin = GPIO_PIN(PORT_I, 4), .af = GPIO_AF12, }, /* FMC_NBL2 signal (DQM2) */
|
||||
.nbl3_pin = { .pin = GPIO_PIN(PORT_I, 5), .af = GPIO_AF12, }, /* FMC_NBL3 signal (DQM3) */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief FMC Bank configuration
|
||||
*
|
||||
* The board has a SDRAM IS42S32400F-6BL with 128 MBit on-board.
|
||||
* It is organized in 4 banks of 1M x 32 bits each and connected to bank 5
|
||||
* at address 0xc0000000.
|
||||
*/
|
||||
static const fmc_bank_conf_t fmc_bank_config[] = {
|
||||
/* bank 5 is used for SDRAM */
|
||||
{
|
||||
.bank = FMC_BANK_5,
|
||||
.mem_type = FMC_SDRAM,
|
||||
.data_width = FMC_BUS_WIDTH_32BIT,
|
||||
.address = 0xc0000000, /* Bank 6 is mapped to 0xc0000000 */
|
||||
.size = MiB(16), /* Size in MByte, 4M x 32 Bit */
|
||||
.sdram = {
|
||||
.clk_period = 2, /* SDCLK = 2 x HCLK */
|
||||
.row_bits = 12, /* A11..A0 used for row address */
|
||||
.col_bits = 8, /* A7..A0 used for column address */
|
||||
.cas_latency = 2, /* CAS latency is 2 clock cycles */
|
||||
.read_delay = 0, /* No read delay after CAS */
|
||||
.burst_read = true, /* Burst read mode enabled */
|
||||
.burst_write = false, /* Burst write mode disabled */
|
||||
.burst_len = FMC_BURST_LENGTH_1, /* Burst length is 1 */
|
||||
.burst_interleaved = false, /* Burst mode interleaved */
|
||||
.write_protect = false, /* No write protection */
|
||||
.four_banks = true, /* SDRAM has four internal banks */
|
||||
.timing = { /* SDRAM Timing parameters */
|
||||
.row_to_col_delay = 2, /* Row to column delay (2 clock cycles) */
|
||||
.row_precharge = 2, /* Row precharge delay (2 clock cycles) */
|
||||
.recovery_delay = 2, /* Recovery delay is (2 clock cycles) */
|
||||
.row_cylce = 7, /* Row cycle delay is (7 clock cycles) */
|
||||
.self_refresh = 4, /* Self refresh time is (4 clock cycles) */
|
||||
.exit_self_refresh = 7, /* Exit self-refresh delay (7 clock cycles) */
|
||||
.load_mode_register = 2, /* Load Mode Register to Activate delay */
|
||||
.refresh_period = 16, /* Refresh period in ms */
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Number of configured FMC banks
|
||||
*/
|
||||
#define FMC_BANK_NUMOF ARRAY_SIZE(fmc_bank_config)
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user