/** * @brief fill in AHB/APB buses configuration structure */ static void config_bus_clk_init(LL_UTILS_ClkInitTypeDef *clk_init) { clk_init->AHBCLKDivider = ahb_prescaler( CONFIG_CLOCK_STM32_AHB_PRESCALER); clk_init->APB1CLKDivider = apb1_prescaler( CONFIG_CLOCK_STM32_APB1_PRESCALER); #ifndef CONFIG_SOC_SERIES_STM32F0X clk_init->APB2CLKDivider = apb2_prescaler( CONFIG_CLOCK_STM32_APB2_PRESCALER); #endif /* CONFIG_SOC_SERIES_STM32F0X */ }
static int stm32f10x_clock_control_init(struct device *dev) { struct stm32f10x_rcc_data *data = dev->driver_data; volatile struct stm32f10x_rcc *rcc = (struct stm32f10x_rcc *)(data->base); /* SYSCLK source defaults to HSI */ int sysclk_src = STM32F10X_RCC_CFG_SYSCLK_SRC_HSI; u32_t hpre = ahb_prescaler(CONFIG_CLOCK_STM32F10X_CONN_LINE_AHB_PRESCALER); u32_t ppre1 = apb_prescaler(CONFIG_CLOCK_STM32F10X_CONN_LINE_APB1_PRESCALER); u32_t ppre2 = apb_prescaler(CONFIG_CLOCK_STM32F10X_CONN_LINE_APB2_PRESCALER); #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_MULTIPLIER u32_t pll_mul = pllmul(CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_MULTIPLIER); #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_MULTIPLIER */ #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL2_MULTIPLIER u32_t pll2_mul = pll2mul(CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL2_MULTIPLIER); #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL2_MULTIPLIER */ #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV1 u32_t prediv1 = prediv_prescaler(CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV1); #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV1 */ #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV2 u32_t prediv2 = prediv_prescaler(CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV2); #endif /* CLOCK_STM32F10X_CONN_LINE_PREDIV2 */ /* disable PLLs */ rcc->cr.bit.pllon = 0; rcc->cr.bit.pll2on = 0; rcc->cr.bit.pll3on = 0; /* disable HSE */ rcc->cr.bit.hseon = 0; #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_HSE_BYPASS /* HSE is disabled, HSE bypass can be enabled*/ rcc->cr.bit.hsebyp = 1; #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_HSE_BYPASS */ #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_SRC_HSI /* enable HSI clock */ rcc->cr.bit.hsion = 1; /* this should end after one test */ while (rcc->cr.bit.hsirdy != 1) { } /* HSI oscillator clock / 2 selected as PLL input clock */ rcc->cfgr.bit.pllsrc = STM32F10X_RCC_CFG_PLL_SRC_HSI; #endif /* CONFIG_CLOCK_STM32F10X_PLL_SRC_HSI */ #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_SRC_PREDIV1 /* wait for to become ready */ rcc->cr.bit.hseon = 1; while (rcc->cr.bit.hserdy != 1) { } rcc->cfgr2.bit.prediv1 = prediv1; /* Clock from PREDIV1 selected as PLL input clock */ rcc->cfgr.bit.pllsrc = STM32F10X_RCC_CFG_PLL_SRC_PREDIV1; #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV1_SRC_HSE /* HSE oscillator clock selected as PREDIV1 clock entry */ rcc->cfgr2.bit.prediv1src = STM32F10X_RCC_CFG2_PREDIV1_SRC_HSE; #else /* PLL2 selected as PREDIV1 clock entry */ rcc->cfgr2.bit.prediv1src = STM32F10X_RCC_CFG2_PREDIV1_SRC_PLL2; rcc->cfgr2.bit.prediv2 = prediv2; rcc->cfgr2.bit.pll2mul = pll2_mul; /* enable PLL2 */ rcc->cr.bit.pll2on = 1; /* wait for PLL to become ready */ while (rcc->cr.bit.pll2rdy != 1) { } #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_PREDIV1_SRC_HSE */ #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_PLL_SRC_PREDIV1 */ /* setup AHB prescaler */ rcc->cfgr.bit.hpre = hpre; /* setup APB1, must not exceed 36MHz */ rcc->cfgr.bit.ppre1 = ppre1; /* setup APB2 */ rcc->cfgr.bit.ppre2 = ppre2; #ifdef CONFIG_CLOCK_STM32F10X_CONN_LINE_SYSCLK_SRC_HSI /* enable HSI clock */ rcc->cr.bit.hsion = 1; /* this should end after one test */ while (rcc->cr.bit.hsirdy != 1) { } sysclk_src = STM32F10X_RCC_CFG_SYSCLK_SRC_HSI; #elif defined(CONFIG_CLOCK_STM32F10X_SYSCLK_SRC_HSE) /* enable HSE clock */ rcc->cr.bit.hseon = 1; /* wait for to become ready */ while (rcc->cr.bit.hserdy != 1) { } sysclk_src = STM32F10X_RCC_CFG_SYSCLK_SRC_HSE; #elif defined(CONFIG_CLOCK_STM32F10X_CONN_LINE_SYSCLK_SRC_PLLCLK) /* setup PLL multiplication (PLL must be disabled) */ rcc->cfgr.bit.pllmul = pll_mul; /* enable PLL */ rcc->cr.bit.pllon = 1; /* wait for PLL to become ready */ while (rcc->cr.bit.pllrdy != 1) { } sysclk_src = STM32F10X_RCC_CFG_SYSCLK_SRC_PLL; #endif /* CONFIG_CLOCK_STM32F10X_CONN_LINE_SYSCLK_SRC_HSI */ /* configure flash access latency before SYSCLK source * switch */ setup_flash(); /* set SYSCLK clock value */ rcc->cfgr.bit.sw = sysclk_src; /* wait for SYSCLK to switch the source */ while (rcc->cfgr.bit.sws != sysclk_src) { } return 0; }