@@ -44,6 +44,10 @@ impl RccExt for RCC {
4444 plli2sr : 2 ,
4545 plli2sq : 2 ,
4646 plli2sn : 192 ,
47+ mco1 : MCO1 :: Hsi ,
48+ mco1pre : MCOPRE :: Div1_no_div ,
49+ mco2 : MCO2 :: Sysclk ,
50+ mco2pre : MCOPRE :: Div1_no_div ,
4751 } ,
4852 }
4953 }
@@ -218,6 +222,53 @@ pub enum PLLP {
218222 Div8 = 0b11 ,
219223}
220224
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+
221272#[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
222273enum VOSscale {
223274 PwrScale1 ,
@@ -265,6 +316,10 @@ pub struct CFGR {
265316 plli2sr : u8 ,
266317 plli2sq : u8 ,
267318 plli2sn : u16 ,
319+ mco1 : MCO1 ,
320+ mco1pre : MCOPRE ,
321+ mco2 : MCO2 ,
322+ mco2pre : MCOPRE ,
268323}
269324
270325impl CFGR {
@@ -441,6 +496,30 @@ impl CFGR {
441496 self
442497 }
443498
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+
444523 /// Output clock calculation
445524 fn calculate_clocks ( & self ) -> ( Clocks , InternalRCCConfig ) {
446525 let mut config = InternalRCCConfig :: default ( ) ;
@@ -894,6 +973,17 @@ impl CFGR {
894973 rcc. cr . modify ( |_, w| w. plli2son ( ) . on ( ) ) ;
895974 }
896975
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+
897987 flash
898988 . acr
899989 . write ( |w| w. latency ( ) . bits ( config. flash_waitstates ) ) ;
@@ -1035,6 +1125,40 @@ impl GetBusFreq for APB2 {
10351125 }
10361126}
10371127
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+
10381162pub ( crate ) mod sealed {
10391163 /// Bus associated to peripheral
10401164 pub trait RccBus {
@@ -1266,7 +1390,7 @@ mod tests {
12661390
12671391 #[ test]
12681392 fn test_rcc_calc1 ( ) {
1269- use super :: { HSEClock , HSEClockMode , PLLP } ;
1393+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
12701394
12711395 let cfgr = CFGR {
12721396 hse : None ,
@@ -1284,6 +1408,10 @@ mod tests {
12841408 plli2sr : 2 ,
12851409 plli2sq : 2 ,
12861410 plli2sn : 192 ,
1411+ mco1 : MCO1 :: Hsi ,
1412+ mco1pre : MCOPRE :: Div1_no_div ,
1413+ mco2 : MCO2 :: Sysclk ,
1414+ mco2pre : MCOPRE :: Div1_no_div ,
12871415 } ;
12881416
12891417 let mut cfgr = cfgr
@@ -1302,7 +1430,7 @@ mod tests {
13021430
13031431 #[ test]
13041432 fn test_rcc_calc2 ( ) {
1305- use super :: { HSEClock , HSEClockMode , PLLP } ;
1433+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
13061434
13071435 let cfgr = CFGR {
13081436 hse : None ,
@@ -1320,6 +1448,10 @@ mod tests {
13201448 plli2sr : 2 ,
13211449 plli2sq : 2 ,
13221450 plli2sn : 192 ,
1451+ mco1 : MCO1 :: Hsi ,
1452+ mco1pre : MCOPRE :: Div1_no_div ,
1453+ mco2 : MCO2 :: Sysclk ,
1454+ mco2pre : MCOPRE :: Div1_no_div ,
13231455 } ;
13241456
13251457 let mut cfgr = cfgr
@@ -1337,7 +1469,7 @@ mod tests {
13371469
13381470 #[ test]
13391471 fn test_rcc_calc3 ( ) {
1340- use super :: { HSEClock , HSEClockMode , PLLP } ;
1472+ use super :: { HSEClock , HSEClockMode , MCO1 , MCO2 , MCOPRE , PLLP } ;
13411473
13421474 let cfgr = CFGR {
13431475 hse : None ,
@@ -1355,6 +1487,10 @@ mod tests {
13551487 plli2sr : 2 ,
13561488 plli2sq : 2 ,
13571489 plli2sn : 192 ,
1490+ mco1 : MCO1 :: Hsi ,
1491+ mco1pre : MCOPRE :: Div1_no_div ,
1492+ mco2 : MCO2 :: Sysclk ,
1493+ mco2pre : MCOPRE :: Div1_no_div ,
13581494 } ;
13591495
13601496 let mut cfgr = cfgr
@@ -1372,7 +1508,7 @@ mod tests {
13721508
13731509 #[ test]
13741510 fn test_rcc_default ( ) {
1375- use super :: PLLP ;
1511+ use super :: { MCO1 , MCO2 , MCOPRE , PLLP } ;
13761512
13771513 let mut cfgr = CFGR {
13781514 hse : None ,
@@ -1390,6 +1526,10 @@ mod tests {
13901526 plli2sr : 2 ,
13911527 plli2sq : 2 ,
13921528 plli2sn : 192 ,
1529+ mco1 : MCO1 :: Hsi ,
1530+ mco1pre : MCOPRE :: Div1_no_div ,
1531+ mco2 : MCO2 :: Sysclk ,
1532+ mco2pre : MCOPRE :: Div1_no_div ,
13931533 } ;
13941534
13951535 cfgr. pll_configure ( ) ;
0 commit comments