#![no_std] #![no_main] // pick a panicking behavior extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics // extern crate panic_abort; // requires nightly // extern crate panic_itm; // logs messages over ITM; requires ITM support // extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger use cortex_m::{self, peripheral::syst::SystClkSource}; use cortex_m_rt::entry; use msp432p401r; use core::num::Wrapping; const PIN0: u8 = (1u8 << 0); const PIN1: u8 = (1u8 << 1); const PIN2: u8 = (1u8 << 2); //const PIN3: u8 = (1u8 << 3); const PIN4: u8 = (1u8 << 4); //const PIN5: u8 = (1u8 << 5); //const PIN6: u8 = (1u8 << 6); //const PIN7: u8 = (1u8 << 7); const WDOG_PWORD: u8 = 0x5a; #[entry] fn main() -> ! { let cp = cortex_m::Peripherals::take().unwrap(); let p = msp432p401r::Peripherals::take().unwrap(); let mut syst = cp.SYST; let wdt = p.WDT_A; let dio = p.DIO; // disable watchdog timer wdt.wdtctl.write(|w| unsafe { w.wdtpw().bits(WDOG_PWORD) .wdthold().wdthold_1() }); // configure the system timer to wrap around every ~1 second syst.set_clock_source(SystClkSource::Core); syst.set_reload(20_000); syst.enable_counter(); // configure digital IO pins dio.padir.modify(|_r, w| unsafe { w.p1dir().bits(PIN0) .p2dir().bits(PIN0 | PIN1 | PIN2) }); // Enable pull-up on P1.4 switch dio.paren.modify(|_r, w| unsafe { w.p1ren().bits(PIN4) }); dio.pads.modify(|_r, w| unsafe { w.p1ds().bits(PIN4) }); // Turn on LED1 on P1.0 and enable pull-up on P1.1 switch dio.paout.write(|w| unsafe { w.p1out().bits(PIN0 | PIN4) .p2out().bits(0) }); let mut count: Wrapping = Wrapping(0); let mut input: u8; loop { while !syst.has_wrapped() {} // The button pulls the input to GND input = (dio.pain.read().p1in().bits() & PIN4) >> 4; count += Wrapping(1); let _led1: u8 = ((count.0 & 0x0100) >> 8) as u8; let led2: u8 = ((count.0 & 0b0000_0111_0000_0000) >> 8) as u8; // toggle LEDs dio.paout.write(|w| unsafe { w.p1out().bits(input | PIN4) .p2out().bits(led2) }); } }