Skip to content

Commit 9f3081f

Browse files
authored
Merge pull request #151 from systec-ms/mco
RCC: Add mco{1,2} to CFGR struct
2 parents 9e3bc23 + b57e38a commit 9f3081f

File tree

1 file changed

+144
-4
lines changed

1 file changed

+144
-4
lines changed

src/rcc.rs

Lines changed: 144 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
222273
enum 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

270325
impl 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+
10381162
pub(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

Comments
 (0)