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