Updated bootloader.
Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
parent
bf83c4ebee
commit
a53a1245ae
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
__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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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
|
121
board/pin_mux.c
121
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);
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
39
src/main.c
39
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. */
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue