Skip to content

Commit d0c58e9

Browse files
authored
Low-power wakeup feature & GPIO refactoring (#116)
* implement wakeup pins * wakeup refactoring * wakeup name refactoring * fix typo * rexport gpio pins * fix formatting
1 parent f5641a3 commit d0c58e9

File tree

14 files changed

+168
-76
lines changed

14 files changed

+168
-76
lines changed

examples/opm.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ extern crate rtic;
99
extern crate stm32g0xx_hal as hal;
1010

1111
use hal::exti::Event;
12-
use hal::gpio::gpioa::PA5;
13-
use hal::gpio::{Output, PushPull, SignalEdge};
12+
use hal::gpio::*;
1413
use hal::prelude::*;
1514
use hal::rcc;
1615
use hal::stm32;

examples/rtic.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ extern crate stm32g0xx_hal as hal;
1010

1111
use cortex_m_semihosting::hprintln;
1212
use hal::exti::Event;
13-
use hal::gpio::gpioa::PA5;
14-
use hal::gpio::{Output, PushPull, SignalEdge};
13+
use hal::gpio::*;
1514
use hal::prelude::*;
1615
use hal::rtc::Rtc;
1716
use hal::stm32;

examples/rtic_low_power.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ extern crate rtic;
99
extern crate stm32g0xx_hal as hal;
1010

1111
use hal::exti::Event;
12-
use hal::gpio::gpioa::PA5;
13-
use hal::gpio::{Output, PushPull, SignalEdge};
12+
use hal::gpio::*;
1413
use hal::power::{LowPowerMode, PowerMode};
1514
use hal::prelude::*;
1615
use hal::rcc::{self, Prescaler};

src/analog/adc.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -453,21 +453,21 @@ macro_rules! adc_pin {
453453
}
454454

455455
adc_pin! {
456-
Channel0: (gpioa::PA0<Analog>, 0u8),
457-
Channel1: (gpioa::PA1<Analog>, 1u8),
458-
Channel2: (gpioa::PA2<Analog>, 2u8),
459-
Channel3: (gpioa::PA3<Analog>, 3u8),
460-
Channel4: (gpioa::PA4<Analog>, 4u8),
461-
Channel5: (gpioa::PA5<Analog>, 5u8),
462-
Channel6: (gpioa::PA6<Analog>, 6u8),
463-
Channel7: (gpioa::PA7<Analog>, 7u8),
464-
Channel8: (gpiob::PB0<Analog>, 8u8),
465-
Channel9: (gpiob::PB1<Analog>, 9u8),
466-
Channel10: (gpiob::PB2<Analog>, 10u8),
467-
Channel11: (gpiob::PB10<Analog>, 11u8),
468-
Channel11: (gpiob::PB7<Analog>, 11u8),
469-
Channel15: (gpiob::PB11<Analog>, 15u8),
470-
Channel16: (gpiob::PB12<Analog>, 16u8),
471-
Channel17: (gpioc::PC4<Analog>, 17u8),
472-
Channel18: (gpioc::PC5<Analog>, 18u8),
456+
Channel0: (PA0<Analog>, 0u8),
457+
Channel1: (PA1<Analog>, 1u8),
458+
Channel2: (PA2<Analog>, 2u8),
459+
Channel3: (PA3<Analog>, 3u8),
460+
Channel4: (PA4<Analog>, 4u8),
461+
Channel5: (PA5<Analog>, 5u8),
462+
Channel6: (PA6<Analog>, 6u8),
463+
Channel7: (PA7<Analog>, 7u8),
464+
Channel8: (PB0<Analog>, 8u8),
465+
Channel9: (PB1<Analog>, 9u8),
466+
Channel10: (PB2<Analog>, 10u8),
467+
Channel11: (PB10<Analog>, 11u8),
468+
Channel11: (PB7<Analog>, 11u8),
469+
Channel15: (PB11<Analog>, 15u8),
470+
Channel16: (PB12<Analog>, 16u8),
471+
Channel17: (PC4<Analog>, 17u8),
472+
Channel18: (PC5<Analog>, 18u8),
473473
}

src/analog/comparator.rs

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,14 @@ macro_rules! positive_input_pin {
155155
};
156156
}
157157

158-
positive_input_pin!(COMP1, gpioc::PC5<Analog>, 0b00);
159-
positive_input_pin!(COMP1, gpiob::PB2<Analog>, 0b01);
160-
positive_input_pin!(COMP1, gpioa::PA1<Analog>, 0b10);
158+
positive_input_pin!(COMP1, PC5<Analog>, 0b00);
159+
positive_input_pin!(COMP1, PB2<Analog>, 0b01);
160+
positive_input_pin!(COMP1, PA1<Analog>, 0b10);
161161
positive_input_pin!(COMP1, Open, 0b11);
162162

163-
positive_input_pin!(COMP2, gpiob::PB4<Analog>, 0b00);
164-
positive_input_pin!(COMP2, gpiob::PB6<Analog>, 0b01);
165-
positive_input_pin!(COMP2, gpioa::PA3<Analog>, 0b10);
163+
positive_input_pin!(COMP2, PB4<Analog>, 0b00);
164+
positive_input_pin!(COMP2, PB6<Analog>, 0b01);
165+
positive_input_pin!(COMP2, PA3<Analog>, 0b10);
166166
positive_input_pin!(COMP2, Open, 0b11);
167167

168168
macro_rules! negative_input_pin {
@@ -175,13 +175,13 @@ macro_rules! negative_input_pin {
175175
};
176176
}
177177

178-
negative_input_pin!(COMP1, gpiob::PB1<Analog>, 0b0110);
179-
negative_input_pin!(COMP1, gpioc::PC4<Analog>, 0b0111);
180-
negative_input_pin!(COMP1, gpioa::PA0<Analog>, 0b1000);
178+
negative_input_pin!(COMP1, PB1<Analog>, 0b0110);
179+
negative_input_pin!(COMP1, PC4<Analog>, 0b0111);
180+
negative_input_pin!(COMP1, PA0<Analog>, 0b1000);
181181

182-
negative_input_pin!(COMP2, gpiob::PB3<Analog>, 0b0110);
183-
negative_input_pin!(COMP2, gpiob::PB7<Analog>, 0b0111);
184-
negative_input_pin!(COMP2, gpioa::PA2<Analog>, 0b1000);
182+
negative_input_pin!(COMP2, PB3<Analog>, 0b0110);
183+
negative_input_pin!(COMP2, PB7<Analog>, 0b0111);
184+
negative_input_pin!(COMP2, PA2<Analog>, 0b1000);
185185

186186
#[derive(Copy, Clone, Eq, PartialEq)]
187187
pub enum RefintInput {
@@ -552,24 +552,24 @@ macro_rules! output_pin_open_drain {
552552
};
553553
}
554554

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>>);
555+
output_pin_push_pull!(COMP1, PA0<Output<PushPull>>);
556+
output_pin_open_drain!(COMP1, PA0<Output<OpenDrain>>);
557+
output_pin_push_pull!(COMP1, PA6<Output<PushPull>>);
558+
output_pin_open_drain!(COMP1, PA6<Output<OpenDrain>>);
559+
output_pin_push_pull!(COMP1, PA11<Output<PushPull>>);
560+
output_pin_open_drain!(COMP1, PA11<Output<OpenDrain>>);
561+
output_pin_push_pull!(COMP1, PB0<Output<PushPull>>);
562+
output_pin_open_drain!(COMP1, PB0<Output<OpenDrain>>);
563+
output_pin_push_pull!(COMP1, PB10<Output<PushPull>>);
564+
output_pin_open_drain!(COMP1, PB10<Output<OpenDrain>>);
565+
566+
output_pin_push_pull!(COMP2, PA2<Output<PushPull>>);
567+
output_pin_open_drain!(COMP2, PA2<Output<OpenDrain>>);
568+
output_pin_push_pull!(COMP2, PA7<Output<PushPull>>);
569+
output_pin_open_drain!(COMP2, PA7<Output<OpenDrain>>);
570+
output_pin_push_pull!(COMP2, PA12<Output<PushPull>>);
571+
output_pin_open_drain!(COMP2, PA12<Output<OpenDrain>>);
572+
output_pin_push_pull!(COMP2, PB5<Output<PushPull>>);
573+
output_pin_open_drain!(COMP2, PB5<Output<OpenDrain>>);
574+
output_pin_push_pull!(COMP2, PB11<Output<PushPull>>);
575+
output_pin_open_drain!(COMP2, PB11<Output<OpenDrain>>);

src/analog/dac.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
use core::marker::PhantomData;
44
use core::mem::MaybeUninit;
55

6-
use crate::gpio::gpioa::{PA4, PA5};
7-
use crate::gpio::DefaultMode;
6+
use crate::gpio::{DefaultMode, PA4, PA5};
87
use crate::rcc::*;
98
use crate::stm32::DAC;
109
use hal::blocking::delay::DelayUs;

src/gpio.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,16 @@ impl<MODE> InputPin for Pin<Input<MODE>> {
154154
}
155155

156156
/// GPIO Pin speed selection
157+
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
157158
pub enum Speed {
158159
Low = 0,
159160
Medium = 1,
160161
High = 2,
161162
VeryHigh = 3,
162163
}
163164

164-
/// Trigger edgw
165+
/// Trigger edge
166+
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
165167
pub enum SignalEdge {
166168
Rising,
167169
Falling,
@@ -631,8 +633,9 @@ macro_rules! gpio {
631633
}
632634
}
633635
}
634-
635636
}
637+
638+
pub use $gpiox::{ $($PXi,)+ };
636639
}
637640
}
638641

src/i2c/blocking.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! I2C
2-
use crate::gpio::{gpioa::*, gpiob::*};
3-
use crate::gpio::{AltFunction, OpenDrain, Output};
2+
use crate::gpio::*;
43
use crate::i2c::config::Config;
54
use crate::i2c::{Error, I2c, I2cDirection, I2cExt, SCLPin, SDAPin};
65
use crate::rcc::*;

src/i2c/nonblocking.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! I2C
2-
use crate::gpio::{gpioa::*, gpiob::*};
2+
use crate::gpio::*;
33
use crate::gpio::{AltFunction, OpenDrain, Output};
44
use crate::i2c::config::Config;
55
use crate::i2c::{Error, I2c, I2cDirection, I2cExt, I2cResult, SCLPin, SDAPin};

src/power.rs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Power control
22
33
use crate::{
4+
gpio::*,
45
rcc::{Enable, Rcc},
56
stm32::PWR,
67
};
@@ -18,6 +19,16 @@ pub enum PowerMode {
1819
UltraLowPower(LowPowerMode),
1920
}
2021

22+
pub enum WakeUp {
23+
InternalLine,
24+
Line1,
25+
Line2,
26+
// TODO: Line3 missing in SVD file
27+
Line4,
28+
Line5,
29+
Line6,
30+
}
31+
2132
pub struct Power {
2233
rb: PWR,
2334
}
@@ -28,6 +39,76 @@ impl Power {
2839
Self { rb: pwr }
2940
}
3041

42+
pub fn get_standby_flag(&mut self) -> bool {
43+
self.rb.sr1.read().sbf().bit_is_set()
44+
}
45+
46+
pub fn get_wakeup_flag<L: Into<WakeUp>>(&self, lane: L) -> bool {
47+
match lane.into() {
48+
WakeUp::Line1 => self.rb.sr1.read().wuf1().bit_is_set(),
49+
WakeUp::Line2 => self.rb.sr1.read().wuf2().bit_is_set(),
50+
WakeUp::Line4 => self.rb.sr1.read().wuf4().bit_is_set(),
51+
WakeUp::Line5 => self.rb.sr1.read().wuf5().bit_is_set(),
52+
WakeUp::Line6 => self.rb.sr1.read().wuf6().bit_is_set(),
53+
_ => false,
54+
}
55+
}
56+
57+
pub fn clear_wakeup_flag<L: Into<WakeUp>>(&mut self, lane: L) {
58+
match lane.into() {
59+
WakeUp::Line1 => self.rb.scr.write(|w| w.cwuf1().set_bit()),
60+
WakeUp::Line2 => self.rb.scr.write(|w| w.cwuf2().set_bit()),
61+
WakeUp::Line4 => self.rb.scr.write(|w| w.cwuf4().set_bit()),
62+
WakeUp::Line5 => self.rb.scr.write(|w| w.cwuf5().set_bit()),
63+
WakeUp::Line6 => self.rb.scr.write(|w| w.cwuf6().set_bit()),
64+
_ => {}
65+
}
66+
}
67+
68+
pub fn clear_standby_flag(&mut self) {
69+
self.rb.scr.write(|w| w.csbf().set_bit());
70+
}
71+
72+
pub fn enable_wakeup_lane<L: Into<WakeUp>>(&mut self, lane: L, edge: SignalEdge) {
73+
assert!(edge != SignalEdge::All);
74+
75+
let edge = edge == SignalEdge::Falling;
76+
match lane.into() {
77+
WakeUp::Line1 => {
78+
self.rb.cr3.modify(|_, w| w.ewup1().set_bit());
79+
self.rb.cr4.modify(|_, w| w.wp1().bit(edge));
80+
}
81+
WakeUp::Line2 => {
82+
self.rb.cr3.modify(|_, w| w.ewup2().set_bit());
83+
self.rb.cr4.modify(|_, w| w.wp2().bit(edge));
84+
}
85+
WakeUp::Line4 => {
86+
self.rb.cr3.modify(|_, w| w.ewup4().set_bit());
87+
self.rb.cr4.modify(|_, w| w.wp4().bit(edge));
88+
}
89+
WakeUp::Line5 => {
90+
self.rb.cr3.modify(|_, w| w.ewup5().set_bit());
91+
self.rb.cr4.modify(|_, w| w.wp5().bit(edge));
92+
}
93+
WakeUp::Line6 => {
94+
self.rb.cr3.modify(|_, w| w.ewup6().set_bit());
95+
self.rb.cr4.modify(|_, w| w.wp6().bit(edge));
96+
}
97+
WakeUp::InternalLine => self.rb.cr3.modify(|_, w| w.eiwul().set_bit()),
98+
}
99+
}
100+
101+
pub fn disable_wakeup_lane<L: Into<WakeUp>>(&mut self, lane: L) {
102+
match lane.into() {
103+
WakeUp::Line1 => self.rb.cr3.modify(|_, w| w.ewup1().clear_bit()),
104+
WakeUp::Line2 => self.rb.cr3.modify(|_, w| w.ewup2().clear_bit()),
105+
WakeUp::Line4 => self.rb.cr3.modify(|_, w| w.ewup4().clear_bit()),
106+
WakeUp::Line5 => self.rb.cr3.modify(|_, w| w.ewup5().clear_bit()),
107+
WakeUp::Line6 => self.rb.cr3.modify(|_, w| w.ewup6().clear_bit()),
108+
WakeUp::InternalLine => self.rb.cr3.modify(|_, w| w.eiwul().clear_bit()),
109+
}
110+
}
111+
31112
pub fn set_mode(&mut self, mode: PowerMode) {
32113
match mode {
33114
PowerMode::Run => {
@@ -56,6 +137,27 @@ impl Power {
56137
}
57138
}
58139

140+
macro_rules! wakeup_pins {
141+
($($PIN:path: $line:expr,)+) => {
142+
$(
143+
impl<M> From<&$PIN> for WakeUp {
144+
fn from(_: &$PIN) -> Self {
145+
$line
146+
}
147+
}
148+
)+
149+
}
150+
}
151+
152+
wakeup_pins! {
153+
PA0<M>: WakeUp::Line1,
154+
PA4<M>: WakeUp::Line2,
155+
PC13<M>: WakeUp::Line2,
156+
PA2<M>: WakeUp::Line4,
157+
PC5<M>: WakeUp::Line5,
158+
PB5<M>: WakeUp::Line6,
159+
}
160+
59161
pub trait PowerExt {
60162
fn constrain(self, rcc: &mut Rcc) -> Power;
61163
}

0 commit comments

Comments
 (0)