#![no_std]
pub use cortex_m;
pub use cortex_m_rt;
pub use embedded_hal;
pub use nrf52840_hal as hal;
pub mod prelude {
pub use nrf52840_hal::prelude::*;
}
use nrf52840_hal::{
gpio::{p0, p1, Floating, Input, Level, Output, Pin, PullUp, PushPull},
pac::{self as nrf52, CorePeripherals, Peripherals},
spim::{self, Frequency, Spim, MODE_0},
uarte::{self, Baudrate as UartBaudrate, Parity as UartParity, Uarte},
};
use embedded_hal::digital::v2::{InputPin, OutputPin};
#[allow(non_snake_case)]
pub struct Board {
pub pins: Pins,
pub cdc: Uarte<nrf52::UARTE0>,
pub flash: Spim<nrf52::SPIM2>,
pub flash_cs: Pin<Output<PushPull>>,
pub leds: Leds,
pub buttons: Buttons,
pub nfc: NFC,
pub CBP: nrf52::CBP,
pub CPUID: nrf52::CPUID,
pub DCB: nrf52::DCB,
pub DWT: nrf52::DWT,
pub FPB: nrf52::FPB,
pub FPU: nrf52::FPU,
pub ITM: nrf52::ITM,
pub MPU: nrf52::MPU,
pub NVIC: nrf52::NVIC,
pub SCB: nrf52::SCB,
pub SYST: nrf52::SYST,
pub TPIU: nrf52::TPIU,
pub FICR: nrf52::FICR,
pub UICR: nrf52::UICR,
pub ACL: nrf52::ACL,
pub POWER: nrf52::POWER,
pub CLOCK: nrf52::CLOCK,
pub RADIO: nrf52::RADIO,
pub UART0: nrf52::UART0,
pub SPIM0: nrf52::SPIM0,
pub SPIS0: nrf52::SPIS0,
pub TWIM0: nrf52::TWIM0,
pub TWIS0: nrf52::TWIS0,
pub SPI0: nrf52::SPI0,
pub TWI0: nrf52::TWI0,
pub SPIM1: nrf52::SPIM1,
pub SPIS1: nrf52::SPIS1,
pub TWIM1: nrf52::TWIM1,
pub TWIS1: nrf52::TWIS1,
pub SPI1: nrf52::SPI1,
pub TWI1: nrf52::TWI1,
pub NFCT: nrf52::NFCT,
pub GPIOTE: nrf52::GPIOTE,
pub SAADC: nrf52::SAADC,
pub TIMER0: nrf52::TIMER0,
pub TIMER1: nrf52::TIMER1,
pub TIMER2: nrf52::TIMER2,
pub RTC0: nrf52::RTC0,
pub TEMP: nrf52::TEMP,
pub RNG: nrf52::RNG,
pub ECB: nrf52::ECB,
pub CCM: nrf52::CCM,
pub AAR: nrf52::AAR,
pub WDT: nrf52::WDT,
pub RTC1: nrf52::RTC1,
pub QDEC: nrf52::QDEC,
pub COMP: nrf52::COMP,
pub LPCOMP: nrf52::LPCOMP,
pub SWI0: nrf52::SWI0,
pub EGU0: nrf52::EGU0,
pub SWI1: nrf52::SWI1,
pub EGU1: nrf52::EGU1,
pub SWI2: nrf52::SWI2,
pub EGU2: nrf52::EGU2,
pub SWI3: nrf52::SWI3,
pub EGU3: nrf52::EGU3,
pub SWI4: nrf52::SWI4,
pub EGU4: nrf52::EGU4,
pub SWI5: nrf52::SWI5,
pub EGU5: nrf52::EGU5,
pub TIMER3: nrf52::TIMER3,
pub TIMER4: nrf52::TIMER4,
pub PWM0: nrf52::PWM0,
pub PDM: nrf52::PDM,
pub NVMC: nrf52::NVMC,
pub PPI: nrf52::PPI,
pub MWU: nrf52::MWU,
pub PWM1: nrf52::PWM1,
pub PWM2: nrf52::PWM2,
pub RTC2: nrf52::RTC2,
pub I2S: nrf52::I2S,
}
impl Board {
pub fn take() -> Option<Self> {
Some(Self::new(CorePeripherals::take()?, Peripherals::take()?))
}
pub unsafe fn steal() -> Self {
Self::new(CorePeripherals::steal(), Peripherals::steal())
}
fn new(cp: CorePeripherals, p: Peripherals) -> Self {
let pins0 = p0::Parts::new(p.P0);
let pins1 = p1::Parts::new(p.P1);
let flash_spim = Spim::new(
p.SPIM2,
spim::Pins {
sck: pins0.p0_19.into_push_pull_output(Level::Low).degrade(),
mosi: Some(pins0.p0_20.into_push_pull_output(Level::Low).degrade()),
miso: Some(pins0.p0_21.into_floating_input().degrade()),
},
Frequency::K500,
MODE_0,
0,
);
let flash_cs = pins0.p0_17.into_push_pull_output(Level::High).degrade();
let cdc_uart = Uarte::new(
p.UARTE0,
uarte::Pins {
txd: pins0.p0_06.into_push_pull_output(Level::High).degrade(),
rxd: pins0.p0_08.into_floating_input().degrade(),
cts: Some(pins0.p0_07.into_floating_input().degrade()),
rts: Some(pins0.p0_05.into_push_pull_output(Level::High).degrade()),
},
UartParity::EXCLUDED,
UartBaudrate::BAUD115200,
);
Board {
cdc: cdc_uart,
flash: flash_spim,
flash_cs: flash_cs,
pins: Pins {
P0_03: pins0.p0_03,
P0_04: pins0.p0_04,
_RESET: pins0.p0_18,
P0_22: pins0.p0_22,
P0_23: pins0.p0_23,
P0_26: pins0.p0_26,
P0_27: pins0.p0_27,
P0_28: pins0.p0_28,
P0_29: pins0.p0_29,
P0_30: pins0.p0_30,
P0_31: pins0.p0_31,
P1_00: pins1.p1_00,
P1_01: pins1.p1_01,
P1_02: pins1.p1_02,
P1_03: pins1.p1_03,
P1_04: pins1.p1_04,
P1_05: pins1.p1_05,
P1_06: pins1.p1_06,
P1_07: pins1.p1_07,
P1_08: pins1.p1_08,
P1_09: pins1.p1_09,
P1_10: pins1.p1_10,
P1_11: pins1.p1_11,
P1_12: pins1.p1_12,
P1_13: pins1.p1_13,
P1_14: pins1.p1_14,
P1_15: pins1.p1_15,
},
leds: Leds {
led_1: Led::new(pins0.p0_13.degrade()),
led_2: Led::new(pins0.p0_14.degrade()),
led_3: Led::new(pins0.p0_15.degrade()),
led_4: Led::new(pins0.p0_16.degrade()),
},
buttons: Buttons {
button_1: Button::new(pins0.p0_11.degrade()),
button_2: Button::new(pins0.p0_12.degrade()),
button_3: Button::new(pins0.p0_24.degrade()),
button_4: Button::new(pins0.p0_25.degrade()),
},
nfc: NFC {
nfc_1: pins0.p0_09,
nfc_2: pins0.p0_10,
},
CBP: cp.CBP,
CPUID: cp.CPUID,
DCB: cp.DCB,
DWT: cp.DWT,
FPB: cp.FPB,
FPU: cp.FPU,
ITM: cp.ITM,
MPU: cp.MPU,
NVIC: cp.NVIC,
SCB: cp.SCB,
SYST: cp.SYST,
TPIU: cp.TPIU,
FICR: p.FICR,
UICR: p.UICR,
ACL: p.ACL,
POWER: p.POWER,
CLOCK: p.CLOCK,
RADIO: p.RADIO,
UART0: p.UART0,
SPIM0: p.SPIM0,
SPIS0: p.SPIS0,
TWIM0: p.TWIM0,
TWIS0: p.TWIS0,
SPI0: p.SPI0,
TWI0: p.TWI0,
SPIM1: p.SPIM1,
SPIS1: p.SPIS1,
TWIM1: p.TWIM1,
TWIS1: p.TWIS1,
SPI1: p.SPI1,
TWI1: p.TWI1,
NFCT: p.NFCT,
GPIOTE: p.GPIOTE,
SAADC: p.SAADC,
TIMER0: p.TIMER0,
TIMER1: p.TIMER1,
TIMER2: p.TIMER2,
RTC0: p.RTC0,
TEMP: p.TEMP,
RNG: p.RNG,
ECB: p.ECB,
CCM: p.CCM,
AAR: p.AAR,
WDT: p.WDT,
RTC1: p.RTC1,
QDEC: p.QDEC,
COMP: p.COMP,
LPCOMP: p.LPCOMP,
SWI0: p.SWI0,
EGU0: p.EGU0,
SWI1: p.SWI1,
EGU1: p.EGU1,
SWI2: p.SWI2,
EGU2: p.EGU2,
SWI3: p.SWI3,
EGU3: p.EGU3,
SWI4: p.SWI4,
EGU4: p.EGU4,
SWI5: p.SWI5,
EGU5: p.EGU5,
TIMER3: p.TIMER3,
TIMER4: p.TIMER4,
PWM0: p.PWM0,
PDM: p.PDM,
NVMC: p.NVMC,
PPI: p.PPI,
MWU: p.MWU,
PWM1: p.PWM1,
PWM2: p.PWM2,
RTC2: p.RTC2,
I2S: p.I2S,
}
}
}
#[allow(non_snake_case)]
pub struct Pins {
pub P0_03: p0::P0_03<Input<Floating>>,
pub P0_04: p0::P0_04<Input<Floating>>,
_RESET: p0::P0_18<Input<Floating>>,
pub P0_22: p0::P0_22<Input<Floating>>,
pub P0_23: p0::P0_23<Input<Floating>>,
pub P0_26: p0::P0_26<Input<Floating>>,
pub P0_27: p0::P0_27<Input<Floating>>,
pub P0_28: p0::P0_28<Input<Floating>>,
pub P0_29: p0::P0_29<Input<Floating>>,
pub P0_30: p0::P0_30<Input<Floating>>,
pub P0_31: p0::P0_31<Input<Floating>>,
pub P1_00: p1::P1_00<Input<Floating>>,
pub P1_01: p1::P1_01<Input<Floating>>,
pub P1_02: p1::P1_02<Input<Floating>>,
pub P1_03: p1::P1_03<Input<Floating>>,
pub P1_04: p1::P1_04<Input<Floating>>,
pub P1_05: p1::P1_05<Input<Floating>>,
pub P1_06: p1::P1_06<Input<Floating>>,
pub P1_07: p1::P1_07<Input<Floating>>,
pub P1_08: p1::P1_08<Input<Floating>>,
pub P1_09: p1::P1_09<Input<Floating>>,
pub P1_10: p1::P1_10<Input<Floating>>,
pub P1_11: p1::P1_11<Input<Floating>>,
pub P1_12: p1::P1_12<Input<Floating>>,
pub P1_13: p1::P1_13<Input<Floating>>,
pub P1_14: p1::P1_14<Input<Floating>>,
pub P1_15: p1::P1_15<Input<Floating>>,
}
pub struct Leds {
pub led_1: Led,
pub led_2: Led,
pub led_3: Led,
pub led_4: Led,
}
pub struct Led(Pin<Output<PushPull>>);
impl Led {
fn new<Mode>(pin: Pin<Mode>) -> Self {
Led(pin.into_push_pull_output(Level::High))
}
pub fn enable(&mut self) {
self.0.set_low().unwrap()
}
pub fn disable(&mut self) {
self.0.set_high().unwrap()
}
}
pub struct Buttons {
pub button_1: Button,
pub button_2: Button,
pub button_3: Button,
pub button_4: Button,
}
pub struct Button(Pin<Input<PullUp>>);
impl Button {
fn new<Mode>(pin: Pin<Mode>) -> Self {
Button(pin.into_pullup_input())
}
pub fn is_pressed(&self) -> bool {
self.0.is_low().unwrap()
}
pub fn is_released(&self) -> bool {
self.0.is_high().unwrap()
}
}
pub struct NFC {
pub nfc_1: p0::P0_09<Input<Floating>>,
pub nfc_2: p0::P0_10<Input<Floating>>,
}