Skip to content

Commit a2b0b6f

Browse files
authored
Merge pull request #66 from stm32-rs/feature/pin-release
Pin release flow
2 parents 1355bc8 + ff3940b commit a2b0b6f

File tree

7 files changed

+113
-32
lines changed

7 files changed

+113
-32
lines changed

src/analog/comparator.rs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -521,36 +521,55 @@ impl ComparatorSplit for COMP {
521521

522522
pub trait OutputPin<COMP> {
523523
fn setup(&self);
524+
fn release(self) -> Self;
524525
}
525526

526-
macro_rules! output_pin {
527+
macro_rules! output_pin_push_pull {
527528
($COMP:ident, $pin:ty) => {
528529
impl OutputPin<$COMP> for $pin {
529530
fn setup(&self) {
530531
self.set_alt_mode(AltFunction::AF7)
531532
}
533+
534+
fn release(self) -> Self {
535+
self.into_push_pull_output()
536+
}
537+
}
538+
};
539+
}
540+
541+
macro_rules! output_pin_open_drain {
542+
($COMP:ident, $pin:ty) => {
543+
impl OutputPin<$COMP> for $pin {
544+
fn setup(&self) {
545+
self.set_alt_mode(AltFunction::AF7)
546+
}
547+
548+
fn release(self) -> Self {
549+
self.into_open_drain_output()
550+
}
532551
}
533552
};
534553
}
535554

536-
output_pin!(COMP1, gpioa::PA0<Output<PushPull>>);
537-
output_pin!(COMP1, gpioa::PA0<Output<OpenDrain>>);
538-
output_pin!(COMP1, gpioa::PA6<Output<PushPull>>);
539-
output_pin!(COMP1, gpioa::PA6<Output<OpenDrain>>);
540-
output_pin!(COMP1, gpioa::PA11<Output<PushPull>>);
541-
output_pin!(COMP1, gpioa::PA11<Output<OpenDrain>>);
542-
output_pin!(COMP1, gpiob::PB0<Output<PushPull>>);
543-
output_pin!(COMP1, gpiob::PB0<Output<OpenDrain>>);
544-
output_pin!(COMP1, gpiob::PB10<Output<PushPull>>);
545-
output_pin!(COMP1, gpiob::PB10<Output<OpenDrain>>);
546-
547-
output_pin!(COMP2, gpioa::PA2<Output<PushPull>>);
548-
output_pin!(COMP2, gpioa::PA2<Output<OpenDrain>>);
549-
output_pin!(COMP2, gpioa::PA7<Output<PushPull>>);
550-
output_pin!(COMP2, gpioa::PA7<Output<OpenDrain>>);
551-
output_pin!(COMP2, gpioa::PA12<Output<PushPull>>);
552-
output_pin!(COMP2, gpioa::PA12<Output<OpenDrain>>);
553-
output_pin!(COMP2, gpiob::PB5<Output<PushPull>>);
554-
output_pin!(COMP2, gpiob::PB5<Output<OpenDrain>>);
555-
output_pin!(COMP2, gpiob::PB11<Output<PushPull>>);
556-
output_pin!(COMP2, gpiob::PB11<Output<OpenDrain>>);
555+
output_pin_push_pull!(COMP1, gpioa::PA0<Output<PushPull>>);
556+
output_pin_open_drain!(COMP1, gpioa::PA0<Output<OpenDrain>>);
557+
output_pin_push_pull!(COMP1, gpioa::PA6<Output<PushPull>>);
558+
output_pin_open_drain!(COMP1, gpioa::PA6<Output<OpenDrain>>);
559+
output_pin_push_pull!(COMP1, gpioa::PA11<Output<PushPull>>);
560+
output_pin_open_drain!(COMP1, gpioa::PA11<Output<OpenDrain>>);
561+
output_pin_push_pull!(COMP1, gpiob::PB0<Output<PushPull>>);
562+
output_pin_open_drain!(COMP1, gpiob::PB0<Output<OpenDrain>>);
563+
output_pin_push_pull!(COMP1, gpiob::PB10<Output<PushPull>>);
564+
output_pin_open_drain!(COMP1, gpiob::PB10<Output<OpenDrain>>);
565+
566+
output_pin_push_pull!(COMP2, gpioa::PA2<Output<PushPull>>);
567+
output_pin_open_drain!(COMP2, gpioa::PA2<Output<OpenDrain>>);
568+
output_pin_push_pull!(COMP2, gpioa::PA7<Output<PushPull>>);
569+
output_pin_open_drain!(COMP2, gpioa::PA7<Output<OpenDrain>>);
570+
output_pin_push_pull!(COMP2, gpioa::PA12<Output<PushPull>>);
571+
output_pin_open_drain!(COMP2, gpioa::PA12<Output<OpenDrain>>);
572+
output_pin_push_pull!(COMP2, gpiob::PB5<Output<PushPull>>);
573+
output_pin_open_drain!(COMP2, gpiob::PB5<Output<OpenDrain>>);
574+
output_pin_push_pull!(COMP2, gpiob::PB11<Output<PushPull>>);
575+
output_pin_open_drain!(COMP2, gpiob::PB11<Output<OpenDrain>>);

src/i2c.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ pub struct I2c<I2C, SDA, SCL> {
8282
// I2C SDA pin
8383
pub trait SDAPin<I2C> {
8484
fn setup(&self);
85+
fn release(self) -> Self;
8586
}
8687

8788
// I2C SCL pin
8889
pub trait SCLPin<I2C> {
8990
fn setup(&self);
91+
fn release(self) -> Self;
9092
}
9193

9294
// I2C error
@@ -155,6 +157,10 @@ macro_rules! i2c {
155157
fn setup(&self) {
156158
self.set_alt_mode(AltFunction::AF6)
157159
}
160+
161+
fn release(self) -> Self {
162+
self.into_open_drain_output()
163+
}
158164
}
159165
)+
160166

@@ -163,6 +169,10 @@ macro_rules! i2c {
163169
fn setup(&self) {
164170
self.set_alt_mode(AltFunction::AF6)
165171
}
172+
173+
fn release(self) -> Self {
174+
self.into_open_drain_output()
175+
}
166176
}
167177
)+
168178

@@ -182,7 +192,10 @@ macro_rules! i2c {
182192
}
183193
}
184194

185-
impl<SDA, SCL> I2c<$I2CX, SDA, SCL> {
195+
impl<SDA, SCL> I2c<$I2CX, SDA, SCL> where
196+
SDA: SDAPin<$I2CX>,
197+
SCL: SCLPin<$I2CX>
198+
{
186199
pub fn $i2cx(i2c: $I2CX, sda: SDA, scl: SCL, config: Config, rcc: &mut Rcc) -> Self
187200
where
188201
SDA: SDAPin<$I2CX>,
@@ -220,7 +233,7 @@ macro_rules! i2c {
220233
}
221234

222235
pub fn release(self) -> ($I2CX, SDA, SCL) {
223-
(self.i2c, self.sda, self.scl)
236+
(self.i2c, self.sda.release(), self.scl.release())
224237
}
225238
}
226239

src/rcc/clockout.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl Lsco {
2020
}
2121

2222
pub fn release(self) -> LscoPin {
23-
self.pin
23+
self.pin.into_analog()
2424
}
2525
}
2626

@@ -52,7 +52,10 @@ pub struct Mco<PIN> {
5252
src_bits: u8,
5353
}
5454

55-
impl<PIN> Mco<PIN> {
55+
impl<PIN> Mco<PIN>
56+
where
57+
PIN: MCOExt<PIN>,
58+
{
5659
pub fn enable(&self) {
5760
let rcc = unsafe { &(*RCC::ptr()) };
5861
rcc.cfgr
@@ -65,12 +68,13 @@ impl<PIN> Mco<PIN> {
6568
}
6669

6770
pub fn release(self) -> PIN {
68-
self.pin
71+
self.pin.release()
6972
}
7073
}
7174

7275
pub trait MCOExt<PIN> {
7376
fn mco(self, src: MCOSrc, psc: Prescaler, rcc: &mut Rcc) -> Mco<PIN>;
77+
fn release(self) -> PIN;
7478
}
7579

7680
macro_rules! mco {
@@ -117,6 +121,10 @@ macro_rules! mco {
117121
self.set_alt_mode(AltFunction::AF0);
118122
Mco { src_bits, pin: self }
119123
}
124+
125+
fn release(self) -> $PIN {
126+
self.into_analog()
127+
}
120128
}
121129
)+
122130
};

src/serial/usart.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ macro_rules! uart_shared {
140140
tx: [ $(($PTX:ident, $TAF:expr),)+ ],
141141
rx: [ $(($PRX:ident, $RAF:expr),)+ ]) => {
142142

143-
144143
$(
145144
impl<MODE> TxPin<$USARTX> for $PTX<MODE> {
146145
fn setup(&self) {
@@ -640,6 +639,7 @@ rx: [
640639
(PB7, AltFunction::AF0),
641640
(PC5, AltFunction::AF1),
642641
]);
642+
643643
uart_shared!(USART2, USART2_RX, USART2_TX,
644644
tx: [
645645
(PA2, AltFunction::AF1),

src/spi.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,22 @@ pub struct NoMosi;
2525

2626
pub trait Pins<SPI> {
2727
fn setup(&self);
28+
fn release(self) -> Self;
2829
}
2930

3031
pub trait PinSck<SPI> {
3132
fn setup(&self);
33+
fn release(self) -> Self;
3234
}
3335

3436
pub trait PinMiso<SPI> {
3537
fn setup(&self);
38+
fn release(self) -> Self;
3639
}
3740

3841
pub trait PinMosi<SPI> {
3942
fn setup(&self);
43+
fn release(self) -> Self;
4044
}
4145

4246
impl<SPI, SCK, MISO, MOSI> Pins<SPI> for (SCK, MISO, MOSI)
@@ -50,6 +54,10 @@ where
5054
self.1.setup();
5155
self.2.setup();
5256
}
57+
58+
fn release(self) -> Self {
59+
(self.0.release(), self.1.release(), self.2.release())
60+
}
5361
}
5462

5563
#[derive(Debug)]
@@ -73,39 +81,63 @@ macro_rules! spi {
7381
) => {
7482
impl PinSck<$SPIX> for NoSck {
7583
fn setup(&self) {}
84+
85+
fn release(self) -> Self {
86+
self
87+
}
7688
}
7789

7890
impl PinMiso<$SPIX> for NoMiso {
7991
fn setup(&self) {}
92+
93+
fn release(self) -> Self {
94+
self
95+
}
8096
}
8197

8298
impl PinMosi<$SPIX> for NoMosi {
8399
fn setup(&self) {}
100+
101+
fn release(self) -> Self {
102+
self
103+
}
84104
}
85105

86106
$(
87107
impl PinSck<$SPIX> for $SCK {
88108
fn setup(&self) {
89109
self.set_alt_mode($SCK_AF);
90110
}
111+
112+
fn release(self) -> Self {
113+
self.into_analog()
114+
}
91115
}
92116
)*
93117
$(
94118
impl PinMiso<$SPIX> for $MISO {
95119
fn setup(&self) {
96120
self.set_alt_mode($MISO_AF);
97121
}
122+
123+
fn release(self) -> Self {
124+
self.into_analog()
125+
}
98126
}
99127
)*
100128
$(
101129
impl PinMosi<$SPIX> for $MOSI {
102130
fn setup(&self) {
103131
self.set_alt_mode($MOSI_AF);
104132
}
133+
134+
fn release(self) -> Self {
135+
self.into_analog()
136+
}
105137
}
106138
)*
107139

108-
impl<PINS> Spi<$SPIX, PINS> {
140+
impl<PINS: Pins<$SPIX>> Spi<$SPIX, PINS> {
109141
pub fn $spiX<T>(
110142
spi: $SPIX,
111143
pins: PINS,
@@ -114,7 +146,6 @@ macro_rules! spi {
114146
rcc: &mut Rcc
115147
) -> Self
116148
where
117-
PINS: Pins<$SPIX>,
118149
T: Into<Hertz>
119150
{
120151
// Enable clock for SPI
@@ -177,7 +208,7 @@ macro_rules! spi {
177208
}
178209

179210
pub fn release(self) -> ($SPIX, PINS) {
180-
(self.spi, self.pins)
211+
(self.spi, self.pins.release())
181212
}
182213
}
183214

src/timer/pins.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub trait TimerPin<TIM> {
1111
type Channel;
1212

1313
fn setup(&self);
14+
fn release(self) -> Self;
1415
}
1516

1617
macro_rules! timer_pins {
@@ -22,6 +23,10 @@ macro_rules! timer_pins {
2223
fn setup(&self) {
2324
self.set_alt_mode($af_mode);
2425
}
26+
27+
fn release(self) -> Self {
28+
self.into_analog()
29+
}
2530
}
2631
)+
2732
};

src/timer/qei.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub struct Qei<TIM, PINS> {
1717

1818
pub trait QeiPins<TIM> {
1919
fn setup(&self);
20+
fn release(self) -> Self;
2021
}
2122

2223
impl<TIM, P1, P2> QeiPins<TIM> for (P1, P2)
@@ -28,6 +29,10 @@ where
2829
self.0.setup();
2930
self.1.setup();
3031
}
32+
33+
fn release(self) -> Self {
34+
(self.0.release(), self.1.release())
35+
}
3136
}
3237

3338
pub trait QeiExt<TIM, PINS>
@@ -78,7 +83,7 @@ macro_rules! qei {
7883
}
7984

8085
pub fn release(self) -> ($TIMX, PINS) {
81-
(self.tim, self.pins)
86+
(self.tim, self.pins.release())
8287
}
8388
}
8489

0 commit comments

Comments
 (0)