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 STM32F3xx Reset and Clock Control</b>
6 *
7 * @version 1.0.0
8 *
9 * @date 11 July 2013
10 *
11 * LGPL License Terms @ref lgpl_license
12 */
13/*
14 * This file is part of the libopencm3 project.
15 *
16 * Copyright (C) 2009 Federico Ruiz-Ugalde <memeruiz at gmail dot com>
17 * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
18 * Copyright (C) 2010 Thomas Otto <tommi@viadmin.org>
19 * Modified by 2013 Fernando Cortes <fernando.corcam@gmail.com> (stm32f3)
20 * Modified by 2013 Guillermo Rivera <memogrg@gmail.com> (stm32f3)
21 *
22 * This library is free software: you can redistribute it and/or modify
23 * it under the terms of the GNU Lesser General Public License as published by
24 * the Free Software Foundation, either version 3 of the License, or
25 * (at your option) any later version.
26 *
27 * This library is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 *
32 * You should have received a copy of the GNU Lesser General Public License
33 * along with this library. If not, see <http://www.gnu.org/licenses/>.
34 */
35/**@{*/
36
41
42/* Set the default clock frequencies after reset. */
43uint32_t rcc_ahb_frequency = 8000000;
44uint32_t rcc_apb1_frequency = 8000000;
45uint32_t rcc_apb2_frequency = 8000000;
46
48 { /* 48MHz */
51 .hpre = RCC_CFGR_HPRE_NODIV,
52 .ppre1 = RCC_CFGR_PPRE_DIV2,
53 .ppre2 = RCC_CFGR_PPRE_NODIV,
54 .flash_waitstates = 1,
55 .ahb_frequency = 48000000,
56 .apb1_frequency = 24000000,
57 .apb2_frequency = 48000000,
58 },
59 { /* 64MHz */
60 .pllmul = RCC_CFGR_PLLMUL_MUL16,
62 .hpre = RCC_CFGR_HPRE_NODIV,
63 .ppre1 = RCC_CFGR_PPRE_DIV2,
64 .ppre2 = RCC_CFGR_PPRE_NODIV,
65 .flash_waitstates = 2,
66 .ahb_frequency = 64000000,
67 .apb1_frequency = 32000000,
68 .apb2_frequency = 64000000,
69 }
70};
71
73 {
75 .pllmul = RCC_CFGR_PLLMUL_MUL9,
76 .plldiv = RCC_CFGR2_PREDIV_NODIV,
77 .usbdiv1 = false,
78 .flash_waitstates = 2,
79 .hpre = RCC_CFGR_HPRE_NODIV,
80 .ppre1 = RCC_CFGR_PPRE_DIV2,
81 .ppre2 = RCC_CFGR_PPRE_NODIV,
82 .ahb_frequency = 72e6,
83 .apb1_frequency = 36e6,
84 .apb2_frequency = 72e6,
85 }
86};
87
89{
90 switch (osc) {
91 case RCC_PLL:
93 break;
94 case RCC_HSE:
96 break;
97 case RCC_HSI:
99 break;
100 case RCC_LSE:
102 break;
103 case RCC_LSI:
105 break;
106 }
107}
108
110{
111 switch (osc) {
112 case RCC_PLL:
114 break;
115 case RCC_HSE:
117 break;
118 case RCC_HSI:
120 break;
121 case RCC_LSE:
123 break;
124 case RCC_LSI:
126 break;
127 }
128}
129
131{
132 switch (osc) {
133 case RCC_PLL:
134 RCC_CIR &= ~RCC_CIR_PLLRDYIE;
135 break;
136 case RCC_HSE:
137 RCC_CIR &= ~RCC_CIR_HSERDYIE;
138 break;
139 case RCC_HSI:
140 RCC_CIR &= ~RCC_CIR_HSIRDYIE;
141 break;
142 case RCC_LSE:
143 RCC_CIR &= ~RCC_CIR_LSERDYIE;
144 break;
145 case RCC_LSI:
146 RCC_CIR &= ~RCC_CIR_LSIRDYIE;
147 break;
148 }
149}
150
152{
153 switch (osc) {
154 case RCC_PLL:
155 return ((RCC_CIR & RCC_CIR_PLLRDYF) != 0);
156 break;
157 case RCC_HSE:
158 return ((RCC_CIR & RCC_CIR_HSERDYF) != 0);
159 break;
160 case RCC_HSI:
161 return ((RCC_CIR & RCC_CIR_HSIRDYF) != 0);
162 break;
163 case RCC_LSE:
164 return ((RCC_CIR & RCC_CIR_LSERDYF) != 0);
165 break;
166 case RCC_LSI:
167 return ((RCC_CIR & RCC_CIR_LSIRDYF) != 0);
168 break;
169 }
170
172}
173
175{
177}
178
180{
181 return ((RCC_CIR & RCC_CIR_CSSF) != 0);
182}
183
185{
186 switch (osc) {
187 case RCC_PLL:
188 return RCC_CR & RCC_CR_PLLRDY;
189 case RCC_HSE:
190 return RCC_CR & RCC_CR_HSERDY;
191 case RCC_HSI:
192 return RCC_CR & RCC_CR_HSIRDY;
193 case RCC_LSE:
194 return RCC_BDCR & RCC_BDCR_LSERDY;
195 case RCC_LSI:
196 return RCC_CSR & RCC_CSR_LSIRDY;
197 }
198 return false;
199}
200
202{
203 while (!rcc_is_osc_ready(osc));
204}
205
206
208{
209 while (rcc_is_osc_ready(osc));
210}
211
213{
214 switch (osc) {
215 case RCC_PLL:
218 break;
219 case RCC_HSE:
222 break;
223 case RCC_HSI:
226 break;
227 default:
228 /* Shouldn't be reached. */
229 break;
230 }
231}
232
233void rcc_osc_on(enum rcc_osc osc)
234{
235 switch (osc) {
236 case RCC_PLL:
238 break;
239 case RCC_HSE:
241 break;
242 case RCC_HSI:
244 break;
245 case RCC_LSE:
247 break;
248 case RCC_LSI:
250 break;
251 }
252}
253
254void rcc_osc_off(enum rcc_osc osc)
255{
256 switch (osc) {
257 case RCC_PLL:
258 RCC_CR &= ~RCC_CR_PLLON;
259 break;
260 case RCC_HSE:
261 RCC_CR &= ~RCC_CR_HSEON;
262 break;
263 case RCC_HSI:
264 RCC_CR &= ~RCC_CR_HSION;
265 break;
266 case RCC_LSE:
267 RCC_BDCR &= ~RCC_BDCR_LSEON;
268 break;
269 case RCC_LSI:
270 RCC_CSR &= ~RCC_CSR_LSION;
271 break;
272 }
273}
274
276{
278}
279
281{
282 RCC_CR &= ~RCC_CR_CSSON;
283}
284
285void rcc_set_sysclk_source(uint32_t clk)
286{
287 uint32_t reg32;
288
289 reg32 = RCC_CFGR;
290 reg32 &= ~((1 << 1) | (1 << 0));
291 RCC_CFGR = (reg32 | clk);
292}
293
295{
296 uint32_t reg32;
297
298 reg32 = RCC_CFGR;
299 reg32 &= ~RCC_CFGR_PLLSRC;
300 RCC_CFGR = (reg32 | (pllsrc << 16));
301}
302
303void rcc_set_ppre2(uint32_t ppre2)
304{
305 uint32_t reg32;
306
307 reg32 = RCC_CFGR;
309 RCC_CFGR = (reg32 | (ppre2 << RCC_CFGR_PPRE2_SHIFT));
310}
311
312void rcc_set_ppre1(uint32_t ppre1)
313{
314 uint32_t reg32;
315
316 reg32 = RCC_CFGR;
318 RCC_CFGR = (reg32 | (ppre1 << RCC_CFGR_PPRE1_SHIFT));
319}
320
321void rcc_set_hpre(uint32_t hpre)
322{
323 uint32_t reg32;
324
325 reg32 = RCC_CFGR;
327 RCC_CFGR = (reg32 | (hpre << RCC_CFGR_HPRE_SHIFT));
328}
329
330/**
331 * Set PLL Source pre-divider **CAUTION**.
332 * On some F3 devices, prediv only applies to HSE source. On others,
333 * this is _after_ source selection. See also f0.
334 * @param[in] prediv division by prediv+1 @ref rcc_cfgr2_prediv
335 */
336void rcc_set_prediv(uint32_t prediv)
337{
338 RCC_CFGR2 = (RCC_CFGR2 & ~RCC_CFGR2_PREDIV) | prediv;
339}
340
341void rcc_set_pll_multiplier(uint32_t pll)
342{
343 uint32_t reg32;
344
345 reg32 = RCC_CFGR;
347 RCC_CFGR = (reg32 | (pll << RCC_CFGR_PLLMUL_SHIFT));
348}
349
350
352{
353 /* Return the clock source which is used as system clock. */
354 return (RCC_CFGR & 0x000c) >> 2;
355}
356
357/**
358 * Setup clocks to run from PLL.
359 * The arguments provide the pll source, multipliers, dividers, all that's
360 * needed to establish a system clock.
361 * @param clock clock information structure
362 */
363void rcc_clock_setup_pll(const struct rcc_clock_scale *clock)
364{
365 if (clock->pllsrc == RCC_CFGR_PLLSRC_HSE_PREDIV) {
368 } else {
371 }
374 if (clock->usbdiv1) {
376 }
380 rcc_set_prediv(clock->plldiv);
381 /* Enable PLL oscillator and wait for it to stabilize. */
384
385 /* Configure flash settings. */
388
389 rcc_set_hpre(clock->hpre);
390 rcc_set_ppre2(clock->ppre2);
391 rcc_set_ppre1(clock->ppre1);
392 /* Select PLL as SYSCLK source. */
394 /* Wait for PLL clock to be selected. */
396
397 /* Set the peripheral clock frequencies used. */
401}
402
403
404void __attribute__((deprecated)) rcc_clock_setup_hsi(const struct rcc_clock_scale *clock)
405{
406 /* Enable internal high-speed oscillator. */
409 /* Select HSI as SYSCLK source. */
410 rcc_set_sysclk_source(RCC_CFGR_SW_HSI); /* XXX: se cayo */
412
417 /* Enable PLL oscillator and wait for it to stabilize. */
420 /*
421 * Set prescalers for AHB, ADC, APB1, APB2.
422 * Do this before touching the PLL (TODO: why?).
423 */
424 rcc_set_hpre(clock->hpre);
425 rcc_set_ppre2(clock->ppre2);
426 rcc_set_ppre1(clock->ppre1);
427 /* Configure flash settings. */
429 /* Select PLL as SYSCLK source. */
430 rcc_set_sysclk_source(RCC_CFGR_SW_PLL); /* XXX: se cayo */
431 /* Wait for PLL clock to be selected. */
433
434 /* Set the peripheral clock frequencies used. */
438}
439
440
442{
443 /* Set the backup domain software reset. */
445
446 /* Clear the backup domain software reset. */
447 RCC_BDCR &= ~RCC_BDCR_BDRST;
448}
449
450void rcc_set_i2c_clock_hsi(uint32_t i2c)
451{
452 if (i2c == I2C1) {
453 RCC_CFGR3 &= ~RCC_CFGR3_I2C1SW;
454 }
455 if (i2c == I2C2) {
456 RCC_CFGR3 &= ~RCC_CFGR3_I2C2SW;
457 }
458}
459
460void rcc_set_i2c_clock_sysclk(uint32_t i2c)
461{
462 if (i2c == I2C1) {
464 }
465 if (i2c == I2C2) {
467 }
468}
469
470uint32_t rcc_get_i2c_clocks(void)
471{
473}
474
476{
477 RCC_CFGR &= ~RCC_CFGR_USBPRES;
478}
479
481{
483}
484
485void rcc_adc_prescale(uint32_t prescale1, uint32_t prescale2)
486{
487 uint32_t clear_mask = (RCC_CFGR2_ADCxPRES_MASK
491 uint32_t set = (prescale1 << RCC_CFGR2_ADC12PRES_SHIFT) |
492 (prescale2 << RCC_CFGR2_ADC34PRES_SHIFT);
493 RCC_CFGR2 &= ~(clear_mask);
494 RCC_CFGR2 |= (set);
495}
496
497static uint32_t rcc_get_usart_clksel_freq(uint32_t apb_clk, uint8_t shift) {
498 uint8_t clksel = (RCC_CFGR3 >> shift) & RCC_CFGR3_UARTxSW_MASK;
500 switch (clksel) {
502 return apb_clk;
506 return 32768;
508 return 8000000U;
509 }
511}
512
513/*---------------------------------------------------------------------------*/
514/** @brief Get the peripheral clock speed for the USART at base specified.
515 * @param usart Base address of USART to get clock frequency for.
516 */
517uint32_t rcc_get_usart_clk_freq(uint32_t usart)
518{
519 /* Handle values with selectable clocks. */
520 if (usart == USART1_BASE) {
522 } else if (usart == USART2_BASE) {
524 } else if (usart == USART3_BASE) {
526 } else if (usart == UART4_BASE) {
528 } else { /* UART5 */
530 }
531}
532
533/*---------------------------------------------------------------------------*/
534/** @brief Get the peripheral clock speed for the Timer at base specified.
535 * @param timer Base address of TIM to get clock frequency for.
536 */
537uint32_t rcc_get_timer_clk_freq(uint32_t timer)
538{
539 /* Handle APB1 timer clocks. */
540 if (timer >= TIM2_BASE && timer <= TIM7_BASE) {
543 : 2 * rcc_apb1_frequency;
544 } else {
547 : 2 * rcc_apb2_frequency;
548 }
549}
550
551/*---------------------------------------------------------------------------*/
552/** @brief Get the peripheral clock speed for the I2C device at base specified.
553 * @param i2c Base address of I2C to get clock frequency for.
554 */
555uint32_t rcc_get_i2c_clk_freq(uint32_t i2c)
556{
557 if (i2c == I2C1_BASE) {
561 } else {
562 return 8000000U;
563 }
564 } else {
565 return rcc_apb1_frequency;
566 }
567}
568
569/*---------------------------------------------------------------------------*/
570/** @brief Get the peripheral clock speed for the SPI device at base specified.
571 * @param spi Base address of SPI device to get clock frequency for (e.g. SPI1_BASE).
572 */
573uint32_t rcc_get_spi_clk_freq(uint32_t spi) {
574 if (spi == SPI1_BASE || spi == SPI4_BASE) {
575 return rcc_apb2_frequency;
576 } else {
577 return rcc_apb1_frequency;
578 }
579}
580/**@}*/
581
#define RCC_BDCR_LSEON
Definition: f3/rcc.h:332
#define RCC_CFGR2_ADC12PRES_SHIFT
Definition: f3/rcc.h:366
#define RCC_CIR_PLLRDYF
Definition: f3/rcc.h:221
#define RCC_CIR
Definition: f3/rcc.h:60
#define RCC_CIR_HSERDYF
Definition: f3/rcc.h:222
#define RCC_CFGR_PPRE1_MASK
Definition: f3/rcc.h:130
#define RCC_CIR_LSERDYC
Definition: f3/rcc.h:207
#define RCC_CFGR_PPRE2_SHIFT
Definition: f3/rcc.h:127
#define RCC_CIR_PLLRDYIE
Definition: f3/rcc.h:211
#define RCC_CIR_PLLRDYC
Definition: f3/rcc.h:204
#define RCC_CFGR3_UARTxSW_MASK
Definition: f3/rcc.h:429
#define RCC_BDCR_BDRST
Definition: f3/rcc.h:326
#define RCC_CFGR_SWS_PLL
Definition: f3/rcc.h:162
#define RCC_CR
Definition: f3/rcc.h:58
#define RCC_CFGR_PPRE2_MASK
Definition: f3/rcc.h:128
#define RCC_CFGR_HPRE_MASK
Definition: f3/rcc.h:143
#define RCC_CFGR_SWS_MASK
Definition: f3/rcc.h:159
#define RCC_CIR_CSSC
Definition: f3/rcc.h:201
#define RCC_CFGR_PLLMUL_MUL16
Definition: f3/rcc.h:125
#define RCC_CIR_HSERDYIE
Definition: f3/rcc.h:212
#define RCC_CFGR_PLLSRC_HSE_PREDIV
Definition: f3/rcc.h:106
#define RCC_CFGR2
Definition: f3/rcc.h:69
#define RCC_CFGR_SWS_HSI
Definition: f3/rcc.h:160
rcc_osc
Definition: f3/rcc.h:468
@ RCC_HSI
Definition: f3/rcc.h:469
@ RCC_LSI
Definition: f3/rcc.h:469
@ RCC_PLL
Definition: f3/rcc.h:469
@ RCC_LSE
Definition: f3/rcc.h:469
@ RCC_HSE
Definition: f3/rcc.h:469
#define RCC_CFGR3
Definition: f3/rcc.h:70
#define RCC_CIR_LSERDYIE
Definition: f3/rcc.h:214
#define RCC_CSR
Definition: f3/rcc.h:67
#define RCC_CSR_LSION
Definition: f3/rcc.h:345
#define RCC_CR_HSERDY
Definition: f3/rcc.h:78
#define RCC_CIR_LSIRDYIE
Definition: f3/rcc.h:215
#define RCC_CFGR_SW_PLL
Definition: f3/rcc.h:168
#define RCC_CFGR
Definition: f3/rcc.h:59
#define RCC_CIR_HSERDYC
Definition: f3/rcc.h:205
#define RCC_CIR_LSIRDYC
Definition: f3/rcc.h:208
#define RCC_CR_HSIRDY
Definition: f3/rcc.h:82
#define RCC_CFGR3_I2C2SW
Definition: f3/rcc.h:406
#define RCC_CFGR_PLLMUL_MUL12
Definition: f3/rcc.h:121
#define RCC_CFGR_SWS_SHIFT
Definition: f3/rcc.h:158
#define RCC_BDCR_LSERDY
Definition: f3/rcc.h:331
#define RCC_CSR_LSIRDY
Definition: f3/rcc.h:344
#define RCC_CFGR_PLLMUL_SHIFT
Definition: f3/rcc.h:109
#define RCC_BDCR
Definition: f3/rcc.h:66
#define RCC_CFGR_HPRE_SHIFT
Definition: f3/rcc.h:142
#define RCC_CFGR_PLLSRC_HSI_DIV2
Definition: f3/rcc.h:105
#define RCC_CIR_LSERDYF
Definition: f3/rcc.h:224
#define RCC_CFGR_PLLMUL_MASK
Definition: f3/rcc.h:110
#define RCC_CIR_HSIRDYIE
Definition: f3/rcc.h:213
#define RCC_CIR_LSIRDYF
Definition: f3/rcc.h:225
#define RCC_CFGR_SW_HSI
Definition: f3/rcc.h:166
#define RCC_CR_CSSON
Definition: f3/rcc.h:76
#define RCC_CR_PLLON
Definition: f3/rcc.h:75
#define RCC_CIR_HSIRDYC
Definition: f3/rcc.h:206
#define RCC_CIR_HSIRDYF
Definition: f3/rcc.h:223
#define RCC_CFGR_USBPRES
Definition: f3/rcc.h:88
#define RCC_CIR_CSSF
Definition: f3/rcc.h:218
#define RCC_CR_HSEON
Definition: f3/rcc.h:79
#define RCC_CFGR_SWS_HSE
Definition: f3/rcc.h:161
#define RCC_CFGR2_ADCxPRES_MASK
Definition: f3/rcc.h:367
#define RCC_CFGR_PLLMUL_MUL9
Definition: f3/rcc.h:118
#define RCC_CFGR2_ADC34PRES_SHIFT
Definition: f3/rcc.h:365
#define RCC_CFGR3_I2C1SW
Definition: f3/rcc.h:407
#define RCC_CR_HSION
Definition: f3/rcc.h:83
#define RCC_CR_PLLRDY
Definition: f3/rcc.h:74
#define RCC_CFGR_PPRE1_SHIFT
Definition: f3/rcc.h:129
#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.
#define I2C1
Definition: i2c_common_v2.h:44
#define I2C2
Definition: i2c_common_v2.h:45
#define RCC_CFGR2_PREDIV_NODIV
Definition: f3/rcc.h:385
#define RCC_CFGR3_UART5SW_SHIFT
Definition: f3/rcc.h:411
#define RCC_CFGR3_UART4SW_SHIFT
Definition: f3/rcc.h:412
#define RCC_CFGR3_UART2SW_SHIFT
Definition: f3/rcc.h:414
#define RCC_CFGR3_UART1SW_SHIFT
Definition: f3/rcc.h:415
#define RCC_CFGR3_UART3SW_SHIFT
Definition: f3/rcc.h:413
#define RCC_CFGR3_UARTxSW_SYSCLK
Definition: f3/rcc.h:423
#define RCC_CFGR3_UARTxSW_PCLK
Definition: f3/rcc.h:422
#define RCC_CFGR3_UARTxSW_LSE
Definition: f3/rcc.h:424
#define RCC_CFGR3_UARTxSW_HSI
Definition: f3/rcc.h:425
#define RCC_CFGR_HPRE_NODIV
Definition: f3/rcc.h:146
#define RCC_CFGR_PPRE_DIV2
Definition: f3/rcc.h:136
#define RCC_CFGR_PPRE_NODIV
Definition: f3/rcc.h:135
#define RCC_CFGR_PPRE2_DIV_NONE
Definition: f3/rcc.h:175
#define RCC_CFGR_PPRE1_DIV_NONE
Definition: f3/rcc.h:181
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,...
int rcc_osc_ready_int_flag(enum rcc_osc osc)
Definition: rcc.c:151
int rcc_css_int_flag(void)
Definition: rcc.c:179
void rcc_set_i2c_clock_sysclk(uint32_t i2c)
Definition: rcc.c:460
static uint32_t rcc_get_usart_clksel_freq(uint32_t apb_clk, uint8_t shift)
Definition: rcc.c:497
void rcc_osc_ready_int_clear(enum rcc_osc osc)
Definition: rcc.c:88
void rcc_wait_for_osc_ready(enum rcc_osc osc)
Wait for Oscillator Ready.
Definition: rcc.c:201
void rcc_css_disable(void)
Definition: rcc.c:280
bool rcc_is_osc_ready(enum rcc_osc osc)
Is the given oscillator ready?
Definition: rcc.c:184
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:573
void rcc_set_sysclk_source(uint32_t clk)
Definition: rcc.c:285
const struct rcc_clock_scale rcc_hsi_configs[]
Definition: rcc.c:47
uint32_t rcc_apb2_frequency
Definition: rcc.c:45
void rcc_set_pll_source(uint32_t pllsrc)
Definition: rcc.c:294
uint32_t rcc_get_timer_clk_freq(uint32_t timer)
Get the peripheral clock speed for the Timer at base specified.
Definition: rcc.c:537
const struct rcc_clock_scale rcc_hse8mhz_configs[]
Definition: rcc.c:72
void rcc_usb_prescale_1(void)
Definition: rcc.c:480
uint32_t rcc_get_usart_clk_freq(uint32_t usart)
Get the peripheral clock speed for the USART at base specified.
Definition: rcc.c:517
void rcc_clock_setup_pll(const struct rcc_clock_scale *clock)
Setup clocks to run from PLL.
Definition: rcc.c:363
void rcc_set_prediv(uint32_t prediv)
Set PLL Source pre-divider CAUTION.
Definition: rcc.c:336
void rcc_osc_ready_int_enable(enum rcc_osc osc)
Definition: rcc.c:109
void rcc_usb_prescale_1_5(void)
Definition: rcc.c:475
void rcc_osc_ready_int_disable(enum rcc_osc osc)
Definition: rcc.c:130
void rcc_osc_on(enum rcc_osc osc)
Definition: rcc.c:233
uint32_t rcc_ahb_frequency
Definition: rcc.c:43
void rcc_osc_off(enum rcc_osc osc)
Definition: rcc.c:254
uint32_t rcc_get_system_clock_source(void)
Definition: rcc.c:351
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:555
void rcc_set_pll_multiplier(uint32_t pll)
Definition: rcc.c:341
void rcc_backupdomain_reset(void)
Definition: rcc.c:441
uint32_t rcc_apb1_frequency
Definition: rcc.c:44
void rcc_wait_for_sysclk_status(enum rcc_osc osc)
Definition: rcc.c:212
void rcc_adc_prescale(uint32_t prescale1, uint32_t prescale2)
Definition: rcc.c:485
uint32_t rcc_get_i2c_clocks(void)
Definition: rcc.c:470
void rcc_set_ppre1(uint32_t ppre1)
Definition: rcc.c:312
void rcc_css_int_clear(void)
Definition: rcc.c:174
void rcc_set_ppre2(uint32_t ppre2)
Definition: rcc.c:303
void rcc_set_i2c_clock_hsi(uint32_t i2c)
Definition: rcc.c:450
void rcc_css_enable(void)
Definition: rcc.c:275
void rcc_set_hpre(uint32_t hpre)
Definition: rcc.c:321
void rcc_wait_for_osc_not_ready(enum rcc_osc osc)
Definition: rcc.c:207
void rcc_clock_setup_hsi(const struct rcc_clock_scale *clock)
Definition: rcc.c:404
#define TIM2_BASE
#define TIM7_BASE
#define SPI1_BASE
#define USART1_BASE
#define UART4_BASE
#define USART3_BASE
#define SPI4_BASE
#define I2C1_BASE
#define USART2_BASE
uint8_t ppre1
Definition: f3/rcc.h:457
uint8_t ppre2
Definition: f3/rcc.h:458
uint32_t apb1_frequency
Definition: f3/rcc.h:461
uint8_t pllsrc
Definition: f3/rcc.h:451
uint32_t ahb_frequency
Definition: f3/rcc.h:460
uint8_t pllmul
Definition: f3/rcc.h:452
bool usbdiv1
Definition: f3/rcc.h:454
uint8_t hpre
Definition: f3/rcc.h:456
uint32_t apb2_frequency
Definition: f3/rcc.h:462
uint32_t flash_waitstates
Definition: f3/rcc.h:455
uint8_t plldiv
Definition: f3/rcc.h:453