From 0ba359bb29c0ce3c8a95e8111d05b6811f1cb2d5 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Sun, 4 Feb 2018 10:01:31 +0100
Subject: [PATCH] first working blinky (hack)

---
 examples/blinky.rs |  45 +++++++++++++++
 src/led.rs         | 134 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 179 insertions(+)
 create mode 100644 examples/blinky.rs
 create mode 100644 src/led.rs

diff --git a/examples/blinky.rs b/examples/blinky.rs
new file mode 100644
index 0000000..2570a9e
--- /dev/null
+++ b/examples/blinky.rs
@@ -0,0 +1,45 @@
+//! Blinks an LED on the Nucleo 64
+//! Led connected to PA5
+#![deny(unsafe_code)]
+//#![deny(warnings)]
+#![no_std]
+
+extern crate cortex_m;
+extern crate stm32f4x_hal as f4;
+
+use f4::stm32f4x;
+// use f3::hal::delay::Delay;
+use f4::prelude::*;
+use f4::led::Led;
+
+fn wait(v: u32) {
+    for _ in 0..v {}
+}
+
+fn main() {
+    let cp = cortex_m::Peripherals::take().unwrap();
+    let dp = stm32f4x::Peripherals::take().unwrap();
+
+    let mut flash = dp.FLASH.constrain();
+    let mut rcc = dp.RCC.constrain();
+    let mut gpioa = dp.GPIOA.split(&mut rcc.ahb1);
+
+    // // clock configuration using the default settings (all clocks run at 8 MHz)
+    // let clocks = rcc.cfgr.freeze(&mut flash.acr);
+    // // TRY this alternate clock configuration (all clocks run at 16 MHz)
+    // // let clocks = rcc.cfgr.sysclk(16.mhz()).freeze(&mut flash.acr);
+    let mut led: Led = gpioa
+        .pa5
+        .into_push_pull_output(&mut gpioa.moder, &mut gpioa.otyper)
+        .into();
+    // let mut delay = Delay::new(cp.SYST, clocks);
+
+    loop {
+        led.on();
+        wait(10000);
+        //     delay.delay_ms(1_000_u16);
+        led.off();
+        wait(10000);
+        //     delay.delay_ms(1_000_u16);
+    }
+}
diff --git a/src/led.rs b/src/led.rs
new file mode 100644
index 0000000..73188bf
--- /dev/null
+++ b/src/led.rs
@@ -0,0 +1,134 @@
+//! On-board user LEDs
+
+use core::ops;
+
+use prelude::*;
+
+use gpio::gpioa::{self, PA5, PAx};
+use gpio::{Output, PushPull};
+
+/// LED
+pub type LD1 = PA5<Output<PushPull>>;
+
+// /// Array of all the user LEDs on the board
+// pub struct Leds {
+//     leds: [Led; 8],
+// }
+
+// impl Leds {
+//     /// Initializes all the user LEDs
+//     pub fn new(mut gpioa: gpioa::Parts) -> Self {
+//         let n = gpioe
+//                          .pe9
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let ne = gpioe
+//             .pe10
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let e = gpioe
+//             .pe11
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let se = gpioe
+//             .pe12
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let s = gpioe
+//             .pe13
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let sw = gpioe
+//             .pe14
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let w = gpioe
+//             .pe15
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+//         let nw = gpioe
+//             .pe8
+//             .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);
+
+//         Leds {
+//             leds: [
+//                 n.into(),
+//                 ne.into(),
+//                 e.into(),
+//                 se.into(),
+//                 s.into(),
+//                 sw.into(),
+//                 w.into(),
+//                 nw.into(),
+//             ],
+//         }
+//     }
+// }
+
+// impl ops::Deref for Leds {
+//     type Target = [Led];
+
+//     fn deref(&self) -> &[Led] {
+//         &self.leds
+//     }
+// }
+
+// impl ops::DerefMut for Leds {
+//     fn deref_mut(&mut self) -> &mut [Led] {
+//         &mut self.leds
+//     }
+// }
+
+// impl ops::Index<usize> for Leds {
+//     type Output = Led;
+
+//     fn index(&self, i: usize) -> &Led {
+//         &self.leds[i]
+//     }
+// }
+
+// impl ops::Index<Direction> for Leds {
+//     type Output = Led;
+
+//     fn index(&self, d: Direction) -> &Led {
+//         &self.leds[d as usize]
+//     }
+// }
+
+// impl ops::IndexMut<usize> for Leds {
+//     fn index_mut(&mut self, i: usize) -> &mut Led {
+//         &mut self.leds[i]
+//     }
+// }
+
+// impl ops::IndexMut<Direction> for Leds {
+//     fn index_mut(&mut self, d: Direction) -> &mut Led {
+//         &mut self.leds[d as usize]
+//     }
+// }
+
+/// One of the on-board user LEDs
+pub struct Led {
+    pax: PAx<Output<PushPull>>,
+}
+
+macro_rules! ctor {
+    ($($ldx:ident),+) => {
+        $(
+            impl Into<Led> for $ldx {
+                fn into(self) -> Led {
+                    Led {
+                        pax: self.downgrade(),
+                    }
+                }
+            }
+        )+
+    }
+}
+
+ctor!(LD1);
+
+impl Led {
+    /// Turns the LED off
+    pub fn off(&mut self) {
+        self.pax.set_low()
+    }
+
+    /// Turns the LED on
+    pub fn on(&mut self) {
+        self.pax.set_high()
+    }
+}
-- 
GitLab