stm32g0xx_hal/rcc/
config.rs1use crate::time::Hertz;
2
3#[derive(Clone, Copy)]
5pub enum Prescaler {
6 NotDivided,
7 Div2,
8 Div4,
9 Div8,
10 Div16,
11 Div32,
12 Div64,
13 Div128,
14 Div256,
15 Div512,
16}
17
18pub enum SysClockSrc {
20 LSI,
21 PLL,
22 HSI(Prescaler),
23 HSE(Hertz),
24 HSE_BYPASS(Hertz),
25 LSE(Hertz),
26 LSE_BYPASS(Hertz),
27}
28
29pub enum MCOSrc {
31 LSI,
32 PLL,
33 SysClk,
34 HSI,
35 HSE,
36 LSE,
37}
38
39pub enum LSCOSrc {
41 LSI,
42 LSE,
43}
44
45#[derive(Clone, Copy)]
47pub enum PLLSrc {
48 HSI,
49 HSE(Hertz),
50 HSE_BYPASS(Hertz),
51}
52
53#[derive(Clone, Copy)]
55pub enum RTCSrc {
56 LSE,
57 LSE_BYPASS,
58 LSI,
59 HSE,
60 HSE_BYPASS,
61}
62
63pub type PLLDiv = u8;
65
66pub type PLLMul = u8;
68
69#[derive(Clone, Copy)]
71pub struct PllConfig {
72 pub mux: PLLSrc,
73 pub m: PLLDiv,
74 pub n: PLLMul,
75 pub r: PLLDiv,
76 pub q: Option<PLLDiv>,
77 pub p: Option<PLLDiv>,
78}
79
80impl Default for PllConfig {
81 fn default() -> PllConfig {
82 PllConfig {
83 mux: PLLSrc::HSI,
84 m: 1,
85 n: 8,
86 r: 2,
87 q: None,
88 p: None,
89 }
90 }
91}
92
93impl PllConfig {
94 pub fn with_hsi(m: PLLDiv, n: PLLMul, r: PLLDiv) -> PllConfig {
95 PllConfig {
96 mux: PLLSrc::HSI,
97 m,
98 n,
99 r,
100 q: None,
101 p: None,
102 }
103 }
104}
105
106pub struct Config {
108 pub(crate) sys_mux: SysClockSrc,
109 pub(crate) pll_cfg: PllConfig,
110 pub(crate) ahb_psc: Prescaler,
111 pub(crate) apb_psc: Prescaler,
112}
113
114impl Config {
115 pub fn new(mux: SysClockSrc) -> Self {
116 Config::default().clock_src(mux)
117 }
118
119 pub fn pll() -> Self {
120 Config::default().clock_src(SysClockSrc::PLL)
121 }
122
123 pub fn hsi(psc: Prescaler) -> Self {
124 Config::default().clock_src(SysClockSrc::HSI(psc))
125 }
126
127 pub fn lsi() -> Self {
128 Config::default().clock_src(SysClockSrc::LSI)
129 }
130
131 pub fn clock_src(mut self, mux: SysClockSrc) -> Self {
132 self.sys_mux = mux;
133 self
134 }
135
136 pub fn pll_cfg(mut self, cfg: PllConfig) -> Self {
137 self.pll_cfg = cfg;
138 self
139 }
140
141 pub fn ahb_psc(mut self, psc: Prescaler) -> Self {
142 self.ahb_psc = psc;
143 self
144 }
145
146 pub fn apb_psc(mut self, psc: Prescaler) -> Self {
147 self.apb_psc = psc;
148 self
149 }
150}
151
152impl Default for Config {
153 fn default() -> Config {
154 Config {
155 sys_mux: SysClockSrc::HSI(Prescaler::NotDivided),
156 pll_cfg: PllConfig::default(),
157 ahb_psc: Prescaler::NotDivided,
158 apb_psc: Prescaler::NotDivided,
159 }
160 }
161}