Something went wrong. Try again.
Firmware for the b-parasite board, but in Rust.
Something went wrong. Try again.
3.0 kB · 91 lines
Rust
at ci-fix
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192#![feature(impl_trait_in_assoc_type)]#![no_std]#![no_main]
mod adc;mod ble;mod button;mod constants;mod led;mod panic_handler;mod shtc3;mod state;mod timer;
use embassy_executor::Executor;use sachy_fmt::{info, unwrap};
use embassy_nrf::{ bind_interrupts, gpio::{Level, Output, OutputDrive}, peripherals, rng::{self, Rng}, saadc, twim,};use static_cell::StaticCell;
use nrf_sdc::mpsl::MultiprotocolServiceLayer;use nrf_sdc::{self as sdc, mpsl};
bind_interrupts!(struct Irqs { RNG => rng::InterruptHandler<peripherals::RNG>; EGU0_SWI0 => mpsl::LowPrioInterruptHandler; CLOCK_POWER => mpsl::ClockInterruptHandler; RADIO => mpsl::HighPrioInterruptHandler; TIMER0 => mpsl::HighPrioInterruptHandler; RTC0 => mpsl::HighPrioInterruptHandler; TWISPI0 => twim::InterruptHandler<peripherals::TWISPI0>; SAADC => saadc::InterruptHandler;});
#[cortex_m_rt::entry]fn main() -> ! { let p = embassy_nrf::init(Default::default());
let mpsl_p = mpsl::Peripherals::new(p.RTC0, p.TIMER0, p.TEMP, p.PPI_CH19, p.PPI_CH30, p.PPI_CH31); let lfclk_cfg = mpsl::raw::mpsl_clock_lfclk_cfg_t { source: mpsl::raw::MPSL_CLOCK_LF_SRC_RC as u8, rc_ctiv: mpsl::raw::MPSL_RECOMMENDED_RC_CTIV as u8, rc_temp_ctiv: mpsl::raw::MPSL_RECOMMENDED_RC_TEMP_CTIV as u8, accuracy_ppm: mpsl::raw::MPSL_DEFAULT_CLOCK_ACCURACY_PPM as u16, skip_wait_lfclk_started: mpsl::raw::MPSL_DEFAULT_SKIP_WAIT_LFCLK_STARTED != 0, }; static MPSL: StaticCell<MultiprotocolServiceLayer> = StaticCell::new(); let mpsl = MPSL.init_with(|| { unwrap!(mpsl::MultiprotocolServiceLayer::new( mpsl_p, Irqs, lfclk_cfg )) }); let sdc_p = sdc::Peripherals::new( p.PPI_CH17, p.PPI_CH18, p.PPI_CH20, p.PPI_CH21, p.PPI_CH22, p.PPI_CH23, p.PPI_CH24, p.PPI_CH25, p.PPI_CH26, p.PPI_CH27, p.PPI_CH28, p.PPI_CH29, );
static DEVICE_RNG: StaticCell<Rng<'static, embassy_nrf::mode::Async>> = StaticCell::new(); let rng = DEVICE_RNG.init_with(|| rng::Rng::new(p.RNG, Irqs));
static SDC_MEM: StaticCell<sdc::Mem<1112>> = StaticCell::new(); let sdc_mem = SDC_MEM.init_with(sdc::Mem::new);
let sdc = unwrap!(ble::build_sdc(sdc_p, rng, mpsl, sdc_mem));
static EXECUTOR: StaticCell<Executor> = StaticCell::new();
EXECUTOR.init_with(Executor::new).run(|spawner| { spawner.spawn(unwrap!(button::task(p.GPIOTE_CH0, p.P0_30))); spawner.spawn(unwrap!(led::task(Output::new( p.P0_28, Level::Low, OutputDrive::Standard, )))); spawner.spawn(unwrap!(shtc3::task(p.TWISPI0, p.P0_24, p.P0_13))); spawner.spawn(unwrap!(adc::task( p.SAADC, p.P0_02, p.P0_03, p.P0_29, p.PWM0, p.P0_05, ))); spawner.spawn(unwrap!(timer::task())); spawner.spawn(unwrap!(ble::task(spawner, sdc, mpsl)));
info!("Sachy's Parasite is go!"); })}