@@ -46,30 +46,279 @@ pub enum PLLSrc {
46
46
HSE_BYPASS ( Hertz ) ,
47
47
}
48
48
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
+ }
51
158
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
+ }
54
303
55
304
/// PLL config
56
305
#[ derive( Clone , Copy ) ]
57
306
pub struct PllConfig {
58
307
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 > ,
64
313
}
65
314
66
315
impl Default for PllConfig {
67
316
fn default ( ) -> PllConfig {
68
317
PllConfig {
69
318
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 ) ,
73
322
q : None ,
74
323
p : None ,
75
324
}
0 commit comments