Skip to content

Commit ebf566e

Browse files
committed
AF, speed, set_internal_resistor
1 parent ce4994c commit ebf566e

File tree

7 files changed

+146
-185
lines changed

7 files changed

+146
-185
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
### Changed
1111

12+
- Add `AFn` type aliases for `Alternate<n>`
1213
- CI updates + cache
1314
- Add missing `embedded-hal 1.0` for `DynamicPin`
1415
- Remove pull resistor from `Input` mode, use `Pull` enum instead, add universal `into_mode` pin converter

examples/f413disco_lcd_ferris.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -735,10 +735,7 @@ fn main() -> ! {
735735
};
736736

737737
// Setup the RESET pin
738-
let rst = gpiob
739-
.pb13
740-
.into_push_pull_output()
741-
.set_speed(Speed::VeryHigh);
738+
let rst = gpiob.pb13.into_push_pull_output().speed(Speed::VeryHigh);
742739

743740
// We're not using the "tearing" signal from the display
744741
let mut _te = gpiob.pb14.into_floating_input();

src/fsmc_lcd/pins.rs

Lines changed: 67 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -598,161 +598,93 @@ mod common_pins {
598598
PinD8, PinD9, PinReadEnable, PinWriteEnable,
599599
};
600600
use crate::gpio::{
601-
Alternate, PushPull, PD0, PD1, PD10, PD11, PD12, PD13, PD14, PD15, PD4, PD5, PD7, PD8, PD9,
602-
PE10, PE11, PE12, PE13, PE14, PE15, PE2, PE3, PE4, PE5, PE6, PE7, PE8, PE9, PF0, PF1, PF12,
603-
PF13, PF14, PF15, PF2, PF3, PF4, PF5, PG0, PG1, PG10, PG12, PG13, PG2, PG3, PG4, PG5, PG9,
601+
Pin, AF12, PD0, PD1, PD10, PD11, PD12, PD13, PD14, PD15, PD4, PD5, PD7, PD8, PD9, PE10,
602+
PE11, PE12, PE13, PE14, PE15, PE2, PE3, PE4, PE5, PE6, PE7, PE8, PE9, PF0, PF1, PF12, PF13,
603+
PF14, PF15, PF2, PF3, PF4, PF5, PG0, PG1, PG10, PG12, PG13, PG2, PG3, PG4, PG5, PG9,
604604
};
605605

606+
impl<const P: char, const N: u8, MODE> Sealed for Pin<P, N, MODE> {}
607+
606608
// All FSMC/FMC pins use AF12
607-
type FmcAlternate = Alternate<12, PushPull>;
608609

609-
impl PinD2 for PD0<FmcAlternate> {}
610-
impl PinD3 for PD1<FmcAlternate> {}
611-
impl PinReadEnable for PD4<FmcAlternate> {}
612-
impl PinWriteEnable for PD5<FmcAlternate> {}
613-
impl PinChipSelect1 for PD7<FmcAlternate> {}
614-
impl Sealed for PD7<FmcAlternate> {}
615-
impl PinD13 for PD8<FmcAlternate> {}
616-
impl PinD14 for PD9<FmcAlternate> {}
617-
impl PinD15 for PD10<FmcAlternate> {}
618-
impl PinAddress for PD11<FmcAlternate> {}
619-
impl Sealed for PD11<FmcAlternate> {}
620-
impl PinAddress for PD12<FmcAlternate> {}
621-
impl Sealed for PD12<FmcAlternate> {}
622-
impl PinAddress for PD13<FmcAlternate> {}
623-
impl Sealed for PD13<FmcAlternate> {}
624-
impl PinD0 for PD14<FmcAlternate> {}
625-
impl PinD1 for PD15<FmcAlternate> {}
626-
impl PinAddress for PE2<FmcAlternate> {}
627-
impl Sealed for PE2<FmcAlternate> {}
628-
impl PinAddress for PE3<FmcAlternate> {}
629-
impl Sealed for PE3<FmcAlternate> {}
630-
impl PinAddress for PE4<FmcAlternate> {}
631-
impl Sealed for PE4<FmcAlternate> {}
632-
impl PinAddress for PE5<FmcAlternate> {}
633-
impl Sealed for PE5<FmcAlternate> {}
634-
impl PinAddress for PE6<FmcAlternate> {}
635-
impl Sealed for PE6<FmcAlternate> {}
636-
impl PinD4 for PE7<FmcAlternate> {}
637-
impl PinD5 for PE8<FmcAlternate> {}
638-
impl PinD6 for PE9<FmcAlternate> {}
639-
impl PinD7 for PE10<FmcAlternate> {}
640-
impl PinD8 for PE11<FmcAlternate> {}
641-
impl PinD9 for PE12<FmcAlternate> {}
642-
impl PinD10 for PE13<FmcAlternate> {}
643-
impl PinD11 for PE14<FmcAlternate> {}
644-
impl PinD12 for PE15<FmcAlternate> {}
610+
impl PinD2 for PD0<AF12> {}
611+
impl PinD3 for PD1<AF12> {}
612+
impl PinReadEnable for PD4<AF12> {}
613+
impl PinWriteEnable for PD5<AF12> {}
614+
impl PinChipSelect1 for PD7<AF12> {}
615+
impl PinD13 for PD8<AF12> {}
616+
impl PinD14 for PD9<AF12> {}
617+
impl PinD15 for PD10<AF12> {}
618+
impl PinAddress for PD11<AF12> {}
619+
impl PinAddress for PD12<AF12> {}
620+
impl PinAddress for PD13<AF12> {}
621+
impl PinD0 for PD14<AF12> {}
622+
impl PinD1 for PD15<AF12> {}
623+
impl PinAddress for PE2<AF12> {}
624+
impl PinAddress for PE3<AF12> {}
625+
impl PinAddress for PE4<AF12> {}
626+
impl PinAddress for PE5<AF12> {}
627+
impl PinAddress for PE6<AF12> {}
628+
impl PinD4 for PE7<AF12> {}
629+
impl PinD5 for PE8<AF12> {}
630+
impl PinD6 for PE9<AF12> {}
631+
impl PinD7 for PE10<AF12> {}
632+
impl PinD8 for PE11<AF12> {}
633+
impl PinD9 for PE12<AF12> {}
634+
impl PinD10 for PE13<AF12> {}
635+
impl PinD11 for PE14<AF12> {}
636+
impl PinD12 for PE15<AF12> {}
645637

646-
impl PinAddress for PF0<FmcAlternate> {}
647-
impl Sealed for PF0<FmcAlternate> {}
648-
impl PinAddress for PF1<FmcAlternate> {}
649-
impl Sealed for PF1<FmcAlternate> {}
650-
impl PinAddress for PF2<FmcAlternate> {}
651-
impl Sealed for PF2<FmcAlternate> {}
652-
impl PinAddress for PF3<FmcAlternate> {}
653-
impl Sealed for PF3<FmcAlternate> {}
654-
impl PinAddress for PF4<FmcAlternate> {}
655-
impl Sealed for PF4<FmcAlternate> {}
656-
impl PinAddress for PF5<FmcAlternate> {}
657-
impl Sealed for PF5<FmcAlternate> {}
658-
impl PinAddress for PF12<FmcAlternate> {}
659-
impl Sealed for PF12<FmcAlternate> {}
660-
impl PinAddress for PF13<FmcAlternate> {}
661-
impl Sealed for PF13<FmcAlternate> {}
662-
impl PinAddress for PF14<FmcAlternate> {}
663-
impl Sealed for PF14<FmcAlternate> {}
664-
impl PinAddress for PF15<FmcAlternate> {}
665-
impl Sealed for PF15<FmcAlternate> {}
666-
impl PinAddress for PG0<FmcAlternate> {}
667-
impl Sealed for PG0<FmcAlternate> {}
668-
impl PinAddress for PG1<FmcAlternate> {}
669-
impl Sealed for PG1<FmcAlternate> {}
670-
impl PinAddress for PG2<FmcAlternate> {}
671-
impl Sealed for PG2<FmcAlternate> {}
672-
impl PinAddress for PG3<FmcAlternate> {}
673-
impl Sealed for PG3<FmcAlternate> {}
674-
impl PinAddress for PG4<FmcAlternate> {}
675-
impl Sealed for PG4<FmcAlternate> {}
676-
impl PinAddress for PG5<FmcAlternate> {}
677-
impl Sealed for PG5<FmcAlternate> {}
678-
impl PinChipSelect2 for PG9<FmcAlternate> {}
679-
impl Sealed for PG9<FmcAlternate> {}
680-
impl PinChipSelect3 for PG10<FmcAlternate> {}
681-
impl Sealed for PG10<FmcAlternate> {}
682-
impl PinChipSelect4 for PG12<FmcAlternate> {}
683-
impl Sealed for PG12<FmcAlternate> {}
684-
impl PinAddress for PG13<FmcAlternate> {}
685-
impl Sealed for PG13<FmcAlternate> {}
638+
impl PinAddress for PF0<AF12> {}
639+
impl PinAddress for PF1<AF12> {}
640+
impl PinAddress for PF2<AF12> {}
641+
impl PinAddress for PF3<AF12> {}
642+
impl PinAddress for PF4<AF12> {}
643+
impl PinAddress for PF5<AF12> {}
644+
impl PinAddress for PF12<AF12> {}
645+
impl PinAddress for PF13<AF12> {}
646+
impl PinAddress for PF14<AF12> {}
647+
impl PinAddress for PF15<AF12> {}
648+
impl PinAddress for PG0<AF12> {}
649+
impl PinAddress for PG1<AF12> {}
650+
impl PinAddress for PG2<AF12> {}
651+
impl PinAddress for PG3<AF12> {}
652+
impl PinAddress for PG4<AF12> {}
653+
impl PinAddress for PG5<AF12> {}
654+
impl PinChipSelect2 for PG9<AF12> {}
655+
impl PinChipSelect3 for PG10<AF12> {}
656+
impl PinChipSelect4 for PG12<AF12> {}
657+
impl PinAddress for PG13<AF12> {}
686658
// PG14<Alternate<12> can be used as address 25 (A25), but that pin is not available here.
687659
// Because external addresses are in units of 16 bits, external address line 25 can never
688660
// be high. The internal memory address would overflow into the next sub-bank.
689-
690-
// Sealed trait boilerplate
691-
impl Sealed for PD0<FmcAlternate> {}
692-
impl Sealed for PD1<FmcAlternate> {}
693-
impl Sealed for PD4<FmcAlternate> {}
694-
impl Sealed for PD5<FmcAlternate> {}
695-
impl Sealed for PD8<FmcAlternate> {}
696-
impl Sealed for PD9<FmcAlternate> {}
697-
impl Sealed for PD10<FmcAlternate> {}
698-
impl Sealed for PD14<FmcAlternate> {}
699-
impl Sealed for PD15<FmcAlternate> {}
700-
701-
impl Sealed for PE7<FmcAlternate> {}
702-
impl Sealed for PE8<FmcAlternate> {}
703-
impl Sealed for PE9<FmcAlternate> {}
704-
impl Sealed for PE10<FmcAlternate> {}
705-
impl Sealed for PE11<FmcAlternate> {}
706-
impl Sealed for PE12<FmcAlternate> {}
707-
impl Sealed for PE13<FmcAlternate> {}
708-
impl Sealed for PE14<FmcAlternate> {}
709-
impl Sealed for PE15<FmcAlternate> {}
710661
}
711662

712663
/// Additional pins available on some models
713664
#[cfg(any(feature = "stm32f412", feature = "stm32f413", feature = "stm32f423"))]
714665
mod extra_pins {
715-
use super::sealed::Sealed;
716666
use super::{
717667
PinAddress, PinChipSelect4, PinD0, PinD1, PinD13, PinD2, PinD3, PinD4, PinD5, PinD6, PinD7,
718668
PinReadEnable, PinWriteEnable,
719669
};
720670
use crate::gpio::{
721-
Alternate, PushPull, PA2, PA3, PA4, PA5, PB12, PB14, PC11, PC12, PC2, PC3, PC4, PC5, PC6,
722-
PD2,
671+
AF10, AF12, PA2, PA3, PA4, PA5, PB12, PB14, PC11, PC12, PC2, PC3, PC4, PC5, PC6, PD2,
723672
};
724673

725674
// Most FSMC/FMC pins use AF12, but a few use AF10
726-
type FmcAlternate = Alternate<12, PushPull>;
727-
728-
impl PinD4 for PA2<FmcAlternate> {}
729-
impl PinD5 for PA3<FmcAlternate> {}
730-
impl PinD6 for PA4<FmcAlternate> {}
731-
impl PinD7 for PA5<FmcAlternate> {}
732-
impl PinD13 for PB12<FmcAlternate> {}
733-
impl PinD0 for PB14<Alternate<10, PushPull>> {}
734-
impl PinWriteEnable for PC2<FmcAlternate> {}
735-
impl PinAddress for PC3<FmcAlternate> {}
736-
impl Sealed for PC3<FmcAlternate> {}
737-
impl PinChipSelect4 for PC4<FmcAlternate> {}
738-
impl Sealed for PC4<FmcAlternate> {}
739-
impl PinReadEnable for PC5<FmcAlternate> {}
740-
impl PinD1 for PC6<Alternate<10, PushPull>> {}
741-
impl PinD2 for PC11<Alternate<10, PushPull>> {}
742-
impl PinD3 for PC12<Alternate<10, PushPull>> {}
743-
impl PinWriteEnable for PD2<Alternate<10, PushPull>> {}
744675

745-
// Sealed trait boilerplate
746-
impl Sealed for PA2<FmcAlternate> {}
747-
impl Sealed for PA3<FmcAlternate> {}
748-
impl Sealed for PA4<FmcAlternate> {}
749-
impl Sealed for PA5<FmcAlternate> {}
750-
impl Sealed for PB12<FmcAlternate> {}
751-
impl Sealed for PB14<Alternate<10, PushPull>> {}
752-
impl Sealed for PC2<FmcAlternate> {}
753-
impl Sealed for PC5<FmcAlternate> {}
754-
impl Sealed for PC6<Alternate<10, PushPull>> {}
755-
impl Sealed for PC11<Alternate<10, PushPull>> {}
756-
impl Sealed for PC12<Alternate<10, PushPull>> {}
757-
impl Sealed for PD2<Alternate<10, PushPull>> {}
676+
impl PinD4 for PA2<AF12> {}
677+
impl PinD5 for PA3<AF12> {}
678+
impl PinD6 for PA4<AF12> {}
679+
impl PinD7 for PA5<AF12> {}
680+
impl PinD13 for PB12<AF12> {}
681+
impl PinD0 for PB14<AF10> {}
682+
impl PinWriteEnable for PC2<AF12> {}
683+
impl PinAddress for PC3<AF12> {}
684+
impl PinChipSelect4 for PC4<AF12> {}
685+
impl PinReadEnable for PC5<AF12> {}
686+
impl PinD1 for PC6<AF10> {}
687+
impl PinD2 for PC11<AF10> {}
688+
impl PinD3 for PC12<AF10> {}
689+
impl PinWriteEnable for PD2<AF10> {}
758690
}

src/gpio.rs

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,34 @@ pub enum Edge {
174174
RisingFalling,
175175
}
176176

177+
macro_rules! af {
178+
($($i:literal: $AFi:ident),+) => {
179+
$(
180+
#[doc = concat!("Alternate function ", $i, " (type state)" )]
181+
pub type $AFi<Otype = PushPull> = Alternate<$i, Otype>;
182+
)+
183+
};
184+
}
185+
186+
af!(
187+
0: AF0,
188+
1: AF1,
189+
2: AF2,
190+
3: AF3,
191+
4: AF4,
192+
5: AF5,
193+
6: AF6,
194+
7: AF7,
195+
8: AF8,
196+
9: AF9,
197+
10: AF10,
198+
11: AF11,
199+
12: AF12,
200+
13: AF13,
201+
14: AF14,
202+
15: AF15
203+
);
204+
177205
use sealed::Interruptable;
178206
impl<MODE> Interruptable for Output<MODE> {}
179207
impl Interruptable for Input {}
@@ -327,41 +355,42 @@ where
327355
MODE: sealed::OutputSpeed,
328356
{
329357
/// Set pin speed
330-
pub fn set_speed(self, speed: Speed) -> Self {
358+
pub fn set_speed(&mut self, speed: Speed) {
331359
let offset = 2 * { N };
332360

333361
unsafe {
334362
(*Gpio::<P>::ptr())
335363
.ospeedr
336-
.modify(|r, w| w.bits((r.bits() & !(0b11 << offset)) | ((speed as u32) << offset)))
337-
};
364+
.modify(|r, w| w.bits((r.bits() & !(0b11 << offset)) | ((speed as u32) << offset)));
365+
}
366+
}
338367

368+
/// Set pin speed
369+
pub fn speed(mut self, speed: Speed) -> Self {
370+
self.set_speed(speed);
339371
self
340372
}
341373
}
342374

343-
impl<const P: char, const N: u8, MODE> Pin<P, N, MODE> {
375+
impl<const P: char, const N: u8, MODE> Pin<P, N, MODE>
376+
where
377+
MODE: sealed::Active,
378+
{
344379
/// Set the internal pull-up and pull-down resistor
345-
fn _internal_resistor(self, resistor: Pull) -> Self {
380+
pub fn set_internal_resistor(&mut self, resistor: Pull) {
346381
let offset = 2 * { N };
347382
let value = resistor as u32;
348383
unsafe {
349384
(*Gpio::<P>::ptr())
350385
.pupdr
351-
.modify(|r, w| w.bits((r.bits() & !(0b11 << offset)) | (value << offset)))
352-
};
353-
354-
self
386+
.modify(|r, w| w.bits((r.bits() & !(0b11 << offset)) | (value << offset)));
387+
}
355388
}
356-
}
357389

358-
impl<const P: char, const N: u8, MODE> Pin<P, N, MODE>
359-
where
360-
MODE: sealed::Active,
361-
{
362390
/// Set the internal pull-up and pull-down resistor
363-
pub fn internal_resistor(self, resistor: Pull) -> Self {
364-
self._internal_resistor(resistor)
391+
pub fn internal_resistor(mut self, resistor: Pull) -> Self {
392+
self.set_internal_resistor(resistor);
393+
self
365394
}
366395

367396
/// Enables / disables the internal pull up

src/gpio/convert.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,17 @@ impl<const P: char, const N: u8, MODE: PinMode> Pin<P, N, MODE> {
145145

146146
/// Configures the pin to operate as a floating input pin
147147
pub fn into_floating_input(self) -> Pin<P, N, Input> {
148-
self.into_mode()._internal_resistor(Pull::None)
148+
self.into_mode().internal_resistor(Pull::None)
149149
}
150150

151151
/// Configures the pin to operate as a pulled down input pin
152152
pub fn into_pull_down_input(self) -> Pin<P, N, Input> {
153-
self.into_mode()._internal_resistor(Pull::Down)
153+
self.into_mode().internal_resistor(Pull::Down)
154154
}
155155

156156
/// Configures the pin to operate as a pulled up input pin
157157
pub fn into_pull_up_input(self) -> Pin<P, N, Input> {
158-
self.into_mode()._internal_resistor(Pull::Up)
158+
self.into_mode().internal_resistor(Pull::Up)
159159
}
160160

161161
/// Configures the pin to operate as an open drain output pin

0 commit comments

Comments
 (0)