diff --git a/cpu/stm32_common/dist/clk_conf/clk_conf.c b/cpu/stm32_common/dist/clk_conf/clk_conf.c index 6d51b487a1be41b048a02316af54d2835913077e..12b4f24cceb96849d17fa259636ef44813a69e01 100644 --- a/cpu/stm32_common/dist/clk_conf/clk_conf.c +++ b/cpu/stm32_common/dist/clk_conf/clk_conf.c @@ -300,6 +300,10 @@ int main(int argc, char **argv) bool use_alt_48MHz = false; unsigned clock_48MHz = cfg->need_48MHz ? 48000000U : 0; + if ((cfg->family == 0 || cfg->family == 1) && pll_src == HSI) { + /* HSI / 2 is used as source */ + m = 2; + } /* main PLL */ /* try to match coreclock with P output and 48MHz for Q output (USB) */ @@ -402,9 +406,11 @@ int main(int argc, char **argv) break; } } - for (apb2_pre = 1; apb2_pre <= 16; apb2_pre <<= 1) { - if (coreclock / apb2_pre <= cfg->max_apb2) { - break; + if (cfg->family == STM32F0) { + for (apb2_pre = 1; apb2_pre <= 16; apb2_pre <<= 1) { + if (coreclock / apb2_pre <= cfg->max_apb2) { + break; + } } } @@ -432,18 +438,32 @@ int main(int argc, char **argv) printf("/* peripheral clock setup */\n"); printf("#define CLOCK_AHB_DIV RCC_CFGR_HPRE_DIV1\n" "#define CLOCK_AHB (CLOCK_CORECLOCK / 1)\n"); - printf("#define CLOCK_APB1_DIV RCC_CFGR_PPRE1_DIV%u /* max %uMHz */\n" - "#define CLOCK_APB1 (CLOCK_CORECLOCK / %u)\n", - apb1_pre, cfg->max_apb1 / 1000000U, apb1_pre); - printf("#define CLOCK_APB2_DIV RCC_CFGR_PPRE2_DIV%u /* max %uMHz */\n" - "#define CLOCK_APB2 (CLOCK_CORECLOCK / %u)\n", - apb2_pre, cfg->max_apb2 / 1000000U, apb2_pre); - printf("\n/* Main PLL factors */\n"); - printf("#define CLOCK_PLL_M (%u)\n", m); - printf("#define CLOCK_PLL_N (%u)\n", n); - printf("#define CLOCK_PLL_P (%u)\n", p); - printf("#define CLOCK_PLL_Q (%u)\n", q); - + if (cfg->family == STM32F0) { + printf("#define CLOCK_APB1_DIV RCC_CFGR_PPRE_DIV%u /* max %uMHz */\n" + "#define CLOCK_APB1 (CLOCK_CORECLOCK / %u)\n", + apb1_pre, cfg->max_apb1 / 1000000U, apb1_pre); + printf("#define CLOCK_APB2 (CLOCK_APB1)\n"); + } + else { + printf("#define CLOCK_APB1_DIV RCC_CFGR_PPRE1_DIV%u /* max %uMHz */\n" + "#define CLOCK_APB1 (CLOCK_CORECLOCK / %u)\n", + apb1_pre, cfg->max_apb1 / 1000000U, apb1_pre); + printf("#define CLOCK_APB2_DIV RCC_CFGR_PPRE2_DIV%u /* max %uMHz */\n" + "#define CLOCK_APB2 (CLOCK_CORECLOCK / %u)\n", + apb2_pre, cfg->max_apb2 / 1000000U, apb2_pre); + } + if (cfg->family == STM32F0 || cfg->family == STM32F1 || cfg->family == STM32F3) { + printf("\n/* PLL factors */\n"); + printf("#define CLOCK_PLL_PREDIV (%u)\n", m); + printf("#define CLOCK_PLL_MUL (%u)\n", n); + } + else { + printf("\n/* Main PLL factors */\n"); + printf("#define CLOCK_PLL_M (%u)\n", m); + printf("#define CLOCK_PLL_N (%u)\n", n); + printf("#define CLOCK_PLL_P (%u)\n", p); + printf("#define CLOCK_PLL_Q (%u)\n", q); + } if (pll_i2s_p_out || pll_i2s_q_out) { printf("\n/* PLL I2S configuration */\n"); diff --git a/cpu/stm32_common/dist/clk_conf/clk_conf.h b/cpu/stm32_common/dist/clk_conf/clk_conf.h index d335fb3420a7b88b4289d0bc2867b6edd704d356..aad61f6778a7b0043286870ecb994f28797ceac8 100644 --- a/cpu/stm32_common/dist/clk_conf/clk_conf.h +++ b/cpu/stm32_common/dist/clk_conf/clk_conf.h @@ -44,6 +44,25 @@ enum fam { * @{ */ enum { + STM32F030, + STM32F070, + STM32F031, + STM32F051, + STM32F071, + STM32F091, + STM32F042, + STM32F072, + STM32F038, + STM32F048, + STM32F058, + STM32F078, + STM32F098, + + STM32F100, + STM32F101, + STM32F102, + STM32F103, + STM32F205, STM32F207, STM32F215, @@ -165,9 +184,29 @@ typedef struct { /** @} */ #define STM32F(x) [STM32F##x] = x +#define STM32F0(x) [STM32F0##x] = x /** List of supported models */ static const unsigned stm32_model[] = { + STM32F0(30), + STM32F0(70), + STM32F0(31), + STM32F0(51), + STM32F0(71), + STM32F0(91), + STM32F0(42), + STM32F0(72), + STM32F0(38), + STM32F0(48), + STM32F0(58), + STM32F0(78), + STM32F0(98), + + STM32F(100), + STM32F(101), + STM32F(102), + STM32F(103), + STM32F(205), STM32F(207), STM32F(215), @@ -245,6 +284,87 @@ static const unsigned stm32_model[] = { * @brief Clock config for supported cpu */ static const clk_cfg_t stm32_clk_cfg[] = { + [STM32F030 ... STM32F098] = { + .family = STM32F0, + .max_coreclock = 48000000U, + .max_apb1 = 48000000U, + .max_apb2 = 0, + .hsi = 8000000U, + .pll = { + .min_vco_input = 1000000U, + .max_vco_input = 24000000U, + .min_vco_output = 16000000U, + .max_vco_output = 48000000U, + .min_m = 1, + .max_m = 16, + .inc_m = 1, + .min_n = 2, + .max_n = 16, + .inc_n = 1, + .min_p = 1, + .max_p = 1, + .inc_p = 1, + }, + .has_pll_i2s = false, + .has_pll_sai = false, + .has_pll_i2s_alt_input = false, + .has_alt_48MHz = 0, + .need_48MHz = false, + }, + [STM32F100] = { + .family = STM32F1, + .max_coreclock = 24000000U, + .max_apb1 = 24000000U, + .max_apb2 = 24000000U, + .hsi = 8000000U, + .pll = { + .min_vco_input = 1000000U, + .max_vco_input = 24000000U, + .min_vco_output = 16000000U, + .max_vco_output = 24000000U, + .min_m = 1, + .max_m = 16, + .inc_m = 1, + .min_n = 2, + .max_n = 16, + .inc_n = 1, + .min_p = 1, + .max_p = 1, + .inc_p = 1, + }, + .has_pll_i2s = false, + .has_pll_sai = false, + .has_pll_i2s_alt_input = false, + .has_alt_48MHz = 0, + .need_48MHz = false, + }, + [STM32F101 ... STM32F103] = { + .family = STM32F1, + .max_coreclock = 72000000U, + .max_apb1 = 36000000U, + .max_apb2 = 72000000U, + .hsi = 8000000U, + .pll = { + .min_vco_input = 1000000U, + .max_vco_input = 25000000U, + .min_vco_output = 1000000U, + .max_vco_output = 72000000U, + .min_m = 1, + .max_m = 16, + .inc_m = 1, + .min_n = 2, + .max_n = 16, + .inc_n = 1, + .min_p = 1, + .max_p = 1, + .inc_p = 1, + }, + .has_pll_i2s = false, + .has_pll_sai = false, + .has_pll_i2s_alt_input = false, + .has_alt_48MHz = 0, + .need_48MHz = false, + }, [STM32F205 ... STM32F217] = { .family = STM32F2, .max_coreclock = 120000000U,