123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /*
- * File : usart.c
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2009, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2017-08-17 Tanek first implementation
- */
- #include <rtthread.h>
- #include "stm32f4xx_hal.h"
- #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)
- #define BUFFER_SIZE ((uint32_t)0x0100)
- #define WRITE_READ_ADDR ((uint32_t)0x0800)
- #define REFRESH_COUNT ((uint32_t)0x0569) /* SDRAM refresh counter (90MHz SDRAM clock) */
- static FMC_SDRAM_CommandTypeDef command;
- static SDRAM_HandleTypeDef hsdram1;
- static FMC_SDRAM_TimingTypeDef SdramTiming;
- static void HAL_FMC_MspInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /* Peripheral clock enable */
- __HAL_RCC_FMC_CLK_ENABLE();
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOE_CLK_ENABLE();
- __HAL_RCC_GPIOF_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- __HAL_RCC_GPIOI_CLK_ENABLE();
- /** FMC GPIO Configuration
- PI9 ------> FMC_D30
- PI10 ------> FMC_D31
- PF0 ------> FMC_A0
- PF1 ------> FMC_A1
- PF2 ------> FMC_A2
- PF3 ------> FMC_A3
- PF4 ------> FMC_A4
- PF5 ------> FMC_A5
- PH2 ------> FMC_SDCKE0
- PH3 ------> FMC_SDNE0
- PH5 ------> FMC_SDNWE
- PF11 ------> FMC_SDNRAS
- PF12 ------> FMC_A6
- PF13 ------> FMC_A7
- PF14 ------> FMC_A8
- PF15 ------> FMC_A9
- PG0 ------> FMC_A10
- PG1 ------> FMC_A11
- PE7 ------> FMC_D4
- PE8 ------> FMC_D5
- PE9 ------> FMC_D6
- PE10 ------> FMC_D7
- PE11 ------> FMC_D8
- PE12 ------> FMC_D9
- PE13 ------> FMC_D10
- PE14 ------> FMC_D11
- PE15 ------> FMC_D12
- PH8 ------> FMC_D16
- PH9 ------> FMC_D17
- PH10 ------> FMC_D18
- PH11 ------> FMC_D19
- PH12 ------> FMC_D20
- PD8 ------> FMC_D13
- PD9 ------> FMC_D14
- PD10 ------> FMC_D15
- PD14 ------> FMC_D0
- PD15 ------> FMC_D1
- PG4 ------> FMC_BA0
- PG5 ------> FMC_BA1
- PG8 ------> FMC_SDCLK
- PH13 ------> FMC_D21
- PH14 ------> FMC_D22
- PH15 ------> FMC_D23
- PI0 ------> FMC_D24
- PI1 ------> FMC_D25
- PI2 ------> FMC_D26
- PI3 ------> FMC_D27
- PD0 ------> FMC_D2
- PD1 ------> FMC_D3
- PG15 ------> FMC_SDNCAS
- PE0 ------> FMC_NBL0
- PE1 ------> FMC_NBL1
- PI4 ------> FMC_NBL2
- PI5 ------> FMC_NBL3
- PI6 ------> FMC_D28
- PI7 ------> FMC_D29
- */
- GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1
- |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
- |GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
- |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_8
- |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
- |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5
- |GPIO_PIN_8|GPIO_PIN_15;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF12_FMC;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- }
- void HAL_SDRAM_MspInit(SDRAM_HandleTypeDef* hsdram){
- HAL_FMC_MspInit();
- }
- static void HAL_FMC_MspDeInit(void)
- {
- /* Peripheral clock enable */
- __HAL_RCC_FMC_CLK_DISABLE();
- /** FMC GPIO Configuration
- PI9 ------> FMC_D30
- PI10 ------> FMC_D31
- PF0 ------> FMC_A0
- PF1 ------> FMC_A1
- PF2 ------> FMC_A2
- PF3 ------> FMC_A3
- PF4 ------> FMC_A4
- PF5 ------> FMC_A5
- PH2 ------> FMC_SDCKE0
- PH3 ------> FMC_SDNE0
- PH5 ------> FMC_SDNWE
- PF11 ------> FMC_SDNRAS
- PF12 ------> FMC_A6
- PF13 ------> FMC_A7
- PF14 ------> FMC_A8
- PF15 ------> FMC_A9
- PG0 ------> FMC_A10
- PG1 ------> FMC_A11
- PE7 ------> FMC_D4
- PE8 ------> FMC_D5
- PE9 ------> FMC_D6
- PE10 ------> FMC_D7
- PE11 ------> FMC_D8
- PE12 ------> FMC_D9
- PE13 ------> FMC_D10
- PE14 ------> FMC_D11
- PE15 ------> FMC_D12
- PH8 ------> FMC_D16
- PH9 ------> FMC_D17
- PH10 ------> FMC_D18
- PH11 ------> FMC_D19
- PH12 ------> FMC_D20
- PD8 ------> FMC_D13
- PD9 ------> FMC_D14
- PD10 ------> FMC_D15
- PD14 ------> FMC_D0
- PD15 ------> FMC_D1
- PG4 ------> FMC_BA0
- PG5 ------> FMC_BA1
- PG8 ------> FMC_SDCLK
- PH13 ------> FMC_D21
- PH14 ------> FMC_D22
- PH15 ------> FMC_D23
- PI0 ------> FMC_D24
- PI1 ------> FMC_D25
- PI2 ------> FMC_D26
- PI3 ------> FMC_D27
- PD0 ------> FMC_D2
- PD1 ------> FMC_D3
- PG15 ------> FMC_SDNCAS
- PE0 ------> FMC_NBL0
- PE1 ------> FMC_NBL1
- PI4 ------> FMC_NBL2
- PI5 ------> FMC_NBL3
- PI6 ------> FMC_D28
- PI7 ------> FMC_D29
- */
- HAL_GPIO_DeInit(GPIOI, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_0|GPIO_PIN_1
- |GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5
- |GPIO_PIN_6|GPIO_PIN_7);
- HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
- |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_11|GPIO_PIN_12
- |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_8
- |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
- |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5
- |GPIO_PIN_8|GPIO_PIN_15);
- HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
- HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
- }
- void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram)
- {
- HAL_FMC_MspDeInit();
- }
- /**
- * @brief Perform the SDRAM exernal memory inialization sequence
- * @param hsdram: SDRAM handle
- * @param Command: Pointer to SDRAM command structure
- * @retval None
- */
- static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
- {
- __IO uint32_t tmpmrd =0;
- /* Step 3: Configure a clock configuration enable command */
- Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
- Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
- Command->AutoRefreshNumber = 1;
- Command->ModeRegisterDefinition = 0;
- /* Send the command */
- HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
- /* Step 4: Insert 100 ms delay */
- //HAL_Delay(100);
- for (tmpmrd = 0; tmpmrd < 0xfffff; tmpmrd ++)
- ;
- /* Step 5: Configure a PALL (precharge all) command */
- Command->CommandMode = FMC_SDRAM_CMD_PALL;
- Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
- Command->AutoRefreshNumber = 1;
- Command->ModeRegisterDefinition = 0;
- /* Send the command */
- HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
- /* Step 6 : Configure a Auto-Refresh command */
- Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
- Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
- Command->AutoRefreshNumber = 8;
- Command->ModeRegisterDefinition = 0;
- /* Send the command */
- HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
- /* Step 7: Program the external memory mode register */
- tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |
- SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
- SDRAM_MODEREG_CAS_LATENCY_3 |
- SDRAM_MODEREG_OPERATING_MODE_STANDARD |
- SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
- Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
- Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
- Command->AutoRefreshNumber = 1;
- Command->ModeRegisterDefinition = tmpmrd;
- /* Send the command */
- HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
- /* Step 8: Set the refresh rate counter */
- /* (15.62 us x Freq) - 20 */
- /* Set the device refresh counter */
- HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
- }
- int stm32_hw_0_sdram_init(void)
- {
- /** Perform the SDRAM1 memory initialization sequence
- */
- hsdram1.Instance = FMC_SDRAM_DEVICE;
- /* hsdram1.Init */
- hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
- hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
- hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
- hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
- hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
- hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
- hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
- hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
- hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
- hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
- /* SdramTiming */
- SdramTiming.LoadToActiveDelay = 2;
- SdramTiming.ExitSelfRefreshDelay = 7;
- SdramTiming.SelfRefreshTime = 2;
- SdramTiming.RowCycleDelay = 4;
- SdramTiming.WriteRecoveryTime = 2;
- SdramTiming.RPDelay = 2;
- SdramTiming.RCDDelay = 2;
- if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
- {
- RT_ASSERT(RT_NULL);
- }
-
- SDRAM_Initialization_Sequence(&hsdram1, &command);
-
- return 0;
- }
- INIT_BOARD_EXPORT(stm32_hw_0_sdram_init);
|