cancel
Showing results for 
Search instead for 
Did you mean: 

Bootloader and main firmware clock config

ALavr.10
Associate

Hi ST Community,

I have a device built on the STM32F407, with my bootloader.

If the bootloader runs at 168 MHz, and the main firmware runs at 72 MHz, everything works fine.

If SystemClock_Config of the bootloader have same settings (dividers and multipliers are the same at SystemClock_Config) as the main firmware (72 MHz), then the bootloader works correctly, but the main firmware crashes with hard fault, perhaps at SystemClock_Config.

The only difference is that bootloader SystemClock_Config written using HAL, and main firmware SystemClock_Config written using LL, but using LL from the main firmware in bootloader did not help.

I need both the bootloader and the main firmware to work on the same frequency (72 MHz).

SystemClock_Config of the bootloader and main firmware is shown below.

Thank you.

SystemClock_Config from bootloader:

void SystemClock_Config(void) {
	RCC_OscInitTypeDef RCC_OscInitStruct;
	RCC_ClkInitTypeDef RCC_ClkInitStruct;
	/**Configure the main internal regulator output voltage
	 */
	__HAL_RCC_PWR_CLK_ENABLE();
	__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
	/**Initializes the CPU, AHB and APB busses clocks
	 */
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	RCC_OscInitStruct.HSEState = RCC_HSE_ON;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
	RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
	RCC_OscInitStruct.PLL.PLLM = 25;
	RCC_OscInitStruct.PLL.PLLN = 336;
	RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
	RCC_OscInitStruct.PLL.PLLQ = 7;
 
	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
		_Error_Handler(__FILE__, __LINE__);
	}
 
	/**Initializes the CPU, AHB and APB busses clocks
	 */
	RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
			| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV8;
	RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV8;
 
	if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
		_Error_Handler(__FILE__, __LINE__);
	}
 
	/**Configure the Systick interrupt time
	 */
	HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
	/**Configure the Systick
	 */
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
	/* SysTick_IRQn interrupt configuration */
	HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

SystemClock_Config from main firmware:

void SystemClock_Config(void) {
 
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
    LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
 
    LL_FLASH_SetLatency(LL_FLASH_LATENCY_2);
 
    if (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2) {
        Error_Handler();
    }
    LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1);
 
	LL_RCC_HSE_Enable();
 
	/* Wait till HSE is ready */
	while (LL_RCC_HSE_IsReady() != 1) {
 
	}
	LL_PWR_EnableBkUpAccess();
 
	LL_RCC_LSE_Enable();
 
	/* Wait till LSE is ready */
	while (LL_RCC_LSE_IsReady() != 1) {
 
	}
	LL_RCC_SetRTCClockSource(LL_RCC_RTC_CLKSOURCE_LSE);
 
	LL_RCC_EnableRTC();
 
	LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_25, 144,
	LL_RCC_PLLP_DIV_2);
 
	LL_RCC_PLL_ConfigDomain_48M(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_25, 144,
	LL_RCC_PLLQ_DIV_3);
 
	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) {
 
    }
 
    SysTick_Config(72000000 / 1000);
    /* SysTick_IRQn interrupt configuration */
    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 15, 0));
}

0 REPLIES 0