2020-09-22 18:03:43 +02:00
#![ no_std ]
#![ feature(generic_associated_types) ]
#![ feature(asm) ]
2021-03-17 02:48:16 +01:00
#![ feature(min_type_alias_impl_trait) ]
#![ feature(impl_trait_in_bindings) ]
2020-09-22 18:03:43 +02:00
#![ feature(type_alias_impl_trait) ]
2021-02-26 01:06:58 +01:00
#![ allow(incomplete_features) ]
2020-09-22 18:03:43 +02:00
#[ cfg(not(any(
2021-05-11 03:04:59 +02:00
feature = " nrf51 " ,
feature = " nrf52805 " ,
feature = " nrf52810 " ,
feature = " nrf52811 " ,
feature = " nrf52820 " ,
feature = " nrf52832 " ,
feature = " nrf52833 " ,
feature = " nrf52840 " ,
feature = " nrf5340-app " ,
feature = " nrf5340-net " ,
feature = " nrf9160 " ,
2020-09-22 18:03:43 +02:00
) ) ) ]
2021-05-11 03:04:59 +02:00
compile_error! ( " No chip feature activated. You must activate exactly one of the following features: nrf52810, nrf52811, nrf52832, nrf52833, nrf52840 " ) ;
2021-01-18 14:22:55 +01:00
2020-12-01 17:46:56 +01:00
// This mod MUST go first, so that the others see its macros.
pub ( crate ) mod fmt ;
2021-05-11 03:04:59 +02:00
pub ( crate ) mod util ;
2020-12-01 17:46:56 +01:00
2020-12-28 23:57:50 +01:00
pub mod buffered_uarte ;
2021-03-19 04:08:44 +01:00
pub mod gpio ;
2020-09-23 00:32:49 +02:00
pub mod gpiote ;
2021-03-27 04:40:05 +01:00
pub mod ppi ;
2021-05-12 04:56:11 +02:00
#[ cfg(not(any(feature = " nrf52805 " , feature = " nrf52820 " ))) ]
pub mod pwm ;
2021-05-11 03:04:59 +02:00
#[ cfg(feature = " nrf52840 " ) ]
2020-09-22 18:03:43 +02:00
pub mod qspi ;
2021-06-29 09:26:16 +02:00
pub mod rng ;
2020-09-24 19:59:20 +02:00
pub mod rtc ;
2021-05-11 03:04:59 +02:00
#[ cfg(not(feature = " nrf52820 " )) ]
2021-03-24 18:33:17 +01:00
pub mod saadc ;
2021-01-18 14:22:55 +01:00
pub mod spim ;
2021-03-28 22:40:41 +02:00
pub mod timer ;
2021-05-11 03:07:37 +02:00
pub mod twim ;
2020-12-23 16:18:29 +01:00
pub mod uarte ;
2021-03-21 21:58:59 +01:00
2021-05-11 03:04:59 +02:00
// This mod MUST go last, so that it sees all the `impl_foo!` macros
#[ cfg(feature = " nrf52805 " ) ]
#[ path = " chips/nrf52805.rs " ]
mod chip ;
#[ cfg(feature = " nrf52810 " ) ]
#[ path = " chips/nrf52810.rs " ]
mod chip ;
#[ cfg(feature = " nrf52811 " ) ]
#[ path = " chips/nrf52811.rs " ]
mod chip ;
#[ cfg(feature = " nrf52820 " ) ]
#[ path = " chips/nrf52820.rs " ]
mod chip ;
#[ cfg(feature = " nrf52832 " ) ]
#[ path = " chips/nrf52832.rs " ]
mod chip ;
#[ cfg(feature = " nrf52833 " ) ]
#[ path = " chips/nrf52833.rs " ]
mod chip ;
#[ cfg(feature = " nrf52840 " ) ]
#[ path = " chips/nrf52840.rs " ]
mod chip ;
pub ( crate ) use chip ::pac ;
pub use chip ::{ peripherals , Peripherals } ;
pub mod interrupt {
pub use crate ::chip ::irqs ::* ;
pub use cortex_m ::interrupt ::{ CriticalSection , Mutex } ;
pub use embassy ::interrupt ::{ declare , take , Interrupt } ;
pub use embassy_extras ::interrupt ::Priority3 as Priority ;
2021-03-21 21:58:59 +01:00
}
2021-05-12 01:00:43 +02:00
pub use embassy_macros ::interrupt ;
2021-05-12 01:57:01 +02:00
pub mod config {
pub enum HfclkSource {
Internal ,
ExternalXtal ,
}
pub enum LfclkSource {
InternalRC ,
Synthesized ,
ExternalXtal ,
ExternalLowSwing ,
ExternalFullSwing ,
}
#[ non_exhaustive ]
pub struct Config {
pub hfclk_source : HfclkSource ,
pub lfclk_source : LfclkSource ,
2021-05-17 21:27:27 +02:00
pub gpiote_interrupt_priority : crate ::interrupt ::Priority ,
2021-05-12 01:57:01 +02:00
}
impl Default for Config {
fn default ( ) -> Self {
Self {
// There are hobby nrf52 boards out there without external XTALs...
// Default everything to internal so it Just Works. User can enable external
// xtals if they know they have them.
hfclk_source : HfclkSource ::Internal ,
lfclk_source : LfclkSource ::InternalRC ,
2021-05-17 21:27:27 +02:00
gpiote_interrupt_priority : crate ::interrupt ::Priority ::P0 ,
2021-05-12 01:57:01 +02:00
}
}
}
}
pub fn init ( config : config ::Config ) -> Peripherals {
// Do this first, so that it panics if user is calling `init` a second time
// before doing anything important.
let peripherals = Peripherals ::take ( ) ;
let r = unsafe { & * pac ::CLOCK ::ptr ( ) } ;
// Start HFCLK.
match config . hfclk_source {
config ::HfclkSource ::Internal = > { }
config ::HfclkSource ::ExternalXtal = > {
// Datasheet says this is likely to take 0.36ms
r . events_hfclkstarted . write ( | w | unsafe { w . bits ( 0 ) } ) ;
r . tasks_hfclkstart . write ( | w | unsafe { w . bits ( 1 ) } ) ;
while r . events_hfclkstarted . read ( ) . bits ( ) = = 0 { }
}
}
// Configure LFCLK.
match config . lfclk_source {
config ::LfclkSource ::InternalRC = > r . lfclksrc . write ( | w | w . src ( ) . rc ( ) ) ,
config ::LfclkSource ::Synthesized = > r . lfclksrc . write ( | w | w . src ( ) . synth ( ) ) ,
config ::LfclkSource ::ExternalXtal = > r . lfclksrc . write ( | w | w . src ( ) . xtal ( ) ) ,
config ::LfclkSource ::ExternalLowSwing = > r . lfclksrc . write ( | w | {
w . src ( ) . xtal ( ) ;
w . external ( ) . enabled ( ) ;
w . bypass ( ) . disabled ( ) ;
w
} ) ,
config ::LfclkSource ::ExternalFullSwing = > r . lfclksrc . write ( | w | {
w . src ( ) . xtal ( ) ;
w . external ( ) . enabled ( ) ;
w . bypass ( ) . enabled ( ) ;
w
} ) ,
}
// Start LFCLK.
// Datasheet says this could take 100us from synth source
// 600us from rc source, 0.25s from an external source.
r . events_lfclkstarted . write ( | w | unsafe { w . bits ( 0 ) } ) ;
r . tasks_lfclkstart . write ( | w | unsafe { w . bits ( 1 ) } ) ;
while r . events_lfclkstarted . read ( ) . bits ( ) = = 0 { }
// Init GPIOTE
2021-05-17 21:27:27 +02:00
crate ::gpiote ::init ( config . gpiote_interrupt_priority ) ;
2021-05-12 01:57:01 +02:00
peripherals
}