/**************************************************************************************** * Include files ****************************************************************************************/ #include "boot.h" /* bootloader generic header */ #include "stm32f1xx.h" /* STM32 registers and drivers */ #include "stm32f1xx_ll_rcc.h" /* STM32 LL RCC header */ #include "stm32f1xx_ll_bus.h" /* STM32 LL BUS header */ #include "stm32f1xx_ll_system.h" /* STM32 LL SYSTEM header */ #include "stm32f1xx_ll_utils.h" /* STM32 LL UTILS header */ #include "stm32f1xx_ll_usart.h" /* STM32 LL USART header */ #include "stm32f1xx_ll_gpio.h" /* STM32 LL GPIO header */ #include "../io/io_pins.h" /**************************************************************************************** * Function prototypes ****************************************************************************************/ static void Init(void); static void SystemClock_Config(void); /************************************************************************************//** ** \brief This is the entry point for the bootloader application and is called ** by the reset interrupt vector after the C-startup routines executed. ** \return Program return code. ** ****************************************************************************************/ int main(void) { /* initialize the microcontroller */ Init(); /* initialize the bootloader */ BootInit(); /* start the infinite program loop */ while (1) { /* run the bootloader task */ BootTask(); } /* program should never get here */ return 0; } /*** end of main ***/ /************************************************************************************//** ** \brief Initializes the microcontroller. ** \return none. ** ****************************************************************************************/ static void Init(void) { /* HAL library initialization */ HAL_Init(); /* configure system clock */ SystemClock_Config(); } /*** end of Init ***/ /************************************************************************************//** ** \brief System Clock Configuration. This code was created by CubeMX and configures ** the system clock to match the configuration in the bootloader's ** configuration (blt_conf.h), specifically the macros: ** BOOT_CPU_SYSTEM_SPEED_KHZ and BOOT_CPU_XTAL_SPEED_KHZ. ** Note that the Lower Layer drivers were selected in CubeMX for the RCC ** subsystem. ** \return none. ** ****************************************************************************************/ static void SystemClock_Config(void) { /* Set flash latency. */ LL_FLASH_SetLatency(LL_FLASH_LATENCY_2); if (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2) { /* Error setting flash latency. */ ASSERT_RT(BLT_FALSE); } /* Enable the HSI clock. */ LL_RCC_HSI_Enable(); /* Wait till HSE is ready. */ while (LL_RCC_HSI_IsReady() != 1) { ; } /* Configure and enable the PLL. */ /* 48MHz max */ LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI_DIV_2, LL_RCC_PLL_MUL_12); LL_RCC_PLL_Enable(); /* Wait till PLL is ready. */ while (LL_RCC_PLL_IsReady() != 1) { ; } LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); /* Wait till System clock is ready. */ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { ; } /* Update the system clock speed setting. */ LL_SetSystemCoreClock(BOOT_CPU_SYSTEM_SPEED_KHZ * 1000u); } /*** end of SystemClock_Config ***/ /************************************************************************************//** ** \brief Initializes the Global MSP. This function is called from HAL_Init() ** function to perform system level initialization (GPIOs, clock, DMA, ** interrupt). ** \return none. ** ****************************************************************************************/ void HAL_MspInit(void) { LL_GPIO_InitTypeDef GPIO_InitStruct; /* AFIO and PWR clock enable. */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); /* GPIO ports clock enable. */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB); #if (BOOT_COM_RS232_ENABLE > 0) /* UART clock enable. */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); /* UART TX and RX GPIO pin configuration. */ GPIO_InitStruct.Pin = LL_UART_TX_PIN; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; LL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_UART_RX_PIN; GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct); #endif #if (BOOT_COM_CAN_ENABLE > 0) /* CAN clock enable. */ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_CAN1); /* CAN TX and RX GPIO pin configuration. */ GPIO_InitStruct.Pin = LL_CAN_TX_PIN; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; LL_GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_CAN_RX_PIN; GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; LL_GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStruct); #endif #if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) /* Configure GPIO pin for (optional) backdoor entry input. */ GPIO_InitStruct.Pin = LL_GPIO_PIN_13; GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING; LL_GPIO_Init(GPIOC, &GPIO_InitStruct); #endif } /*** end of HAL_MspInit ***/ /************************************************************************************//** ** \brief DeInitializes the Global MSP. This function is called from HAL_DeInit() ** function to perform system level de-initialization (GPIOs, clock, DMA, ** interrupt). ** \return none. ** ****************************************************************************************/ void HAL_MspDeInit(void) { /* Reset the RCC clock configuration to the default reset state. */ LL_RCC_DeInit(); /* Deinit used GPIOs. */ LL_GPIO_DeInit(GPIOB); LL_GPIO_DeInit(GPIOA); #if (BOOT_COM_CAN_ENABLE > 0) /* CAN clock disable. */ LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_CAN1); #endif #if (BOOT_COM_RS232_ENABLE > 0) /* UART clock disable. */ LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_USART1); #endif /* GPIO ports clock disable. */ LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_GPIOB); LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_GPIOA); /* AFIO and PWR clock disable. */ LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_PWR); LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_AFIO); } /*** end of HAL_MspDeInit ***/ /*********************************** end of main.c *************************************/