aboutsummaryrefslogtreecommitdiffstats
path: root/src/led.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/led.rs')
-rw-r--r--src/led.rs49
1 files changed, 23 insertions, 26 deletions
diff --git a/src/led.rs b/src/led.rs
index 951a32e..536121b 100644
--- a/src/led.rs
+++ b/src/led.rs
@@ -1,41 +1,38 @@
-use gd32vf103_pac::Peripherals;
+use gd32vf103xx_hal::{
+ gpio::{Floating, Input, Output, PushPull, Pxx, State, gpioa::PA7},
+};
+use embedded_hal::digital::v2::OutputPin;
-#[derive(Clone, Copy)]
-pub struct LED();
+pub struct LED {
+ pin: Pxx<Output<PushPull>>,
+ state: State,
+}
impl LED {
- pub fn new() -> Self {
- let peripherals = unsafe { Peripherals::steal() };
- peripherals.RCU.apb2en.modify(|_, w| {
- w.paen().set_bit()
- });
-
- peripherals.GPIOA.ctl0.modify(|_, w| unsafe {
- // output mode, push-pull
- w.ctl7().bits(0b00);
- // 50 mhz output rate
- w.md7().bits(0b11);
- w
- });
- Self()
+ pub fn new(pin: PA7<Input<Floating>>) -> Self {
+ let mut p = pin.into_push_pull_output().downgrade();
+ p.set_low().ok();
+ Self { pin: p, state: State::Low }
}
pub fn is_on(&self) -> bool {
- let gpio = unsafe { Peripherals::steal() }.GPIOA;
- gpio.octl.read().octl7().bit()
+ match self.state {
+ State::High => true,
+ State::Low => false,
+ }
}
- pub fn on(&self) {
- let gpio = unsafe { Peripherals::steal() }.GPIOA;
- gpio.bop.write(|w| w.bop7().set_bit());
+ pub fn on(&mut self) {
+ self.state = State::High;
+ self.pin.set_high().ok();
}
- pub fn off(&self) {
- let gpio = unsafe { Peripherals::steal() }.GPIOA;
- gpio.bc.write(|w| w.cr7().set_bit());
+ pub fn off(&mut self) {
+ self.state = State::Low;
+ self.pin.set_low().ok();
}
- pub fn toggle(&self) {
+ pub fn toggle(&mut self) {
if self.is_on() {
self.off();
} else {