Skip to content

Commit 7af8984

Browse files
authored
Update PLL configuration (#49)
* fdcan: Fix typo in Interrupts::RX_FIFO_x_FULL * Rework PLL configuration Provide enums for divider parameters Replace writes with modify calls into the PAC
1 parent c887102 commit 7af8984

File tree

3 files changed

+333
-55
lines changed

3 files changed

+333
-55
lines changed

src/fdcan/interrupt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ mod tests {
195195
);
196196
assert_eq!(Interrupts::from(Interrupt::TxEmpty), Interrupts::TX_EMPTY);
197197

198-
let mut ints = Interrupts::RX_FIFO0_FULL;
198+
let mut ints = Interrupts::RX_FIFO_0_FULL;
199199
ints |= Interrupt::RxFifo1Full;
200-
assert_eq!(ints, Interrupts::RX_FIFO0_FULL | Interrupts::RX_FIFO1_FULL);
200+
assert_eq!(ints, Interrupts::RX_FIFO_0_FULL | Interrupts::RX_FIFO_1_FULL);
201201
}
202202
}

src/rcc/config.rs

Lines changed: 261 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,30 +46,279 @@ pub enum PLLSrc {
4646
HSE_BYPASS(Hertz),
4747
}
4848

49-
/// PLL divider
50-
pub type PLLDiv = u8;
49+
/// Divider for the PLL clock input (M)
50+
/// This must be set based on the input clock to keep the PLL input frequency within the limits
51+
/// specified in the datasheet.
52+
#[derive(Clone, Copy)]
53+
pub enum PllMDiv {
54+
DIV_1 = 0,
55+
DIV_2,
56+
DIV_3,
57+
DIV_4,
58+
DIV_5,
59+
DIV_6,
60+
DIV_7,
61+
DIV_8,
62+
DIV_9,
63+
DIV_10,
64+
DIV_11,
65+
DIV_12,
66+
DIV_13,
67+
DIV_14,
68+
DIV_15,
69+
DIV_16,
70+
}
71+
72+
impl PllMDiv {
73+
pub fn divisor(&self) -> u32 {
74+
(self.clone() as u32) + 1
75+
}
76+
77+
pub fn register_setting(&self) -> u8 {
78+
self.clone() as u8
79+
}
80+
}
81+
82+
/// Divider for the PLL Q Output
83+
#[derive(Clone, Copy)]
84+
pub enum PllQDiv {
85+
DIV_2 = 0,
86+
DIV_4,
87+
DIV_6,
88+
DIV_8,
89+
}
90+
91+
impl PllQDiv {
92+
pub fn divisor(&self) -> u32 {
93+
((self.clone() as u32) + 1) * 2
94+
}
95+
96+
pub fn register_setting(&self) -> u8 {
97+
self.clone() as u8
98+
}
99+
}
100+
101+
/// Divider for the PLL R Output
102+
#[derive(Clone, Copy)]
103+
pub enum PllRDiv {
104+
DIV_2 = 0,
105+
DIV_4,
106+
DIV_6,
107+
DIV_8,
108+
}
109+
110+
impl PllRDiv {
111+
pub fn divisor(&self) -> u32 {
112+
((self.clone() as u32) + 1) * 2
113+
}
114+
115+
pub fn register_setting(&self) -> u8 {
116+
self.clone() as u8
117+
}
118+
}
119+
120+
/// Divider for the PLL P Output
121+
///
122+
/// Note: The P divider has a PLLP register that can be used to set the divider to either 7 or 17.
123+
/// It is a complete mystery why anyone would want to do that instead of using the PLLPDIV register
124+
/// so it's not supported.
125+
#[derive(Clone, Copy)]
126+
pub enum PllPDiv {
127+
DIV_2 = 2,
128+
DIV_3,
129+
DIV_4,
130+
DIV_5,
131+
DIV_6,
132+
DIV_7,
133+
DIV_8,
134+
DIV_9,
135+
DIV_10,
136+
DIV_11,
137+
DIV_12,
138+
DIV_13,
139+
DIV_14,
140+
DIV_15,
141+
DIV_16,
142+
DIV_17,
143+
DIV_18,
144+
DIV_19,
145+
DIV_20,
146+
DIV_21,
147+
DIV_22,
148+
DIV_23,
149+
DIV_24,
150+
DIV_25,
151+
DIV_26,
152+
DIV_27,
153+
DIV_28,
154+
DIV_29,
155+
DIV_30,
156+
DIV_31,
157+
}
51158

52-
/// PLL multiplier
53-
pub type PLLMul = u8;
159+
impl PllPDiv {
160+
pub fn divisor(&self) -> u32 {
161+
self.clone() as u32
162+
}
163+
164+
pub fn register_setting(&self) -> u8 {
165+
self.clone() as u8
166+
}
167+
}
168+
169+
/// Main PLL multiplication factor for VCO
170+
#[derive(Clone, Copy)]
171+
pub enum PllNMul {
172+
MUL_8 = 8,
173+
MUL_9,
174+
MUL_10,
175+
MUL_11,
176+
MUL_12,
177+
MUL_13,
178+
MUL_14,
179+
MUL_15,
180+
MUL_16,
181+
MUL_17,
182+
MUL_18,
183+
MUL_19,
184+
MUL_20,
185+
MUL_21,
186+
MUL_22,
187+
MUL_23,
188+
MUL_24,
189+
MUL_25,
190+
MUL_26,
191+
MUL_27,
192+
MUL_28,
193+
MUL_29,
194+
MUL_30,
195+
MUL_31,
196+
MUL_32,
197+
MUL_33,
198+
MUL_34,
199+
MUL_35,
200+
MUL_36,
201+
MUL_37,
202+
MUL_38,
203+
MUL_39,
204+
MUL_40,
205+
MUL_41,
206+
MUL_42,
207+
MUL_43,
208+
MUL_44,
209+
MUL_45,
210+
MUL_46,
211+
MUL_47,
212+
MUL_48,
213+
MUL_49,
214+
MUL_50,
215+
MUL_51,
216+
MUL_52,
217+
MUL_53,
218+
MUL_54,
219+
MUL_55,
220+
MUL_56,
221+
MUL_57,
222+
MUL_58,
223+
MUL_59,
224+
MUL_60,
225+
MUL_61,
226+
MUL_62,
227+
MUL_63,
228+
MUL_64,
229+
MUL_65,
230+
MUL_66,
231+
MUL_67,
232+
MUL_68,
233+
MUL_69,
234+
MUL_70,
235+
MUL_71,
236+
MUL_72,
237+
MUL_73,
238+
MUL_74,
239+
MUL_75,
240+
MUL_76,
241+
MUL_77,
242+
MUL_78,
243+
MUL_79,
244+
MUL_80,
245+
MUL_81,
246+
MUL_82,
247+
MUL_83,
248+
MUL_84,
249+
MUL_85,
250+
MUL_86,
251+
MUL_87,
252+
MUL_88,
253+
MUL_89,
254+
MUL_90,
255+
MUL_91,
256+
MUL_92,
257+
MUL_93,
258+
MUL_94,
259+
MUL_95,
260+
MUL_96,
261+
MUL_97,
262+
MUL_98,
263+
MUL_99,
264+
MUL_100,
265+
MUL_101,
266+
MUL_102,
267+
MUL_103,
268+
MUL_104,
269+
MUL_105,
270+
MUL_106,
271+
MUL_107,
272+
MUL_108,
273+
MUL_109,
274+
MUL_110,
275+
MUL_111,
276+
MUL_112,
277+
MUL_113,
278+
MUL_114,
279+
MUL_115,
280+
MUL_116,
281+
MUL_117,
282+
MUL_118,
283+
MUL_119,
284+
MUL_120,
285+
MUL_121,
286+
MUL_122,
287+
MUL_123,
288+
MUL_124,
289+
MUL_125,
290+
MUL_126,
291+
MUL_127,
292+
}
293+
294+
impl PllNMul {
295+
pub fn multiplier(&self) -> u32 {
296+
self.clone() as u32
297+
}
298+
299+
pub fn register_setting(&self) -> u8 {
300+
self.clone() as u8
301+
}
302+
}
54303

55304
/// PLL config
56305
#[derive(Clone, Copy)]
57306
pub struct PllConfig {
58307
pub mux: PLLSrc,
59-
pub m: PLLDiv,
60-
pub n: PLLMul,
61-
pub r: PLLDiv,
62-
pub q: Option<PLLDiv>,
63-
pub p: Option<PLLDiv>,
308+
pub m: PllMDiv,
309+
pub n: PllNMul,
310+
pub r: Option<PllRDiv>,
311+
pub q: Option<PllQDiv>,
312+
pub p: Option<PllPDiv>,
64313
}
65314

66315
impl Default for PllConfig {
67316
fn default() -> PllConfig {
68317
PllConfig {
69318
mux: PLLSrc::HSI,
70-
m: 2,
71-
n: 8,
72-
r: 2,
319+
m: PllMDiv::DIV_2,
320+
n: PllNMul::MUL_8,
321+
r: Some(PllRDiv::DIV_2),
73322
q: None,
74323
p: None,
75324
}

0 commit comments

Comments
 (0)