9#ifndef ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_STM32_CLOCK_CONTROL_H_
10#define ZEPHYR_INCLUDE_DRIVERS_CLOCK_CONTROL_STM32_CLOCK_CONTROL_H_
14#if defined(CONFIG_SOC_SERIES_STM32F0X)
16#elif defined(CONFIG_SOC_SERIES_STM32F1X)
18#elif defined(CONFIG_SOC_SERIES_STM32F3X)
20#elif defined(CONFIG_SOC_SERIES_STM32F2X) || \
21 defined(CONFIG_SOC_SERIES_STM32F4X) || \
22 defined(CONFIG_SOC_SERIES_STM32F7X)
24#elif defined(CONFIG_SOC_SERIES_STM32G0X)
26#elif defined(CONFIG_SOC_SERIES_STM32G4X)
28#elif defined(CONFIG_SOC_SERIES_STM32L0X)
30#elif defined(CONFIG_SOC_SERIES_STM32L1X)
32#elif defined(CONFIG_SOC_SERIES_STM32L4X) || \
33 defined(CONFIG_SOC_SERIES_STM32L5X)
35#elif defined(CONFIG_SOC_SERIES_STM32WBX)
37#elif defined(CONFIG_SOC_SERIES_STM32WLX)
39#elif defined(CONFIG_SOC_SERIES_STM32H7X)
41#elif defined(CONFIG_SOC_SERIES_STM32U5X)
48#define STM32_CLOCK_CONTROL_NODE DT_NODELABEL(rcc)
52#define STM32_AHB_PRESCALER DT_PROP(DT_NODELABEL(rcc), ahb_prescaler)
53#define STM32_APB1_PRESCALER DT_PROP(DT_NODELABEL(rcc), apb1_prescaler)
54#define STM32_APB2_PRESCALER DT_PROP(DT_NODELABEL(rcc), apb2_prescaler)
55#define STM32_APB3_PRESCALER DT_PROP(DT_NODELABEL(rcc), apb3_prescaler)
56#define STM32_AHB3_PRESCALER DT_PROP(DT_NODELABEL(rcc), ahb3_prescaler)
57#define STM32_AHB4_PRESCALER DT_PROP(DT_NODELABEL(rcc), ahb4_prescaler)
58#define STM32_CPU1_PRESCALER DT_PROP(DT_NODELABEL(rcc), cpu1_prescaler)
59#define STM32_CPU2_PRESCALER DT_PROP(DT_NODELABEL(rcc), cpu2_prescaler)
61#if DT_NODE_HAS_PROP(DT_NODELABEL(rcc), ahb_prescaler)
62#define STM32_CORE_PRESCALER STM32_AHB_PRESCALER
63#elif DT_NODE_HAS_PROP(DT_NODELABEL(rcc), cpu1_prescaler)
64#define STM32_CORE_PRESCALER STM32_CPU1_PRESCALER
67#if DT_NODE_HAS_PROP(DT_NODELABEL(rcc), ahb3_prescaler)
68#define STM32_FLASH_PRESCALER STM32_AHB3_PRESCALER
69#elif DT_NODE_HAS_PROP(DT_NODELABEL(rcc), ahb4_prescaler)
70#define STM32_FLASH_PRESCALER STM32_AHB4_PRESCALER
72#define STM32_FLASH_PRESCALER STM32_CORE_PRESCALER
75#define STM32_D1CPRE DT_PROP(DT_NODELABEL(rcc), d1cpre)
76#define STM32_HPRE DT_PROP(DT_NODELABEL(rcc), hpre)
77#define STM32_D2PPRE1 DT_PROP(DT_NODELABEL(rcc), d2ppre1)
78#define STM32_D2PPRE2 DT_PROP(DT_NODELABEL(rcc), d2ppre2)
79#define STM32_D1PPRE DT_PROP(DT_NODELABEL(rcc), d1ppre)
80#define STM32_D3PPRE DT_PROP(DT_NODELABEL(rcc), d3ppre)
82#define DT_RCC_CLOCKS_CTRL DT_CLOCKS_CTLR(DT_NODELABEL(rcc))
87#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(pll))
88#define STM32_SYSCLK_SRC_PLL 1
90#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(clk_hsi))
91#define STM32_SYSCLK_SRC_HSI 1
93#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(clk_hse))
94#define STM32_SYSCLK_SRC_HSE 1
96#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(clk_msi))
97#define STM32_SYSCLK_SRC_MSI 1
99#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(clk_msis))
100#define STM32_SYSCLK_SRC_MSIS 1
102#if DT_SAME_NODE(DT_RCC_CLOCKS_CTRL, DT_NODELABEL(clk_csi))
103#define STM32_SYSCLK_SRC_CSI 1
109#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f2_pll_clock, okay) || \
110 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f4_pll_clock, okay) || \
111 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f7_pll_clock, okay) || \
112 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32g0_pll_clock, okay) || \
113 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32g4_pll_clock, okay) || \
114 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32l4_pll_clock, okay) || \
115 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32u5_pll_clock, okay) || \
116 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32wb_pll_clock, okay) || \
117 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32h7_pll_clock, okay)
118#define STM32_PLL_ENABLED 1
119#define STM32_PLL_M_DIVISOR DT_PROP(DT_NODELABEL(pll), div_m)
120#define STM32_PLL_N_MULTIPLIER DT_PROP(DT_NODELABEL(pll), mul_n)
121#define STM32_PLL_P_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll), div_p)
122#define STM32_PLL_P_DIVISOR DT_PROP_OR(DT_NODELABEL(pll), div_p, 1)
123#define STM32_PLL_Q_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll), div_q)
124#define STM32_PLL_Q_DIVISOR DT_PROP_OR(DT_NODELABEL(pll), div_q, 1)
125#define STM32_PLL_R_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll), div_r)
126#define STM32_PLL_R_DIVISOR DT_PROP_OR(DT_NODELABEL(pll), div_r, 1)
129#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll2), st_stm32u5_pll_clock, okay)
130#define STM32_PLL2_ENABLED 1
131#define STM32_PLL2_M_DIVISOR DT_PROP(DT_NODELABEL(pll2), div_m)
132#define STM32_PLL2_N_MULTIPLIER DT_PROP(DT_NODELABEL(pll2), mul_n)
133#define STM32_PLL2_P_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll2), div_p)
134#define STM32_PLL2_P_DIVISOR DT_PROP_OR(DT_NODELABEL(pll2), div_p, 1)
135#define STM32_PLL2_Q_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll2), div_q)
136#define STM32_PLL2_Q_DIVISOR DT_PROP_OR(DT_NODELABEL(pll2), div_q, 1)
137#define STM32_PLL2_R_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll2), div_r)
138#define STM32_PLL2_R_DIVISOR DT_PROP_OR(DT_NODELABEL(pll2), div_r, 1)
141#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll3), st_stm32h7_pll_clock, okay) || \
142 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll3), st_stm32u5_pll_clock, okay)
143#define STM32_PLL3_ENABLED 1
144#define STM32_PLL3_M_DIVISOR DT_PROP(DT_NODELABEL(pll3), div_m)
145#define STM32_PLL3_N_MULTIPLIER DT_PROP(DT_NODELABEL(pll3), mul_n)
146#define STM32_PLL3_P_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll3), div_p)
147#define STM32_PLL3_P_DIVISOR DT_PROP_OR(DT_NODELABEL(pll3), div_p, 1)
148#define STM32_PLL3_Q_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll3), div_q)
149#define STM32_PLL3_Q_DIVISOR DT_PROP_OR(DT_NODELABEL(pll3), div_q, 1)
150#define STM32_PLL3_R_ENABLED DT_NODE_HAS_PROP(DT_NODELABEL(pll3), div_r)
151#define STM32_PLL3_R_DIVISOR DT_PROP_OR(DT_NODELABEL(pll3), div_r, 1)
154#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f1_pll_clock, okay)
155#define STM32_PLL_ENABLED 1
156#define STM32_PLL_XTPRE DT_PROP(DT_NODELABEL(pll), xtpre)
157#define STM32_PLL_MULTIPLIER DT_PROP(DT_NODELABEL(pll), mul)
158#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f0_pll_clock, okay) || \
159 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f100_pll_clock, okay) || \
160 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32f105_pll_clock, okay)
161#define STM32_PLL_ENABLED 1
162#define STM32_PLL_MULTIPLIER DT_PROP(DT_NODELABEL(pll), mul)
163#define STM32_PLL_PREDIV DT_PROP(DT_NODELABEL(pll), prediv)
164#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll), st_stm32l0_pll_clock, okay)
165#define STM32_PLL_ENABLED 1
166#define STM32_PLL_DIVISOR DT_PROP(DT_NODELABEL(pll), div)
167#define STM32_PLL_MULTIPLIER DT_PROP(DT_NODELABEL(pll), mul)
170#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(pll2), st_stm32f105_pll2_clock, okay)
171#define STM32_PLL2_ENABLED 1
172#define STM32_PLL2_MULTIPLIER DT_PROP(DT_NODELABEL(pll2), mul)
173#define STM32_PLL2_PREDIV DT_PROP(DT_NODELABEL(pll2), prediv)
177#if DT_NODE_HAS_STATUS(DT_NODELABEL(pll), okay) && \
178 DT_NODE_HAS_PROP(DT_NODELABEL(pll), clocks)
179#define DT_PLL_CLOCKS_CTRL DT_CLOCKS_CTLR(DT_NODELABEL(pll))
180#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(clk_msi))
181#define STM32_PLL_SRC_MSI 1
183#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(clk_msis))
184#define STM32_PLL_SRC_MSIS 1
186#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(clk_hsi))
187#define STM32_PLL_SRC_HSI 1
189#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(clk_csi))
190#define STM32_PLL_SRC_CSI 1
192#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(clk_hse))
193#define STM32_PLL_SRC_HSE 1
195#if DT_SAME_NODE(DT_PLL_CLOCKS_CTRL, DT_NODELABEL(pll2))
196#define STM32_PLL_SRC_PLL2 1
202#if DT_NODE_HAS_STATUS(DT_NODELABEL(pll2), okay) && \
203 DT_NODE_HAS_PROP(DT_NODELABEL(pll2), clocks)
204#define DT_PLL2_CLOCKS_CTRL DT_CLOCKS_CTLR(DT_NODELABEL(pll2))
205#if DT_SAME_NODE(DT_PLL2_CLOCKS_CTRL, DT_NODELABEL(clk_msis))
206#define STM32_PLL2_SRC_MSIS 1
208#if DT_SAME_NODE(DT_PLL2_CLOCKS_CTRL, DT_NODELABEL(clk_hsi))
209#define STM32_PLL2_SRC_HSI 1
211#if DT_SAME_NODE(DT_PLL2_CLOCKS_CTRL, DT_NODELABEL(clk_hse))
212#define STM32_PLL2_SRC_HSE 1
218#if DT_NODE_HAS_STATUS(DT_NODELABEL(pll3), okay) && \
219 DT_NODE_HAS_PROP(DT_NODELABEL(pll3), clocks)
220#define DT_PLL3_CLOCKS_CTRL DT_CLOCKS_CTLR(DT_NODELABEL(pll3))
221#if DT_SAME_NODE(DT_PLL3_CLOCKS_CTRL, DT_NODELABEL(clk_msis))
222#define STM32_PLL3_SRC_MSIS 1
224#if DT_SAME_NODE(DT_PLL3_CLOCKS_CTRL, DT_NODELABEL(clk_hsi))
225#define STM32_PLL3_SRC_HSI 1
227#if DT_SAME_NODE(DT_PLL3_CLOCKS_CTRL, DT_NODELABEL(clk_hse))
228#define STM32_PLL3_SRC_HSE 1
236#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_lse), fixed_clock, okay)
237#define STM32_LSE_ENABLED 1
238#define STM32_LSE_FREQ DT_PROP(DT_NODELABEL(clk_lse), clock_frequency)
239#define STM32_LSE_DRIVING 0
240#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_lse), st_stm32_lse_clock, okay)
241#define STM32_LSE_ENABLED 1
242#define STM32_LSE_FREQ DT_PROP(DT_NODELABEL(clk_lse), clock_frequency)
243#define STM32_LSE_DRIVING DT_PROP(DT_NODELABEL(clk_lse), driving_capability)
245#define STM32_LSE_ENABLED 0
246#define STM32_LSE_FREQ 0
247#define STM32_LSE_DRIVING 0
250#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_msi), st_stm32_msi_clock, okay) || \
251 DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_msi), st_stm32l0_msi_clock, okay)
252#define STM32_MSI_ENABLED 1
253#define STM32_MSI_RANGE DT_PROP(DT_NODELABEL(clk_msi), msi_range)
256#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_msi), st_stm32_msi_clock, okay)
257#define STM32_MSI_ENABLED 1
258#define STM32_MSI_PLL_MODE DT_PROP(DT_NODELABEL(clk_msi), msi_pll_mode)
261#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_msis), st_stm32u5_msi_clock, okay)
262#define STM32_MSIS_ENABLED 1
263#define STM32_MSIS_RANGE DT_PROP(DT_NODELABEL(clk_msis), msi_range)
264#define STM32_MSIS_PLL_MODE DT_PROP(DT_NODELABEL(clk_msis), msi_pll_mode)
266#define STM32_MSIS_ENABLED 0
267#define STM32_MSIS_RANGE 0
268#define STM32_MSIS_PLL_MODE 0
271#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_msik), st_stm32u5_msi_clock, okay)
272#define STM32_MSIK_ENABLED 1
273#define STM32_MSIK_RANGE DT_PROP(DT_NODELABEL(clk_msik), msi_range)
274#define STM32_MSIK_PLL_MODE DT_PROP(DT_NODELABEL(clk_msik), msi_pll_mode)
276#define STM32_MSIK_ENABLED 0
277#define STM32_MSIK_RANGE 0
278#define STM32_MSIK_PLL_MODE 0
281#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_csi), fixed_clock, okay)
282#define STM32_CSI_ENABLED 1
283#define STM32_CSI_FREQ DT_PROP(DT_NODELABEL(clk_csi), clock_frequency)
285#define STM32_CSI_FREQ 0
288#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_lsi), fixed_clock, okay)
289#define STM32_LSI_ENABLED 1
290#define STM32_LSI_FREQ DT_PROP(DT_NODELABEL(clk_lsi), clock_frequency)
292#define STM32_LSI_FREQ 0
295#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), fixed_clock, okay)
296#define STM32_HSI_DIV_ENABLED 0
297#define STM32_HSI_ENABLED 1
298#define STM32_HSI_FREQ DT_PROP(DT_NODELABEL(clk_hsi), clock_frequency)
299#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32h7_hsi_clock, okay) \
300 || DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hsi), st_stm32g0_hsi_clock, okay)
301#define STM32_HSI_DIV_ENABLED 1
302#define STM32_HSI_ENABLED 1
303#define STM32_HSI_DIVISOR DT_PROP(DT_NODELABEL(clk_hsi), hsi_div)
304#define STM32_HSI_FREQ DT_PROP(DT_NODELABEL(clk_hsi), clock_frequency)
306#define STM32_HSI_DIV_ENABLED 0
307#define STM32_HSI_DIVISOR 1
308#define STM32_HSI_FREQ 0
311#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hse), fixed_clock, okay)
312#define STM32_HSE_ENABLED 1
313#define STM32_HSE_FREQ DT_PROP(DT_NODELABEL(clk_hse), clock_frequency)
314#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hse), st_stm32_hse_clock, okay)
315#define STM32_HSE_ENABLED 1
316#define STM32_HSE_BYPASS DT_PROP(DT_NODELABEL(clk_hse), hse_bypass)
317#define STM32_HSE_FREQ DT_PROP(DT_NODELABEL(clk_hse), clock_frequency)
318#elif DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(clk_hse), st_stm32wl_hse_clock, okay)
319#define STM32_HSE_ENABLED 1
320#define STM32_HSE_TCXO DT_PROP(DT_NODELABEL(clk_hse), hse_tcxo)
321#define STM32_HSE_DIV2 DT_PROP(DT_NODELABEL(clk_hse), hse_div2)
322#define STM32_HSE_FREQ DT_PROP(DT_NODELABEL(clk_hse), clock_frequency)
324#define STM32_HSE_FREQ 0
327#if DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(perck), st_stm32_clock_mux, okay)
328#define STM32_CKPER_ENABLED 1
340#define STM32_CLOCK_INFO(clk_index, node_id) \
342 .enr = DT_CLOCKS_CELL_BY_IDX(node_id, clk_index, bits), \
343 .bus = DT_CLOCKS_CELL_BY_IDX(node_id, clk_index, bus) \
345#define STM32_DT_CLOCKS(node_id) \
347 LISTIFY(DT_NUM_CLOCKS(node_id), \
348 STM32_CLOCK_INFO, (,), node_id) \
351#define STM32_DT_INST_CLOCKS(inst) \
352 STM32_DT_CLOCKS(DT_DRV_INST(inst))
354#define STM32_DOMAIN_CLOCK_INST_SUPPORT(inst) DT_INST_CLOCKS_HAS_IDX(inst, 1) ||
355#define STM32_DT_INST_DEV_DOMAIN_CLOCK_SUPPORT \
356 (DT_INST_FOREACH_STATUS_OKAY(STM32_DOMAIN_CLOCK_INST_SUPPORT) 0)
358#define STM32_DOMAIN_CLOCK_SUPPORT(id) DT_CLOCKS_HAS_IDX(DT_NODELABEL(id), 1) ||
359#define STM32_DT_DEV_DOMAIN_CLOCK_SUPPORT \
360 (DT_FOREACH_STATUS_OKAY(STM32_DOMAIN_CLOCK_SUPPORT) 0)
369#define STM32_CLOCK_REG_GET(clock) \
370 (((clock) >> STM32_CLOCK_REG_SHIFT) & STM32_CLOCK_REG_MASK)
377#define STM32_CLOCK_SHIFT_GET(clock) \
378 (((clock) >> STM32_CLOCK_SHIFT_SHIFT) & STM32_CLOCK_SHIFT_MASK)
385#define STM32_CLOCK_MASK_GET(clock) \
386 (((clock) >> STM32_CLOCK_MASK_SHIFT) & STM32_CLOCK_MASK_MASK)
393#define STM32_CLOCK_VAL_GET(clock) \
394 (((clock) >> STM32_CLOCK_VAL_SHIFT) & STM32_CLOCK_VAL_MASK)
Public Clock Control APIs.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
Definition: stm32_clock_control.h:333
uint32_t bus
Definition: stm32_clock_control.h:334
uint32_t enr
Definition: stm32_clock_control.h:335