static void prvSetupHardware( void ) { GPIO_InitTypeDef GPIO_InitStruct; /* Configure Flash prefetch and Instruction cache through ART accelerator. */ #if( ART_ACCLERATOR_ENABLE != 0 ) { __HAL_FLASH_ART_ENABLE(); } #endif /* ART_ACCLERATOR_ENABLE */ /* Set Interrupt Group Priority */ HAL_NVIC_SetPriorityGrouping( NVIC_PRIORITYGROUP_4 ); /* Init the low level hardware. */ HAL_MspInit(); /* Configure the System clock to have a frequency of 200 MHz */ prvSystemClockConfig(); /* Enable GPIOB Clock (to be able to program the configuration registers) and configure for LED output. */ __GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init( GPIOF, &GPIO_InitStruct ); /* MCO2 : Pin PC9 */ HAL_RCC_MCOConfig( RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1 ); }
void platform_early_init(void) { // Do general system init SystemInit(); SystemClock_Config(); // Enable the flash ART controller __HAL_FLASH_ART_ENABLE(); __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); /* read the unique id */ stm32_unique_id[0] = *REG32(0x1ff0f420); stm32_unique_id[1] = *REG32(0x1ff0f424); stm32_unique_id[2] = *REG32(0x1ff0f428); /* seed the random number generator based on this */ srand(stm32_unique_id[0] ^ stm32_unique_id[1] ^ stm32_unique_id[2]); // Start the systick timer uint32_t sysclk = HAL_RCC_GetSysClockFreq(); arm_cm_systick_init(sysclk); stm32_timer_early_init(); stm32_gpio_early_init(); stm32_flash_early_init(); stm32_rng_init(); /* clear the reboot reason */ RCC->CSR |= (1<<24); // ITM_SendChar('1'); }
/** * @brief This function is used to initialize the HAL Library; it must be the first * instruction to be executed in the main program (before to call any other * HAL function), it performs the following: * Configure the Flash prefetch, and instruction cache through ART accelerator. * Configures the SysTick to generate an interrupt each 1 millisecond, * which is clocked by the HSI (at this stage, the clock is not yet * configured and thus the system is running from the internal HSI at 16 MHz). * Set NVIC Group Priority to 4. * Calls the HAL_MspInit() callback function defined in user file * "stm32f7xx_hal_msp.c" to do the global low level hardware initialization * * @note SysTick is used as time base for the HAL_Delay() function, the application * need to ensure that the SysTick time base is always set to 1 millisecond * to have correct HAL operation. * @retval HAL status */ HAL_StatusTypeDef HAL_Init(void) { /* Configure Flash prefetch and Instruction cache through ART accelerator */ #if (ART_ACCLERATOR_ENABLE != 0) __HAL_FLASH_ART_ENABLE(); #endif /* ART_ACCLERATOR_ENABLE */ /* Set Interrupt Group Priority */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ HAL_InitTick(TICK_INT_PRIORITY); /* Init the low level hardware */ HAL_MspInit(); /* Return function status */ return HAL_OK; }
// BSP functions ============================================================= void BSP::init(void) { // NOTE: SystemInit() has been already called from the startup code // but SystemCoreClock needs to be updated SystemCoreClockUpdate(); // NOTE: The VFP (hardware Floating Point) unit is configured by FreeRTOS */ SCB_EnableICache(); // Enable I-Cache SCB_EnableDCache(); // Enable D-Cache // Configure Flash prefetch and Instr. cache through ART accelerator #if (ART_ACCLERATOR_ENABLE != 0) __HAL_FLASH_ART_ENABLE(); #endif // ART_ACCLERATOR_ENABLE /* Configure the LEDs */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); // Configure the User Button in GPIO Mode BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); //... BSP::randomSeed(1234U); // initialize the QS software tracing... if (!QS_INIT((void *)0)) { Q_ERROR(); } QS_OBJ_DICTIONARY(&l_TickHook); QS_OBJ_DICTIONARY(&l_EXTI0_IRQHandler); QS_USR_DICTIONARY(PHILO_STAT); QS_USR_DICTIONARY(PAUSED_STAT); QS_USR_DICTIONARY(COMMAND_STAT); }
// BSP functions ============================================================= void BSP::init(void) { // NOTE: SystemInit() has been already called from the startup code // but SystemCoreClock needs to be updated // SystemCoreClockUpdate(); SCB_EnableICache(); // Enable I-Cache SCB_EnableDCache(); // Enable D-Cache // Configure Flash prefetch and Instr. cache through ART accelerator #if (ART_ACCLERATOR_ENABLE != 0) __HAL_FLASH_ART_ENABLE(); #endif // ART_ACCLERATOR_ENABLE // configure the FPU usage by choosing one of the options... #if 1 // OPTION 1: // Use the automatic FPU state preservation and the FPU lazy stacking. // // NOTE: // Use the following setting when FPU is used in more than one task or // in any ISRs. This setting is the safest and recommended, but requires // extra stack space and CPU cycles. // FPU->FPCCR |= (1U << FPU_FPCCR_ASPEN_Pos) | (1U << FPU_FPCCR_LSPEN_Pos); #else // OPTION 2: // Do NOT to use the automatic FPU state preservation and // do NOT to use the FPU lazy stacking. // // NOTE: // Use the following setting when FPU is used in ONE task only and not // in any ISR. This setting is very efficient, but if more than one task // (or ISR) start using the FPU, this can lead to corruption of the // FPU registers. This option should be used with CAUTION. // FPU->FPCCR &= ~((1U << FPU_FPCCR_ASPEN_Pos) | (1U << FPU_FPCCR_LSPEN_Pos)); #endif /* Configure the LEDs */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); // Configure the User Button in GPIO Mode BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); //... BSP::randomSeed(1234U); // initialize the QS software tracing... if (!QS_INIT((void *)0)) { Q_ERROR(); } QS_OBJ_DICTIONARY(&l_SysTick_Handler); QS_OBJ_DICTIONARY(&l_EXTI0_IRQHandler); QS_USR_DICTIONARY(PHILO_STAT); QS_USR_DICTIONARY(PAUSED_STAT); QS_USR_DICTIONARY(COMMAND_STAT); QS_USR_DICTIONARY(ON_CONTEXT_SW); }