microHAL
An abstraction layer for your future F4xx projects
Loading...
Searching...
No Matches
rcc.h
Go to the documentation of this file.
1
12#ifndef RCC_H
13#define RCC_H
14
15/* -- Includes -- */
16#include <stdint.h>
17#include "stm32f4xx.h"
18#include "defines.h"
19
20/* -- Structs -- */
24struct __attribute__((packed)) RCCRegs {
25 REG32 CR;
26 REG32 PLLCFGR;
27 REG32 CFGR;
28 REG32 CIR;
29 REG32 AHB1RSTR;
30 REG32 AHB2RSTR;
31 REG32 AHB3RSTR;
32 REG32 _reserved1;
33 REG32 APB1RSTR;
34 REG32 APB2RSTR;
35 REG32 _reserved2[2];
36 REG32 AHB1ENR;
37 REG32 AHB2ENR;
38 REG32 AHB3ENR;
39 REG32 _reserved3;
40 REG32 APB1ENR;
41 REG32 APB2ENR;
42 REG32 _reserved4[2];
43 REG32 AHB1LPENR;
44 REG32 AHB2LPENR;
45 REG32 AHB3LPENR;
46 REG32 _reserved5;
47 REG32 APB1LPENR;
48 REG32 APB2LPENR;
49 REG32 _reserved6[2];
50 REG32 BDCR;
51 REG32 CSR;
52 REG32 _reserved7[2];
53 REG32 SSCGR;
54 REG32 PLLI2SCFGR;
55 REG32 PLLSAICFGR;
56 REG32 DCKCFGR;
57 REG32 CKGATENR;
58 REG32 DCKCFGR2;
59};
60
61_Static_assert((sizeof(struct RCCRegs)) == (sizeof(uint32_t) * 38U),
62 "RCC register struct size mismatch. Is it aligned?");
63
64#define RCC_PTR (struct RCCRegs *)RCC_BASE
65
69struct __attribute__((packed)) RCCPLLConfig {
70 uint8_t PLLM : 6;
71 uint8_t PLLP : 2;
72 uint8_t PLLQ : 4;
73 uint8_t PLLR : 3;
74 uint16_t PLLN : 9;
75 _Bool UseHSE : 1;
76};
77
78_Static_assert((sizeof(struct RCCPLLConfig)) == (sizeof(uint8_t) * 4U),
79 "RCC PLL configuration struct size mismatch. Is it aligned?");
80
81/* -- Enums -- */
85typedef enum rcc_osc {
86 RCC_OSC_HSI = 0x0,
87 RCC_OSC_HSE = 0x1,
88 RCC_OSC_LSI = 0x2,
89 RCC_OSC_LSE = 0x3,
90 RCC_OSC_PLL = 0x4,
91 RCC_OSC_PLLSAI = 0x5,
92 RCC_OSC_PLLI2S = 0x6,
94
98typedef enum rcc_clk_periph {
99 /* ---------- AHB1 ---------- */
100 RCC_CLK_GPIOA = 0U,
101 RCC_CLK_GPIOB,
102 RCC_CLK_GPIOD,
103 RCC_CLK_GPIOC,
104 RCC_CLK_GPIOE,
105 RCC_CLK_GPIOF,
106 RCC_CLK_GPIOG,
107 RCC_CLK_GPIOH,
108 RCC_CLK_GPIOI,
109 RCC_CLK_GPIOJ,
110 RCC_CLK_GPIOK,
111 RCC_CLK_CRC = 12U,
112 RCC_CLK_LP_FLITF = 15U,
116 RCC_CLK_CCMDATARAM = 20U,
117 RCC_CLK_DMA1,
118 RCC_CLK_DMA2,
119 RCC_CLK_DMA2D,
120 RCC_CLK_ETHMAC = 25U,
121 RCC_CLK_ETHMACTX,
122 RCC_CLK_ETHMACRX,
123 RCC_CLK_ETHMACPTP,
124 RCC_CLK_OTGHS,
125 RCC_CLK_OTGHSULPI,
126
127 /* ---------- AHB2 ---------- */
128 RCC_CLK_DCMI = 32U,
129 RCC_CLK_CRYP = 32U + 4U,
130 RCC_CLK_HASH,
131 RCC_CLK_RNG,
132 RCC_CLK_OTGFS,
133
134 /* ---------- AHB3 ---------- */
135 RCC_CLK_FMC = 64U,
136 RCC_CLK_QSPI,
137
138 /* ---------- APB1 ---------- */
139 RCC_CLK_TIM2 = 96U,
140 RCC_CLK_TIM3,
141 RCC_CLK_TIM4,
142 RCC_CLK_TIM5,
143 RCC_CLK_TIM6,
144 RCC_CLK_TIM7,
145 RCC_CLK_TIM12,
146 RCC_CLK_TIM13,
147 RCC_CLK_TIM14,
148 RCC_CLK_WWDG = 96U + 11U,
149 RCC_CLK_SPI2 = 96U + 14U,
150 RCC_CLK_SPI3,
151 RCC_CLK_SPDIFRX,
152 RCC_CLK_USART2,
153 RCC_CLK_USART3,
154 RCC_CLK_UART4,
155 RCC_CLK_UART5,
156 RCC_CLK_I2C1,
157 RCC_CLK_I2C2,
158 RCC_CLK_I2C3,
159 RCC_CLK_FMPI2C1,
160 RCC_CLK_CAN1,
161 RCC_CLK_CAN2,
162 RCC_CLK_CEC,
163 RCC_CLK_PWR,
164 RCC_CLK_DAC,
165 RCC_CLK_UART7,
166 RCC_CLK_UART8,
167
168 /* ---------- APB2 ---------- */
169 RCC_CLK_TIM1 = 128U,
170 RCC_CLK_TIM8,
171 RCC_CLK_USART1 = 128U + 4U,
172 RCC_CLK_USART6,
173 RCC_CLK_ADC1 = 128U + 8U,
174 RCC_CLK_ADC2,
175 RCC_CLK_ADC3,
176 RCC_CLK_SDIO,
177 RCC_CLK_SPI1,
178 RCC_CLK_SPI4,
179 RCC_CLK_SYSCFG,
180 RCC_CLK_TIM9 = 128U + 16U,
181 RCC_CLK_TIM10,
182 RCC_CLK_TIM11,
183 RCC_CLK_SPI5 = 128U + 20U,
184 RCC_CLK_SPI6,
185 RCC_CLK_SAI1,
186 RCC_CLK_SAI2,
187 RCC_CLK_LTDC = 128U + 26U,
188 RCC_CLK_DSI
190
194typedef enum rcc_apb_prescaler {
195 RCC_APB_PRESCALER_DIV1 = 0x0,
196 RCC_APB_PRESCALER_DIV2 = 0x4,
197 RCC_APB_PRESCALER_DIV4 = 0x5,
198 RCC_APB_PRESCALER_DIV8 = 0x6,
199 RCC_APB_PRESCALER_DIV16 = 0x7,
201
205typedef enum rcc_ahb_prescaler {
206 RCC_AHB_PRESCALER_DIV1 = 0x0,
207 RCC_AHB_PRESCALER_DIV2 = 0x8,
208 RCC_AHB_PRESCALER_DIV4 = 0x9,
209 RCC_AHB_PRESCALER_DIV8 = 0xA,
210 RCC_AHB_PRESCALER_DIV16 = 0xB,
211 RCC_AHB_PRESCALER_DIV64 = 0xC,
212 RCC_AHB_PRESCALER_DIV128 = 0xD,
213 RCC_AHB_PRESCALER_DIV256 = 0xE,
214 RCC_AHB_PRESCALER_DIV512 = 0xF,
216
220typedef enum rcc_pll_target {
221 RCC_PLL_TARGET_PLL = 0x0,
222 RCC_PLL_TARGET_I2S = 0x1,
223 RCC_PLL_TARGET_SAI = 0x2,
225
230 RCC_SYSTEMCLOCK_SRC_HSI = 0x0,
231 RCC_SYSTEMCLOCK_SRC_HSE = 0x1,
232 RCC_SYSTEMCLOCK_SRC_PLL = 0x2,
235
239typedef enum rcc_mco1_src {
240 RCC_MCO1_SRC_HSI = 0x0,
241 RCC_MCO1_SRC_LSE = 0x1,
242 RCC_MCO1_SRC_HSE = 0x2,
243 RCC_MCO1_SRC_PLL = 0x3,
245
249typedef enum rcc_mco2_src {
250 RCC_MCO2_SRC_SYS = 0x0,
251 RCC_MCO2_SRC_I2S = 0x1,
252 RCC_MCO2_SRC_HSE = 0x2,
253 RCC_MCO2_SRC_PLL = 0x3,
255
259typedef enum rcc_mco_prescaler {
260 RCC_MCO_PRESCALER_DIV1 = 0x0,
261 RCC_MCO_PRESCALER_DIV2 = 0x4,
262 RCC_MCO_PRESCALER_DIV3 = 0x5,
263 RCC_MCO_PRESCALER_DIV4 = 0x6,
264 RCC_MCO_PRESCALER_DIV5 = 0x7,
266
267typedef enum rcc_rtc_src {
268 RCC_RTC_SRC_NON = 0x0,
269 RCC_RTC_SRC_LSE = 0x1,
270 RCC_RTC_SRC_LSI = 0x2,
271 RCC_RTC_SRC_HSE = 0x3
272} rcc_rtc_src_t;
273
286
299void rcc_configure_apb_prescaler(const uint8_t apb,
300 const rcc_apb_prescaler_t value);
301
316void rcc_configure_pll_clk(const struct RCCPLLConfig config,
317 const rcc_pll_target_t target);
318
330void rcc_enable_osc(const rcc_osc_t osc);
331
343void rcc_disable_osc(const rcc_osc_t osc);
344
357
372void rcc_enable_peripheral_clk(const rcc_clk_periph_t peripheral);
373
385void rcc_disable_peripheral_clk(const rcc_clk_periph_t peripheral);
386
402
412void rcc_set_mco1_src(const rcc_mco1_src_t source);
413
423void rcc_set_mco2_src(const rcc_mco2_src_t source);
424
436void rcc_configure_mco_prescaler(const uint8_t mco,
437 const rcc_mco_prescaler_t value);
438
449void rcc_enable_rtc(const rcc_rtc_src_t source);
450
454void rcc_disable_rtc(void);
455
462void rcc_configure_rtc_prescaler(const uint8_t value);
463
464#endif
Defines used commonly in most files.
void rcc_configure_ahb_prescaler(const rcc_ahb_prescaler_t value)
Set AHB prescaler to the desired value.
Definition rcc.c:15
rcc_pll_target
Available PLL targets.
Definition rcc.h:220
enum rcc_mco_prescaler rcc_mco_prescaler_t
Available MCO prescaler dividers.
void rcc_enable_peripheral_clk(const rcc_clk_periph_t peripheral)
Enables the specified peripheral clock.
Definition rcc.c:182
rcc_mco1_src
Available MCO1 clock sources.
Definition rcc.h:239
void rcc_disable_rtc(void)
Disables the RTC.
Definition rcc.c:323
void rcc_enable_lp_peripheral_clk(const rcc_clk_periph_t peripheral)
Enables the peripheral in low power mode.
Definition rcc.c:220
enum rcc_osc rcc_osc_t
Available RCC oscillators.
enum rcc_apb_prescaler rcc_apb_prescaler_t
Available RCC APBx prescaler dividers.
void rcc_set_mco2_src(const rcc_mco2_src_t source)
Set MCO2 to the specified clock source.
Definition rcc.c:258
enum rcc_systemclock_src rcc_systemclock_src_t
Available RCC system clock sources.
rcc_clk_periph
Available AHB/APB peripheral clocks.
Definition rcc.h:98
@ RCC_CLK_LP_SRAM2
Definition rcc.h:114
@ RCC_CLK_LP_SRAM1
Definition rcc.h:113
@ RCC_CLK_BKPSRAM
Definition rcc.h:115
rcc_mco2_src
Available MCO2 clock sources.
Definition rcc.h:249
rcc_osc
Available RCC oscillators.
Definition rcc.h:85
enum rcc_mco1_src rcc_mco1_src_t
Available MCO1 clock sources.
rcc_apb_prescaler
Available RCC APBx prescaler dividers.
Definition rcc.h:194
enum rcc_mco2_src rcc_mco2_src_t
Available MCO2 clock sources.
rcc_systemclock_src
Available RCC system clock sources.
Definition rcc.h:229
@ RCC_SYSTEMCLOCK_SRC_PLR
Definition rcc.h:233
enum rcc_pll_target rcc_pll_target_t
Available PLL targets.
rcc_ahb_prescaler
Available RCC AHB prescaler dividers.
Definition rcc.h:205
void rcc_set_mco1_src(const rcc_mco1_src_t source)
Set MCO1 to the specified clock source.
Definition rcc.c:239
rcc_mco_prescaler
Available MCO prescaler dividers.
Definition rcc.h:259
void rcc_configure_rtc_prescaler(const uint8_t value)
Set RTC HSE prescaler to the desired value.
Definition rcc.c:329
void rcc_enable_rtc(const rcc_rtc_src_t source)
Enables the RTC with specified source.
Definition rcc.c:305
enum rcc_clk_periph rcc_clk_periph_t
Available AHB/APB peripheral clocks.
void rcc_configure_apb_prescaler(const uint8_t apb, const rcc_apb_prescaler_t value)
Set APBx prescaler to the desired value.
Definition rcc.c:40
void rcc_disable_osc(const rcc_osc_t osc)
Disable the specified oscillator.
Definition rcc.c:147
void rcc_set_systemclock_src(const rcc_systemclock_src_t source)
Sets the system clock to the specified source.
Definition rcc.c:162
void rcc_enable_osc(const rcc_osc_t osc)
Enable the specified oscillator.
Definition rcc.c:112
void rcc_configure_mco_prescaler(const uint8_t mco, const rcc_mco_prescaler_t value)
Set MCOx prescaler to the desired value.
Definition rcc.c:277
void rcc_configure_pll_clk(const struct RCCPLLConfig config, const rcc_pll_target_t target)
Sets the PLL clocks according to config.
Definition rcc.c:69
enum rcc_ahb_prescaler rcc_ahb_prescaler_t
Available RCC AHB prescaler dividers.
void rcc_disable_peripheral_clk(const rcc_clk_periph_t peripheral)
Disables the specified peripheral clock.
Definition rcc.c:201
CMSIS device header stubs.
Contains PLL configuration values.
Definition rcc.h:69
uint16_t PLLN
Definition rcc.h:74
uint8_t PLLP
Definition rcc.h:71
uint8_t PLLQ
Definition rcc.h:72
uint8_t PLLR
Definition rcc.h:73
uint8_t PLLM
Definition rcc.h:70
Contains RCC registers.
Definition rcc.h:24