@@ -44,6 +44,10 @@ impl RccExt for RCC {
44
44
plli2sr : 2 ,
45
45
plli2sq : 2 ,
46
46
plli2sn : 192 ,
47
+ mco1 : MCO1 :: Hsi ,
48
+ mco1pre : MCOPRE :: Div1_no_div ,
49
+ mco2 : MCO2 :: Sysclk ,
50
+ mco2pre : MCOPRE :: Div1_no_div ,
47
51
} ,
48
52
}
49
53
}
@@ -218,6 +222,53 @@ pub enum PLLP {
218
222
Div8 = 0b11 ,
219
223
}
220
224
225
+ /// MCO prescaler
226
+ ///
227
+ /// Value on reset: No division
228
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
229
+ pub enum MCOPRE {
230
+ /// No division
231
+ Div1_no_div ,
232
+ /// Division by 2
233
+ Div2 ,
234
+ /// Division by 3
235
+ Div3 ,
236
+ /// Division by 4
237
+ Div4 ,
238
+ /// Division by 5
239
+ Div5 ,
240
+ }
241
+
242
+ /// Microcontroller clock output 1
243
+ ///
244
+ /// Value on reset: HSI
245
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
246
+ pub enum MCO1 {
247
+ /// HSI clock selected
248
+ Hsi ,
249
+ /// LSE oscillator selected
250
+ Lse ,
251
+ /// HSE oscillator clock selected
252
+ Hse ,
253
+ /// PLL clock selected
254
+ Pll ,
255
+ }
256
+
257
+ /// Microcontroller clock output 2
258
+ ///
259
+ /// Value on reset: SYSCLK
260
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
261
+ pub enum MCO2 {
262
+ /// System clock (SYSCLK) selected
263
+ Sysclk ,
264
+ /// PLLI2S clock selected
265
+ Plli2s ,
266
+ /// HSE oscillator clock selected
267
+ Hse ,
268
+ /// PLL clock selected
269
+ Pll ,
270
+ }
271
+
221
272
#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
222
273
enum VOSscale {
223
274
PwrScale1 ,
@@ -265,6 +316,10 @@ pub struct CFGR {
265
316
plli2sr : u8 ,
266
317
plli2sq : u8 ,
267
318
plli2sn : u16 ,
319
+ mco1 : MCO1 ,
320
+ mco1pre : MCOPRE ,
321
+ mco2 : MCO2 ,
322
+ mco2pre : MCOPRE ,
268
323
}
269
324
270
325
impl CFGR {
@@ -441,6 +496,30 @@ impl CFGR {
441
496
self
442
497
}
443
498
499
+ /// Sets the MCO1 source
500
+ pub fn mco1 ( mut self , mco1 : MCO1 ) -> Self {
501
+ self . mco1 = mco1;
502
+ self
503
+ }
504
+
505
+ /// Sets the MCO1 division factors
506
+ pub fn mco1pre ( mut self , mco1pre : MCOPRE ) -> Self {
507
+ self . mco1pre = mco1pre;
508
+ self
509
+ }
510
+
511
+ /// Sets the MCO2 source
512
+ pub fn mco2 ( mut self , mco2 : MCO2 ) -> Self {
513
+ self . mco2 = mco2;
514
+ self
515
+ }
516
+
517
+ /// Sets the MCO2 division factors
518
+ pub fn mco2pre ( mut self , mco2pre : MCOPRE ) -> Self {
519
+ self . mco2pre = mco2pre;
520
+ self
521
+ }
522
+
444
523
/// Output clock calculation
445
524
fn calculate_clocks ( & self ) -> ( Clocks , InternalRCCConfig ) {
446
525
let mut config = InternalRCCConfig :: default ( ) ;
@@ -894,6 +973,17 @@ impl CFGR {
894
973
rcc. cr . modify ( |_, w| w. plli2son ( ) . on ( ) ) ;
895
974
}
896
975
976
+ rcc. cfgr . modify ( |_, w| {
977
+ w. mco1 ( )
978
+ . variant ( self . mco1 . into ( ) )
979
+ . mco1pre ( )
980
+ . variant ( self . mco1pre . into ( ) ) ;
981
+ w. mco2 ( )
982
+ . variant ( self . mco2 . into ( ) )
983
+ . mco2pre ( )
984
+ . variant ( self . mco2pre . into ( ) )
985
+ } ) ;
986
+
897
987
flash
898
988
. acr
899
989
. write ( |w| w. latency ( ) . bits ( config. flash_waitstates ) ) ;
@@ -1035,6 +1125,40 @@ impl GetBusFreq for APB2 {
1035
1125
}
1036
1126
}
1037
1127
1128
+ impl From < MCO1 > for crate :: pac:: rcc:: cfgr:: MCO1_A {
1129
+ fn from ( input : MCO1 ) -> Self {
1130
+ match input {
1131
+ MCO1 :: Hsi => Self :: HSI ,
1132
+ MCO1 :: Lse => Self :: LSE ,
1133
+ MCO1 :: Hse => Self :: HSE ,
1134
+ MCO1 :: Pll => Self :: PLL ,
1135
+ }
1136
+ }
1137
+ }
1138
+
1139
+ impl From < MCO2 > for crate :: pac:: rcc:: cfgr:: MCO2_A {
1140
+ fn from ( input : MCO2 ) -> Self {
1141
+ match input {
1142
+ MCO2 :: Sysclk => Self :: SYSCLK ,
1143
+ MCO2 :: Plli2s => Self :: PLLI2S ,
1144
+ MCO2 :: Hse => Self :: HSE ,
1145
+ MCO2 :: Pll => Self :: PLL ,
1146
+ }
1147
+ }
1148
+ }
1149
+
1150
+ impl From < MCOPRE > for crate :: pac:: rcc:: cfgr:: MCO2PRE_A {
1151
+ fn from ( input : MCOPRE ) -> Self {
1152
+ match input {
1153
+ MCOPRE :: Div1_no_div => Self :: DIV1 ,
1154
+ MCOPRE :: Div2 => Self :: DIV2 ,
1155
+ MCOPRE :: Div3 => Self :: DIV3 ,
1156
+ MCOPRE :: Div4 => Self :: DIV4 ,
1157
+ MCOPRE :: Div5 => Self :: DIV5 ,
1158
+ }
1159
+ }
1160
+ }
1161
+
1038
1162
pub ( crate ) mod sealed {
1039
1163
/// Bus associated to peripheral
1040
1164
pub trait RccBus {
@@ -1266,7 +1390,7 @@ mod tests {
1266
1390
1267
1391
#[ test]
1268
1392
fn test_rcc_calc1 ( ) {
1269
- use super :: { HSEClock , HSEClockMode , PLLP } ;
1393
+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
1270
1394
1271
1395
let cfgr = CFGR {
1272
1396
hse : None ,
@@ -1284,6 +1408,10 @@ mod tests {
1284
1408
plli2sr : 2 ,
1285
1409
plli2sq : 2 ,
1286
1410
plli2sn : 192 ,
1411
+ mco1 : MCO1 :: Hsi ,
1412
+ mco1pre : MCOPRE :: Div1_no_div ,
1413
+ mco2 : MCO2 :: Sysclk ,
1414
+ mco2pre : MCOPRE :: Div1_no_div ,
1287
1415
} ;
1288
1416
1289
1417
let mut cfgr = cfgr
@@ -1302,7 +1430,7 @@ mod tests {
1302
1430
1303
1431
#[ test]
1304
1432
fn test_rcc_calc2 ( ) {
1305
- use super :: { HSEClock , HSEClockMode , PLLP } ;
1433
+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
1306
1434
1307
1435
let cfgr = CFGR {
1308
1436
hse : None ,
@@ -1320,6 +1448,10 @@ mod tests {
1320
1448
plli2sr : 2 ,
1321
1449
plli2sq : 2 ,
1322
1450
plli2sn : 192 ,
1451
+ mco1 : MCO1 :: Hsi ,
1452
+ mco1pre : MCOPRE :: Div1_no_div ,
1453
+ mco2 : MCO2 :: Sysclk ,
1454
+ mco2pre : MCOPRE :: Div1_no_div ,
1323
1455
} ;
1324
1456
1325
1457
let mut cfgr = cfgr
@@ -1337,7 +1469,7 @@ mod tests {
1337
1469
1338
1470
#[ test]
1339
1471
fn test_rcc_calc3 ( ) {
1340
- use super :: { HSEClock , HSEClockMode , PLLP } ;
1472
+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
1341
1473
1342
1474
let cfgr = CFGR {
1343
1475
hse : None ,
@@ -1355,6 +1487,10 @@ mod tests {
1355
1487
plli2sr : 2 ,
1356
1488
plli2sq : 2 ,
1357
1489
plli2sn : 192 ,
1490
+ mco1 : MCO1 :: Hsi ,
1491
+ mco1pre : MCOPRE :: Div1_no_div ,
1492
+ mco2 : MCO2 :: Sysclk ,
1493
+ mco2pre : MCOPRE :: Div1_no_div ,
1358
1494
} ;
1359
1495
1360
1496
let mut cfgr = cfgr
@@ -1372,7 +1508,7 @@ mod tests {
1372
1508
1373
1509
#[ test]
1374
1510
fn test_rcc_default ( ) {
1375
- use super :: PLLP ;
1511
+ use super :: { MCO1 , MCO2 , MCOPRE , PLLP } ;
1376
1512
1377
1513
let mut cfgr = CFGR {
1378
1514
hse : None ,
@@ -1390,6 +1526,10 @@ mod tests {
1390
1526
plli2sr : 2 ,
1391
1527
plli2sq : 2 ,
1392
1528
plli2sn : 192 ,
1529
+ mco1 : MCO1 :: Hsi ,
1530
+ mco1pre : MCOPRE :: Div1_no_div ,
1531
+ mco2 : MCO2 :: Sysclk ,
1532
+ mco2pre : MCOPRE :: Div1_no_div ,
1393
1533
} ;
1394
1534
1395
1535
cfgr. pll_configure ( ) ;
0 commit comments