1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//! MCO (Microcontroller Clock Output)
//!
//! MCO is available on PA8 or PA9. See "Table 16. Alternate function port A" in the datasheet.

use crate::gpio::{gpioa, gpiob, AltMode, Analog};

pub trait Pin {
    fn into_mco(self);
}

impl Pin for gpioa::PA8<Analog> {
    fn into_mco(self) {
        self.set_alt_mode(AltMode::AF0);
    }
}

impl Pin for gpioa::PA9<Analog> {
    fn into_mco(self) {
        self.set_alt_mode(AltMode::AF0);
    }
}

impl Pin for gpiob::PB13<Analog> {
    fn into_mco(self) {
        self.set_alt_mode(AltMode::AF2);
    }
}

// Blanket impls to allow configuration of all MCO pins.
impl<P1, P2> Pin for (P1, P2)
where
    P1: Pin,
    P2: Pin,
{
    fn into_mco(self) {
        self.0.into_mco();
        self.1.into_mco();
    }
}

impl<P1, P2, P3> Pin for (P1, P2, P3)
where
    P1: Pin,
    P2: Pin,
    P3: Pin,
{
    fn into_mco(self) {
        self.0.into_mco();
        self.1.into_mco();
        self.2.into_mco();
    }
}