diff --git a/CMakeLists.txt b/CMakeLists.txt index 75877d6..3489431 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,12 @@ set(TARGET_SOURCES "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_qspi.c" "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c" "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c" + "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c" "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c" "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c" "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c" + "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c" + "SDK/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_rcc.c" "board/board.c" "board/clock_config.c" "board/peripherals.c" @@ -42,6 +45,7 @@ set(TARGET_SOURCES set(TARGET_C_DEFINES "STM32H750xx" "USE_HAL_DRIVER" + "USE_FULL_LL_DRIVER" ) set(TARGET_C_INCLUDES diff --git a/board/clock_config.c b/board/clock_config.c index 7ea7ed4..5e2b051 100644 --- a/board/clock_config.c +++ b/board/clock_config.c @@ -3,65 +3,81 @@ #include "board.h" #include "stm32h7xx_hal.h" -static void SystemClock_Config(void); -static void PeriphCommonClock_Config(void); +static void BOARD_BootHighSpeed(void); void BOARD_InitBootClocks(void) { - SystemClock_Config(); - PeriphCommonClock_Config(); + BOARD_BootHighSpeed(); } -static void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; +static void BOARD_BootHighSpeed(void) { + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - /** Supply configuration update enable - */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); - /** Configure the main internal regulator output voltage - */ - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) { } - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_DIV1; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE); + + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 5; + RCC_OscInitStruct.PLL.PLLN = 160; + RCC_OscInitStruct.PLL.PLLP = 2; + RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } - /** Initializes the CPU, AHB and APB buses clocks - */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1 | RCC_CLOCKTYPE_D1PCLK1; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; - RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; + RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; + RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; + RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } -} -static void PeriphCommonClock_Config(void) { - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + HAL_RCC_EnableCSS(); - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CKPER; - PeriphClkInitStruct.CkperClockSelection = RCC_CLKPSOURCE_HSI; + /* QSPI Clock source */ + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_QSPI; + PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_PLL; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } -} \ No newline at end of file + + __HAL_RCC_QSPI_CLK_ENABLE(); + + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_FMC; + PeriphClkInitStruct.PLL2.PLL2M = 5; + PeriphClkInitStruct.PLL2.PLL2N = 150; + PeriphClkInitStruct.PLL2.PLL2P = 2; + PeriphClkInitStruct.PLL2.PLL2Q = 2; + PeriphClkInitStruct.PLL2.PLL2R = 3; + PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2; + PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE; + PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_PLL2; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + Error_Handler(); + } + + __HAL_RCC_FMC_CLK_ENABLE(); +} diff --git a/board/peripherals.c b/board/peripherals.c index 22a7185..5fffa22 100644 --- a/board/peripherals.c +++ b/board/peripherals.c @@ -2,21 +2,22 @@ #include "board.h" -QSPI_HandleTypeDef hqspi; +QSPI_HandleTypeDef hqspi; +SDRAM_HandleTypeDef hsdram1; -static void QUADSPI_Init(void); +static void BOARD_SDRAM_Config(void); void BOARD_InitBootPeripherals(void) { - QUADSPI_Init(); + BOARD_InitQUADSPI(); } -static void QUADSPI_Init(void) { +void BOARD_InitQUADSPI(void) { hqspi.Instance = QUADSPI; - hqspi.Init.ClockPrescaler = 0; - hqspi.Init.FifoThreshold = 4; - hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE; + hqspi.Init.ClockPrescaler = 1; + hqspi.Init.FifoThreshold = 24; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; hqspi.Init.FlashSize = 25; - hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE; hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0; hqspi.Init.DualFlash = QSPI_DUALFLASH_ENABLE; if (HAL_QSPI_Init(&hqspi) != HAL_OK) { @@ -24,74 +25,74 @@ static void QUADSPI_Init(void) { } } -void HAL_QSPI_MspInit(QSPI_HandleTypeDef* qspiHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - if (qspiHandle->Instance == QUADSPI) { - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_QSPI; - PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_CLKP; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { - Error_Handler(); - } +void BOARD_InitFMC(void) { + FMC_SDRAM_TimingTypeDef SdramTiming = {0}; - __HAL_RCC_QSPI_CLK_ENABLE(); + hsdram1.Instance = FMC_SDRAM_DEVICE; + hsdram1.Init.SDBank = FMC_SDRAM_BANK2; + hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9; + hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; + 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_2; + 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; - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); + SdramTiming.LoadToActiveDelay = 2; + SdramTiming.ExitSelfRefreshDelay = 9; + SdramTiming.SelfRefreshTime = 6; + SdramTiming.RowCycleDelay = 8; + SdramTiming.WriteRecoveryTime = 4; + SdramTiming.RPDelay = 2; + SdramTiming.RCDDelay = 2; - GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_14; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; - HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { + Error_Handler(); } + + BOARD_SDRAM_Config(); } -void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* qspiHandle) { - if (qspiHandle->Instance == QUADSPI) { - __HAL_RCC_QSPI_CLK_DISABLE(); +static void BOARD_SDRAM_Config(void) { + FMC_SDRAM_CommandTypeDef cmd; - HAL_GPIO_DeInit(GPIOG, GPIO_PIN_9 | GPIO_PIN_14 | GPIO_PIN_6); - HAL_GPIO_DeInit(GPIOF, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9); - HAL_GPIO_DeInit(GPIOH, GPIO_PIN_2 | GPIO_PIN_3); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2); + cmd.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; + cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + cmd.AutoRefreshNumber = 1; + cmd.ModeRegisterDefinition = 0; + if (HAL_SDRAM_SendCommand(&hsdram1, &cmd, 1000) != HAL_OK) { + Error_Handler(); + } + + HAL_Delay(1); + + cmd.CommandMode = FMC_SDRAM_CMD_PALL; + cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + cmd.AutoRefreshNumber = 1; + cmd.ModeRegisterDefinition = 0; + if (HAL_SDRAM_SendCommand(&hsdram1, &cmd, 1000) != HAL_OK) { + Error_Handler(); + } + + cmd.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; + cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + cmd.AutoRefreshNumber = 8; + cmd.ModeRegisterDefinition = 0; + if (HAL_SDRAM_SendCommand(&hsdram1, &cmd, 1000) != HAL_OK) { + Error_Handler(); + } + + cmd.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; + cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2; + cmd.AutoRefreshNumber = 1; + cmd.ModeRegisterDefinition = 0x220UL; + if (HAL_SDRAM_SendCommand(&hsdram1, &cmd, 1000) != HAL_OK) { + Error_Handler(); + } + + if (HAL_SDRAM_ProgramRefreshRate(&hsdram1, 900) != HAL_OK) { + Error_Handler(); } } \ No newline at end of file diff --git a/board/peripherals.h b/board/peripherals.h index 40f13a6..28b85b0 100644 --- a/board/peripherals.h +++ b/board/peripherals.h @@ -3,8 +3,11 @@ #include "stm32h7xx_hal.h" -extern QSPI_HandleTypeDef hqspi; +extern QSPI_HandleTypeDef hqspi; +extern SDRAM_HandleTypeDef hsdram1; void BOARD_InitBootPeripherals(void); +void BOARD_InitQUADSPI(void); +void BOARD_InitFMC(void); #endif \ No newline at end of file diff --git a/board/pin_mux.c b/board/pin_mux.c index a7b5d77..5958f5a 100644 --- a/board/pin_mux.c +++ b/board/pin_mux.c @@ -6,11 +6,21 @@ void BOARD_InitBootPins(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_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_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOI_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, NAND_CLE_Pin | NAND_WE_Pin | NAND_RE_Pin, GPIO_PIN_SET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, NAND_ALE_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, LED_B_Pin | LED_R_Pin, GPIO_PIN_SET); @@ -18,6 +28,13 @@ void BOARD_InitBootPins(void) { /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET); + /*Configure GPIO pins : PDPin PDPin PDPin PDPin */ + GPIO_InitStruct.Pin = NAND_WE_Pin | NAND_RE_Pin | NAND_CLE_Pin | NAND_ALE_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + /*Configure GPIO pins : PBPin PBPin */ GPIO_InitStruct.Pin = LED_B_Pin | LED_R_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; @@ -31,4 +48,102 @@ void BOARD_InitBootPins(void) { GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(LED_G_GPIO_Port, &GPIO_InitStruct); + + /* ============================ QSPI =================================== */ + + GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* ============================ FMC =================================== */ + GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_1 | GPIO_PIN_0 | GPIO_PIN_7 | GPIO_PIN_2 | + GPIO_PIN_3 | GPIO_PIN_9 | GPIO_PIN_10; + 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_1 | GPIO_PIN_0 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_15 | + GPIO_PIN_8 | GPIO_PIN_13 | GPIO_PIN_7 | GPIO_PIN_14; + 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_15 | GPIO_PIN_14 | GPIO_PIN_13 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_9 | + GPIO_PIN_12 | GPIO_PIN_6 | GPIO_PIN_8 | 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(GPIOH, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_8 | GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2 | 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(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8; + 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); + + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0 | GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_13 | + GPIO_PIN_14 | GPIO_PIN_12 | GPIO_PIN_15 | GPIO_PIN_11; + 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_0; + 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(GPIOC, &GPIO_InitStruct); } \ No newline at end of file diff --git a/board/pin_mux.h b/board/pin_mux.h index fcf5b42..c0b28b7 100644 --- a/board/pin_mux.h +++ b/board/pin_mux.h @@ -1,12 +1,20 @@ #ifndef PIN_MUX_H #define PIN_MUX_H -#define LED_B_Pin GPIO_PIN_1 -#define LED_B_GPIO_Port GPIOB -#define LED_G_Pin GPIO_PIN_3 -#define LED_G_GPIO_Port GPIOA -#define LED_R_Pin GPIO_PIN_0 -#define LED_R_GPIO_Port GPIOB +#define NAND_WE_Pin GPIO_PIN_5 +#define NAND_WE_GPIO_Port GPIOD +#define NAND_RE_Pin GPIO_PIN_4 +#define NAND_RE_GPIO_Port GPIOD +#define NAND_CLE_Pin GPIO_PIN_11 +#define NAND_CLE_GPIO_Port GPIOD +#define NAND_ALE_Pin GPIO_PIN_12 +#define NAND_ALE_GPIO_Port GPIOD +#define LED_B_Pin GPIO_PIN_1 +#define LED_B_GPIO_Port GPIOB +#define LED_G_Pin GPIO_PIN_3 +#define LED_G_GPIO_Port GPIOA +#define LED_R_Pin GPIO_PIN_0 +#define LED_R_GPIO_Port GPIOB void BOARD_InitBootPins(); diff --git a/board/stm32h7xx_hal_conf.h b/board/stm32h7xx_hal_conf.h index 262bcbd..25c8b02 100644 --- a/board/stm32h7xx_hal_conf.h +++ b/board/stm32h7xx_hal_conf.h @@ -50,7 +50,7 @@ extern "C" { /* #define HAL_NOR_MODULE_ENABLED */ /* #define HAL_OTFDEC_MODULE_ENABLED */ /* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ +#define HAL_SDRAM_MODULE_ENABLED /* #define HAL_HASH_MODULE_ENABLED */ /* #define HAL_HRTIM_MODULE_ENABLED */ /* #define HAL_HSEM_MODULE_ENABLED */ @@ -67,7 +67,7 @@ extern "C" { #define HAL_QSPI_MODULE_ENABLED /* #define HAL_RAMECC_MODULE_ENABLED */ /* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ /* #define HAL_SD_MODULE_ENABLED */ /* #define HAL_MMC_MODULE_ENABLED */ diff --git a/src/main.c b/src/main.c index 3a5aeaf..2ec7dfa 100644 --- a/src/main.c +++ b/src/main.c @@ -7,8 +7,10 @@ typedef void (*app_entry_t)(void); -static int app_map_qspi(void); -static int app_boot_xip(void); +static int app_map_qspi(void); +static inline int app_boot_header_verify(boot_header_t *hdr); +static inline int app_boot_header_get_flags(boot_header_t *hdr, uint32_t flag_mask); +static void app_boot_xip(void *app_base); int main(void) { HAL_Init(); @@ -21,10 +23,20 @@ int main(void) { goto boot_fail_loop; } - if (app_boot_xip() != 0) { + boot_header_t *hdr = (boot_header_t *)(APP_FCFB_BASE); + + /* Invalid configuration header */ + if (app_boot_header_verify(hdr) != 0) { goto boot_fail_loop; } + if(app_boot_header_get_flags(hdr, BOOT_HEADER_CONFIG_INIT_SDRAM_Msk) != 0) { + BOARD_InitFMC(); + } + + /* Boot application */ + app_boot_xip((void *)hdr->base); + boot_fail_loop: for (;;) { HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin); @@ -55,24 +67,25 @@ static int app_map_qspi(void) { return 0; } -static int app_boot_xip(void) { - boot_header_t *hdr = (boot_header_t *)(APP_FCFB_BASE); - - /* Invalid configuration header */ +static inline int app_boot_header_verify(boot_header_t *hdr) { if (hdr->signature != BOOT_HEADER_SIGNATURE_VALID) { return -1; } - uint32_t app_base = hdr->base; + return 0; +} +static inline int app_boot_header_get_flags(boot_header_t *hdr, uint32_t flag_mask) { + return hdr->config & flag_mask; +} + +static void app_boot_xip(void *app_base) { uint32_t initial_sp = *(uint32_t *)app_base; uint32_t reset_vect = *(uint32_t *)(app_base + 4); app_entry_t entry = (app_entry_t)reset_vect; - SysTick->CTRL = 0U; /* Disable SysTick interrupt */ - SCB->VTOR = app_base; /* Initialize vector table */ + SysTick->CTRL = 0U; /* Disable SysTick interrupt */ + SCB->VTOR = (uint32_t)app_base; /* Initialize vector table */ __set_MSP(initial_sp); entry(); - - return 0; /* Useless. */ -} \ No newline at end of file +}