libopencm3
A free/libre/open-source firmware library for various ARM Cortex-M3 microcontrollers.
rcc.c
Go to the documentation of this file.
1/** @defgroup rcc_file RCC peripheral API
2 *
3 * @ingroup peripheral_apis
4 *
5 * @brief <b>libopencm3 STM32L0xx Reset and Clock Control</b>
6 *
7 * @version 1.0.0
8 *
9 * @date November 2014
10 *
11 * This library supports the Reset and Clock Control System in the STM32F0xx
12 * series of ARM Cortex Microcontrollers by ST Microelectronics.
13 *
14 * LGPL License Terms @ref lgpl_license
15 */
16/*
17 * This file is part of the libopencm3 project.
18 *
19 * Copyright (C) 2014 Karl Palsson <karlp@tweak.net.au>
20 *
21 * This library is free software: you can redistribute it and/or modify
22 * it under the terms of the GNU Lesser General Public License as published by
23 * the Free Software Foundation, either version 3 of the License, or
24 * (at your option) any later version.
25 *
26 * This library is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * GNU Lesser General Public License for more details.
30 *
31 * You should have received a copy of the GNU Lesser General Public License
32 * along with this library. If not, see <http://www.gnu.org/licenses/>.
33 */
34
35/**@{*/
36
41
42/* Set the default clock frequencies after reset. */
43uint32_t rcc_ahb_frequency = 2097000;
44uint32_t rcc_apb1_frequency = 2097000;
45uint32_t rcc_apb2_frequency = 2097000;
46
47void rcc_osc_on(enum rcc_osc osc)
48{
49 switch (osc) {
50 case RCC_PLL:
52 break;
53 case RCC_MSI:
55 break;
56 case RCC_HSE:
58 break;
59 case RCC_HSI48:
61 break;
62 case RCC_HSI16:
64 break;
65 case RCC_LSE:
67 break;
68 case RCC_LSI:
70 break;
71 }
72}
73
74void rcc_osc_off(enum rcc_osc osc)
75{
76 switch (osc) {
77 case RCC_PLL:
78 RCC_CR &= ~RCC_CR_PLLON;
79 break;
80 case RCC_MSI:
81 RCC_CR &= ~RCC_CR_MSION;
82 break;
83 case RCC_HSE:
84 RCC_CR &= ~RCC_CR_HSEON;
85 break;
86 case RCC_HSI48:
87 RCC_CRRCR &= ~RCC_CRRCR_HSI48ON;
88 break;
89 case RCC_HSI16:
90 RCC_CR &= ~RCC_CR_HSI16ON;
91 break;
92 case RCC_LSE:
93 RCC_CSR &= ~RCC_CSR_LSEON;
94 break;
95 case RCC_LSI:
96 RCC_CSR &= ~RCC_CSR_LSION;
97 break;
98 }
99}
100
101
102/*---------------------------------------------------------------------------*/
103/** @brief RCC Clear the Oscillator Ready Interrupt Flag
104 *
105 * Clear the interrupt flag that was set when a clock oscillator became ready
106 * to use.
107 *
108 * @param[in] osc Oscillator ID
109 */
111{
112 switch (osc) {
113 case RCC_PLL:
115 break;
116 case RCC_HSE:
118 break;
119 case RCC_HSI48:
121 break;
122 case RCC_HSI16:
124 break;
125 case RCC_MSI:
127 break;
128 case RCC_LSE:
130 break;
131 case RCC_LSI:
133 break;
134 }
135}
136
137/*---------------------------------------------------------------------------*/
138/** @brief RCC Enable the Oscillator Ready Interrupt
139 *
140 * @param[in] osc Oscillator ID
141 */
143{
144 switch (osc) {
145 case RCC_PLL:
147 break;
148 case RCC_HSE:
150 break;
151 case RCC_HSI48:
153 break;
154 case RCC_HSI16:
156 break;
157 case RCC_MSI:
159 break;
160 case RCC_LSE:
162 break;
163 case RCC_LSI:
165 break;
166 }
167}
168
169/*---------------------------------------------------------------------------*/
170/** @brief RCC Disable the Oscillator Ready Interrupt
171 *
172 * @param[in] osc Oscillator ID
173 */
175{
176 switch (osc) {
177 case RCC_PLL:
178 RCC_CIER &= ~RCC_CIER_PLLRDYIE;
179 break;
180 case RCC_HSE:
181 RCC_CIER &= ~RCC_CIER_HSERDYIE;
182 break;
183 case RCC_HSI48:
184 RCC_CIER &= ~RCC_CIER_HSI48RDYIE;
185 break;
186 case RCC_HSI16:
187 RCC_CIER &= ~RCC_CIER_HSI16RDYIE;
188 break;
189 case RCC_MSI:
190 RCC_CIER &= ~RCC_CIER_MSIRDYIE;
191 break;
192 case RCC_LSE:
193 RCC_CIER &= ~RCC_CIER_LSERDYIE;
194 break;
195 case RCC_LSI:
196 RCC_CIER &= ~RCC_CIER_LSIRDYIE;
197 break;
198 }
199}
200
201/*---------------------------------------------------------------------------*/
202/** @brief RCC Read the Oscillator Ready Interrupt Flag
203 *
204 * @param[in] osc Oscillator ID
205 * @returns int. Boolean value for flag set.
206 */
208{
209 switch (osc) {
210 case RCC_PLL:
211 return ((RCC_CIFR & RCC_CIFR_PLLRDYF) != 0);
212 break;
213 case RCC_HSE:
214 return ((RCC_CIFR & RCC_CIFR_HSERDYF) != 0);
215 break;
216 case RCC_HSI48:
217 return ((RCC_CIFR & RCC_CIFR_HSI48RDYF) != 0);
218 break;
219 case RCC_HSI16:
220 return ((RCC_CIFR & RCC_CIFR_HSI16RDYF) != 0);
221 break;
222 case RCC_MSI:
223 return ((RCC_CIFR & RCC_CIFR_MSIRDYF) != 0);
224 break;
225 case RCC_LSE:
226 return ((RCC_CIFR & RCC_CIFR_LSERDYF) != 0);
227 break;
228 case RCC_LSI:
229 return ((RCC_CIFR & RCC_CIFR_LSIRDYF) != 0);
230 break;
231 }
232
234}
235
236
238{
239 switch (osc) {
240 case RCC_PLL:
241 return RCC_CR & RCC_CR_PLLRDY;
242 case RCC_HSE:
243 return RCC_CR & RCC_CR_HSERDY;
244 case RCC_HSI16:
245 return RCC_CR & RCC_CR_HSI16RDY;
246 case RCC_HSI48:
248 case RCC_MSI:
249 return RCC_CR & RCC_CR_MSIRDY;
250 case RCC_LSE:
251 return RCC_CSR & RCC_CSR_LSERDY;
252 case RCC_LSI:
253 return RCC_CSR & RCC_CSR_LSIRDY;
254 }
255 return false;
256}
257
259{
260 while (!rcc_is_osc_ready(osc));
261}
262
263/*---------------------------------------------------------------------------*/
264/** @brief RCC Set HSI48 clock source to the RC48 (CRS)
265 */
267{
269}
270
271/*---------------------------------------------------------------------------*/
272/** @brief RCC Set HSI48 clock source to the PLL
273 */
275{
276 RCC_CCIPR &= ~RCC_CCIPR_HSI48SEL;
277}
278
279/*---------------------------------------------------------------------------*/
280/** @brief RCC Set the Source for the System Clock.
281 *
282 * @param[in] osc Oscillator ID. Only HSE, HSI16, MSI and PLL have effect.
283 */
284
286{
287 switch (osc) {
288 case RCC_PLL:
290 break;
291 case RCC_HSE:
292 RCC_CFGR = (RCC_CFGR & ~RCC_CFGR_SW_MASK) | RCC_CFGR_SW_HSE;
293 break;
294 case RCC_HSI16:
295 RCC_CFGR = (RCC_CFGR & ~RCC_CFGR_SW_MASK) | RCC_CFGR_SW_HSI16;
296 break;
297 case RCC_MSI:
298 RCC_CFGR = (RCC_CFGR & ~RCC_CFGR_SW_MASK) | RCC_CFGR_SW_MSI;
299 break;
300 case RCC_HSI48:
301 case RCC_LSE:
302 case RCC_LSI:
303 break;
304 }
305}
306
307/*---------------------------------------------------------------------------*/
308/** @brief RCC Set the PLL Multiplication Factor.
309 *
310 * @note This only has effect when the PLL is disabled.
311 *
312 * @param[in] factor PLL multiplication factor @ref rcc_cfgr_pmf
313 */
314
315void rcc_set_pll_multiplier(uint32_t factor)
316{
317 uint32_t reg = RCC_CFGR
319 RCC_CFGR = reg | (factor << RCC_CFGR_PLLMUL_SHIFT);
320}
321
322
323/*---------------------------------------------------------------------------*/
324/** @brief RCC Set the PLL Division Factor.
325 *
326 * @note This only has effect when the PLL is disabled.
327 *
328 * @param[in] factor PLL multiplication factor @ref rcc_cfgr_pdf
329 */
330
331void rcc_set_pll_divider(uint32_t factor)
332{
333 uint32_t reg = RCC_CFGR
335 RCC_CFGR = reg | (factor << RCC_CFGR_PLLDIV_SHIFT);
336}
337
338/**
339 * Set the pll source.
340 * @param pllsrc RCC_CFGR_PLLSRC_HSI16_CLK or RCC_CFGR_PLLSRC_HSE_CLK
341 */
342void rcc_set_pll_source(uint32_t pllsrc)
343{
344 uint32_t reg32;
345
346 reg32 = RCC_CFGR;
347 reg32 &= ~(RCC_CFGR_PLLSRC_HSE_CLK << 16);
348 RCC_CFGR = (reg32 | (pllsrc<<16));
349}
350
351/*---------------------------------------------------------------------------*/
352/** @brief RCC Set the APB1 Prescale Factor.
353 *
354 * @note The APB1 clock frequency must not exceed 32MHz.
355 *
356 * @param[in] ppre APB prescale factor @ref rcc_cfgr_apb1pre
357 */
358
359void rcc_set_ppre1(uint32_t ppre)
360{
361 uint32_t reg = RCC_CFGR
363 RCC_CFGR = reg | (ppre << RCC_CFGR_PPRE1_SHIFT);
364}
365
366/*---------------------------------------------------------------------------*/
367/** @brief RCC Set the APB2 Prescale Factor.
368 *
369 * @note The APB2 clock frequency must not exceed 32MHz.
370 *
371 * @param[in] ppre APB prescale factor @ref rcc_cfgr_apb2pre
372 */
373
374void rcc_set_ppre2(uint32_t ppre)
375{
376 uint32_t reg = RCC_CFGR
378 RCC_CFGR = reg | (ppre << RCC_CFGR_PPRE2_SHIFT);
379}
380
381/*---------------------------------------------------------------------------*/
382/** @brief RCC Set the AHB Prescale Factor.
383 *
384 * @param[in] hpre Unsigned int32. AHB prescale factor @ref rcc_cfgr_ahbpre
385 */
386
387void rcc_set_hpre(uint32_t hpre)
388{
389 uint32_t reg = RCC_CFGR & ~(RCC_CFGR_HPRE_MASK << RCC_CFGR_HPRE_SHIFT);
390 RCC_CFGR = reg | (hpre << RCC_CFGR_HPRE_SHIFT);
391}
392
393/*---------------------------------------------------------------------------*/
394/** @brief Set the range of the MSI oscillator
395*
396 * @param msi_range desired range @ref rcc_icscr_msirange
397 */
398void rcc_set_msi_range(uint32_t msi_range)
399{
401 RCC_ICSCR = reg32 | (msi_range << RCC_ICSCR_MSIRANGE_SHIFT);
402}
403
404/*---------------------------------------------------------------------------*/
405/** @brief Set the LPTIM1 clock source
406*
407 * @param lptim1_sel peripheral clock source @ref rcc_ccpipr_lptim1sel
408 */
409void rcc_set_lptim1_sel(uint32_t lptim1_sel)
410{
412 RCC_CCIPR |= (lptim1_sel << RCC_CCIPR_LPTIM1SEL_SHIFT);
413}
414
415
416/*---------------------------------------------------------------------------*/
417/** @brief Set the LPUART1 clock source
418*
419 * @param lpuart1_sel periphral clock source @ref rcc_ccpipr_lpuart1sel
420 */
421void rcc_set_lpuart1_sel(uint32_t lpuart1_sel)
422{
424 RCC_CCIPR |= (lpuart1_sel << RCC_CCIPR_LPTIM1SEL_SHIFT);
425}
426
427/*---------------------------------------------------------------------------*/
428/** @brief Set the USART1 clock source
429*
430 * @param usart1_sel periphral clock source @ref rcc_ccpipr_usart1sel
431 */
432void rcc_set_usart1_sel(uint32_t usart1_sel)
433{
435 RCC_CCIPR |= (usart1_sel << RCC_CCIPR_USART1SEL_SHIFT);
436}
437
438/*---------------------------------------------------------------------------*/
439/** @brief Set the USART2 clock source
440*
441 * @param usart2_sel periphral clock source @ref rcc_ccpipr_usartxsel
442 */
443void rcc_set_usart2_sel(uint32_t usart2_sel)
444{
446 RCC_CCIPR |= (usart2_sel << RCC_CCIPR_USART2SEL_SHIFT);
447}
448
449/*---------------------------------------------------------------------------*/
450/** @brief Set the peripheral clock source
451 * @param periph peripheral of desire, eg XXX_BASE
452 * @param sel peripheral clock source
453 */
454void rcc_set_peripheral_clk_sel(uint32_t periph, uint32_t sel)
455{
456 uint8_t shift;
457 uint32_t mask;
458
459 switch (periph) {
460 case LPTIM1_BASE:
463 break;
464
465 case I2C3_BASE:
468 break;
469
470 case I2C1_BASE:
473 break;
474
475 case LPUART1_BASE:
478 break;
479
480 case USART2_BASE:
483 break;
484
485 case USART1_BASE:
488 break;
489
490 default:
491 return;
492 }
493
494 uint32_t reg32 = RCC_CCIPR & ~(mask << shift);
495 RCC_CCIPR = reg32 | (sel << shift);
496}
497
498
499/* Helper to calculate the frequency of a clksel based clock. */
500static uint32_t rcc_uart_i2c_clksel_freq_hz(uint32_t apb_clk, uint8_t shift) {
501 uint8_t clksel = (RCC_CCIPR >> shift) & RCC_CCIPR_I2CxSEL_MASK;
502 uint8_t hpre = (RCC_CFGR >> RCC_CFGR_HPRE_SHIFT) & RCC_CFGR_HPRE_MASK;
503 switch (clksel) {
505 return apb_clk;
509 return 16000000U;
510 }
512}
513
514/*---------------------------------------------------------------------------*/
515/** @brief Get the peripheral clock speed for the USART at base specified.
516 * @param usart Base address of USART to get clock frequency for.
517 */
518uint32_t rcc_get_usart_clk_freq(uint32_t usart)
519{
520 if (usart == LPUART1_BASE) {
522 } else if (usart == USART1_BASE) {
524 } else {
526 }
527}
528
529/*---------------------------------------------------------------------------*/
530/** @brief Get the peripheral clock speed for the Timer at base specified.
531 * @param timer Base address of TIM to get clock frequency for.
532 */
533uint32_t rcc_get_timer_clk_freq(uint32_t timer)
534{
535 /* Handle APB1 timers, and apply multiplier if necessary. */
536 if (timer >= TIM2_BASE && timer <= TIM7_BASE) {
538 return (ppre1 == RCC_CFGR_PPRE1_NODIV) ? rcc_apb1_frequency
539 : 2 * rcc_apb1_frequency;
540 } else {
542 return (ppre2 == RCC_CFGR_PPRE2_NODIV) ? rcc_apb2_frequency
543 : 2 * rcc_apb2_frequency;
544 }
545
546}
547
548/*---------------------------------------------------------------------------*/
549/** @brief Get the peripheral clock speed for the I2C device at base specified.
550 * @param i2c Base address of I2C to get clock frequency for.
551 */
552uint32_t rcc_get_i2c_clk_freq(uint32_t i2c)
553{
554 if (i2c == I2C1_BASE) {
556 } else if (i2c == I2C3_BASE) {
558 } else {
559 return rcc_apb1_frequency;
560 }
561}
562
563/*---------------------------------------------------------------------------*/
564/** @brief Get the peripheral clock speed for the SPI device at base specified.
565 * @param spi Base address of SPI device to get clock frequency for (e.g. SPI1_BASE).
566 */
567uint32_t rcc_get_spi_clk_freq(uint32_t spi) {
568 if (spi == SPI1_BASE) {
569 return rcc_apb2_frequency;
570 } else {
571 return rcc_apb1_frequency;
572 }
573}
574
575/** @brief RCC Setup PLL and use it as Sysclk source.
576 *
577 * @param[in] clock full struct with desired parameters
578 *
579 */
580void rcc_clock_setup_pll(const struct rcc_clock_scale *clock)
581{
582 /* Turn on the appropriate source for the PLL */
583 if (clock->pll_source == RCC_CFGR_PLLSRC_HSE_CLK) {
586 } else {
589 }
590
591 rcc_set_hpre(clock->hpre);
592 rcc_set_ppre1(clock->ppre1);
593 rcc_set_ppre2(clock->ppre2);
594
597
599 while (rcc_is_osc_ready(RCC_PLL));
600
603
604 /* Set up the PLL */
608
612
613 /* Set the peripheral clock frequencies used. */
617}
618
619/**@}*/
#define cm3_assert_not_reached()
Check if unreachable code is reached.
Definition: assert.h:102
void flash_prefetch_enable(void)
This buffer is used for instruction fetches and may or may not be enabled by default,...
void flash_set_ws(uint32_t ws)
Set the Number of Wait States.
void pwr_set_vos_scale(enum pwr_vos_scale scale)
Definition: pwr_common_v2.c:29
#define RCC_CCIPR_I2C1SEL_SHIFT
Definition: l0/rcc.h:460
#define RCC_CCIPR_I2C3SEL_SHIFT
Definition: l0/rcc.h:459
#define RCC_CCIPR_USART1SEL_SHIFT
Definition: l0/rcc.h:486
#define RCC_CCIPR_LPUART1SEL_SHIFT
Definition: l0/rcc.h:484
#define RCC_CCIPR_USART2SEL_SHIFT
Definition: l0/rcc.h:485
#define RCC_CCIPR_USARTxSEL_PCLK
Definition: l0/rcc.h:466
#define RCC_CCIPR_USARTxSEL_SYSCLK
Definition: l0/rcc.h:467
#define RCC_CCIPR_USARTxSEL_HSI
Definition: l0/rcc.h:468
#define RCC_CFGR_PPRE2_NODIV
Definition: l0/rcc.h:229
#define RCC_CFGR_PPRE1_NODIV
Definition: l0/rcc.h:235
#define RCC_CR_HSI16RDY
Definition: l0/rcc.h:89
#define RCC_ICSCR_MSIRANGE_SHIFT
Definition: l0/rcc.h:101
#define RCC_CFGR_PPRE1_MASK
Definition: l0/rcc.h:180
#define RCC_CIFR_LSERDYF
Definition: l0/rcc.h:263
#define RCC_CFGR_PPRE2_SHIFT
Definition: l0/rcc.h:177
#define RCC_CFGR_PLLSRC_HSE_CLK
Definition: l0/rcc.h:171
#define RCC_CRRCR_HSI48ON
Definition: l0/rcc.h:121
#define RCC_CICR_HSI16RDYC
Definition: l0/rcc.h:274
#define RCC_CIFR_HSI48RDYF
Definition: l0/rcc.h:258
#define RCC_CICR
Definition: l0/rcc.h:55
#define RCC_CIFR_PLLRDYF
Definition: l0/rcc.h:260
#define RCC_CR
Definition: l0/rcc.h:49
#define RCC_ICSCR
Definition: l0/rcc.h:50
#define RCC_CICR_PLLRDYC
Definition: l0/rcc.h:272
#define RCC_CFGR_PPRE2_MASK
Definition: l0/rcc.h:178
#define RCC_CIFR_MSIRDYF
Definition: l0/rcc.h:259
#define RCC_CFGR_PLLDIV_MASK
Definition: l0/rcc.h:152
#define RCC_CFGR_HPRE_MASK
Definition: l0/rcc.h:205
#define RCC_CIFR
Definition: l0/rcc.h:54
#define RCC_CICR_LSIRDYC
Definition: l0/rcc.h:276
#define RCC_CCIPR_I2CxSEL_MASK
Definition: l0/rcc.h:453
#define RCC_CIER_HSI16RDYIE
Definition: l0/rcc.h:250
#define RCC_CCIPR
Definition: l0/rcc.h:68
#define RCC_CICR_LSERDYC
Definition: l0/rcc.h:275
#define RCC_CIFR_HSERDYF
Definition: l0/rcc.h:261
#define RCC_CCIPR_HSI48SEL
Definition: l0/rcc.h:437
rcc_osc
Definition: l0/rcc.h:548
#define RCC_CIER_HSI48RDYIE
Definition: l0/rcc.h:246
#define RCC_CSR
Definition: l0/rcc.h:69
#define RCC_CICR_HSI48RDYC
Definition: l0/rcc.h:270
#define RCC_CIER_LSERDYIE
Definition: l0/rcc.h:251
#define RCC_CCIPR_LPTIM1SEL_MASK
Definition: l0/rcc.h:444
#define RCC_CSR_LSION
Definition: l0/rcc.h:523
#define RCC_CFGR_PLLDIV_SHIFT
Definition: l0/rcc.h:151
#define RCC_CCIPR_USARTxSEL_MASK
Definition: l0/rcc.h:478
#define RCC_CCIPR_LPTIM1SEL_SHIFT
Definition: l0/rcc.h:443
#define RCC_CR_HSERDY
Definition: l0/rcc.h:83
#define RCC_CFGR_SW_PLL
Definition: l0/rcc.h:220
#define RCC_CIER
Definition: l0/rcc.h:53
#define RCC_CFGR
Definition: l0/rcc.h:52
void rcc_periph_clock_enable(enum rcc_periph_clken clken)
Enable Peripheral Clock in running mode.
#define RCC_CICR_MSIRDYC
Definition: l0/rcc.h:271
#define RCC_CICR_HSERDYC
Definition: l0/rcc.h:273
#define RCC_CCIPR_LPUARTxSEL_MASK
Definition: l0/rcc.h:477
#define RCC_CIER_MSIRDYIE
Definition: l0/rcc.h:247
#define RCC_CFGR_SW_HSI16
Definition: l0/rcc.h:218
#define RCC_CSR_LSIRDY
Definition: l0/rcc.h:522
#define RCC_CFGR_PLLMUL_SHIFT
Definition: l0/rcc.h:166
#define RCC_CRRCR_HSI48RDY
Definition: l0/rcc.h:120
#define RCC_CFGR_HPRE_SHIFT
Definition: l0/rcc.h:206
#define RCC_CRRCR
Definition: l0/rcc.h:51
#define RCC_CFGR_PLLMUL_MASK
Definition: l0/rcc.h:167
#define RCC_CR_MSIRDY
Definition: l0/rcc.h:85
#define RCC_CSR_LSEON
Definition: l0/rcc.h:521
#define RCC_CIER_LSIRDYIE
Definition: l0/rcc.h:252
#define RCC_CR_HSI16ON
Definition: l0/rcc.h:91
#define RCC_CIFR_HSI16RDYF
Definition: l0/rcc.h:262
#define RCC_CR_PLLON
Definition: l0/rcc.h:74
#define RCC_CIFR_LSIRDYF
Definition: l0/rcc.h:264
#define RCC_CIER_PLLRDYIE
Definition: l0/rcc.h:248
#define RCC_CR_HSEON
Definition: l0/rcc.h:84
#define RCC_CIER_HSERDYIE
Definition: l0/rcc.h:249
#define RCC_CR_MSION
Definition: l0/rcc.h:86
#define RCC_CSR_LSERDY
Definition: l0/rcc.h:520
#define RCC_ICSCR_MSIRANGE_MASK
Definition: l0/rcc.h:102
#define RCC_CFGR_SW_MSI
Definition: l0/rcc.h:217
#define RCC_CR_PLLRDY
Definition: l0/rcc.h:73
#define RCC_CFGR_SW_HSE
Definition: l0/rcc.h:219
#define RCC_CFGR_PPRE1_SHIFT
Definition: l0/rcc.h:179
uint16_t rcc_get_div_from_hpre(uint8_t div_val)
This will return the divisor 1/2/4/8/16/64/128/256/512 which is set as a 4-bit value,...
@ RCC_PWR
Definition: l0/rcc.h:598
@ RCC_HSI48
Definition: l0/rcc.h:549
@ RCC_LSI
Definition: l0/rcc.h:549
@ RCC_PLL
Definition: l0/rcc.h:549
@ RCC_MSI
Definition: l0/rcc.h:549
@ RCC_LSE
Definition: l0/rcc.h:549
@ RCC_HSE
Definition: l0/rcc.h:549
@ RCC_HSI16
Definition: l0/rcc.h:549
void rcc_set_pll_divider(uint32_t factor)
RCC Set the PLL Division Factor.
Definition: rcc.c:331
int rcc_osc_ready_int_flag(enum rcc_osc osc)
RCC Read the Oscillator Ready Interrupt Flag.
Definition: rcc.c:207
void rcc_set_msi_range(uint32_t msi_range)
Set the range of the MSI oscillator.
Definition: rcc.c:398
void rcc_set_lpuart1_sel(uint32_t lpuart1_sel)
Set the LPUART1 clock source.
Definition: rcc.c:421
void rcc_osc_ready_int_clear(enum rcc_osc osc)
RCC Clear the Oscillator Ready Interrupt Flag.
Definition: rcc.c:110
void rcc_wait_for_osc_ready(enum rcc_osc osc)
Wait for Oscillator Ready.
Definition: rcc.c:258
static uint32_t rcc_uart_i2c_clksel_freq_hz(uint32_t apb_clk, uint8_t shift)
Definition: rcc.c:500
bool rcc_is_osc_ready(enum rcc_osc osc)
Is the given oscillator ready?
Definition: rcc.c:237
uint32_t rcc_get_spi_clk_freq(uint32_t spi)
Get the peripheral clock speed for the SPI device at base specified.
Definition: rcc.c:567
uint32_t rcc_apb2_frequency
Definition: rcc.c:45
void rcc_set_pll_source(uint32_t pllsrc)
Set the pll source.
Definition: rcc.c:342
uint32_t rcc_get_timer_clk_freq(uint32_t timer)
Get the peripheral clock speed for the Timer at base specified.
Definition: rcc.c:533
uint32_t rcc_get_usart_clk_freq(uint32_t usart)
Get the peripheral clock speed for the USART at base specified.
Definition: rcc.c:518
void rcc_clock_setup_pll(const struct rcc_clock_scale *clock)
RCC Setup PLL and use it as Sysclk source.
Definition: rcc.c:580
void rcc_osc_ready_int_enable(enum rcc_osc osc)
RCC Enable the Oscillator Ready Interrupt.
Definition: rcc.c:142
void rcc_set_usart1_sel(uint32_t usart1_sel)
Set the USART1 clock source.
Definition: rcc.c:432
void rcc_set_usart2_sel(uint32_t usart2_sel)
Set the USART2 clock source.
Definition: rcc.c:443
void rcc_set_hsi48_source_pll(void)
RCC Set HSI48 clock source to the PLL.
Definition: rcc.c:274
void rcc_set_peripheral_clk_sel(uint32_t periph, uint32_t sel)
Set the peripheral clock source.
Definition: rcc.c:454
void rcc_osc_ready_int_disable(enum rcc_osc osc)
RCC Disable the Oscillator Ready Interrupt.
Definition: rcc.c:174
void rcc_osc_on(enum rcc_osc osc)
Definition: rcc.c:47
uint32_t rcc_ahb_frequency
Definition: rcc.c:43
void rcc_osc_off(enum rcc_osc osc)
Definition: rcc.c:74
uint32_t rcc_get_i2c_clk_freq(uint32_t i2c)
Get the peripheral clock speed for the I2C device at base specified.
Definition: rcc.c:552
uint32_t rcc_apb1_frequency
Definition: rcc.c:44
void rcc_set_lptim1_sel(uint32_t lptim1_sel)
Set the LPTIM1 clock source.
Definition: rcc.c:409
void rcc_set_ppre2(uint32_t ppre)
RCC Set the APB2 Prescale Factor.
Definition: rcc.c:374
void rcc_set_hsi48_source_rc48(void)
RCC Set HSI48 clock source to the RC48 (CRS)
Definition: rcc.c:266
void rcc_set_hpre(uint32_t hpre)
RCC Set the AHB Prescale Factor.
Definition: rcc.c:387
void rcc_set_ppre1(uint32_t ppre)
RCC Set the APB1 Prescale Factor.
Definition: rcc.c:359
void rcc_set_pll_multiplier(uint32_t factor)
RCC Set the PLL Multiplication Factor.
Definition: rcc.c:315
void rcc_set_sysclk_source(enum rcc_osc osc)
RCC Set the Source for the System Clock.
Definition: rcc.c:285
#define TIM2_BASE
#define LPTIM1_BASE
#define TIM7_BASE
#define LPUART1_BASE
#define I2C3_BASE
#define SPI1_BASE
#define USART1_BASE
#define I2C1_BASE
#define USART2_BASE
uint8_t ppre1
Definition: l0/rcc.h:532
uint8_t flash_waitstates
Definition: l0/rcc.h:529
uint8_t ppre2
Definition: l0/rcc.h:533
uint32_t apb1_frequency
Definition: l0/rcc.h:536
uint8_t pll_mul
Definition: l0/rcc.h:526
uint32_t ahb_frequency
Definition: l0/rcc.h:535
enum pwr_vos_scale voltage_scale
Definition: l0/rcc.h:530
uint16_t pll_div
Definition: l0/rcc.h:527
uint8_t hpre
Definition: l0/rcc.h:531
uint32_t apb2_frequency
Definition: l0/rcc.h:537
uint8_t pll_source
Definition: l0/rcc.h:528