diff options
| author | Dario Nieuwenhuis <[email protected]> | 2021-03-29 00:42:08 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2021-03-29 00:58:58 +0200 |
| commit | 48cf1f6ebf0906de1b043b7e6213a0f6ec70b207 (patch) | |
| tree | 3d0ecf1d74f60fa7dc9a851b95285c51d0c162f8 | |
| parent | 3a18373828577e5e9d06e9f5c108376fef32fe18 (diff) | |
nrf/system: add configure
| -rw-r--r-- | embassy-nrf-examples/Cargo.toml | 1 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/buffered_uart.rs | 17 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/executor_fairness_test.rs | 9 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/multiprio.rs | 10 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/ppi.rs | 1 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/raw_spawn.rs | 13 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/spim.rs | 10 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/timer.rs | 13 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/bin/uart.rs | 12 | ||||
| -rw-r--r-- | embassy-nrf-examples/src/example_common.rs | 1 | ||||
| -rw-r--r-- | embassy-nrf/Cargo.toml | 10 | ||||
| -rw-r--r-- | embassy-nrf/src/lib.rs | 1 | ||||
| -rw-r--r-- | embassy-nrf/src/system.rs | 76 |
13 files changed, 97 insertions, 77 deletions
diff --git a/embassy-nrf-examples/Cargo.toml b/embassy-nrf-examples/Cargo.toml index 432e89504..2a5b52dd9 100644 --- a/embassy-nrf-examples/Cargo.toml +++ b/embassy-nrf-examples/Cargo.toml | |||
| @@ -28,5 +28,4 @@ cortex-m = { version = "0.7.1", features = ["inline-asm"] } | |||
| 28 | cortex-m-rt = "0.6.13" | 28 | cortex-m-rt = "0.6.13" |
| 29 | embedded-hal = { version = "0.2.4" } | 29 | embedded-hal = { version = "0.2.4" } |
| 30 | panic-probe = "0.1.0" | 30 | panic-probe = "0.1.0" |
| 31 | nrf52840-hal = { version = "0.12.1" } | ||
| 32 | futures = { version = "0.3.8", default-features = false, features = ["async-await"] } \ No newline at end of file | 31 | futures = { version = "0.3.8", default-features = false, features = ["async-await"] } \ No newline at end of file |
diff --git a/embassy-nrf-examples/src/bin/buffered_uart.rs b/embassy-nrf-examples/src/bin/buffered_uart.rs index 80b24d2ba..c7c82e840 100644 --- a/embassy-nrf-examples/src/bin/buffered_uart.rs +++ b/embassy-nrf-examples/src/bin/buffered_uart.rs | |||
| @@ -7,20 +7,16 @@ | |||
| 7 | 7 | ||
| 8 | #[path = "../example_common.rs"] | 8 | #[path = "../example_common.rs"] |
| 9 | mod example_common; | 9 | mod example_common; |
| 10 | use core::mem; | ||
| 11 | |||
| 12 | use embassy_nrf::gpio::NoPin; | ||
| 13 | use example_common::*; | ||
| 14 | 10 | ||
| 15 | use cortex_m_rt::entry; | 11 | use cortex_m_rt::entry; |
| 16 | use defmt::panic; | 12 | use defmt::panic; |
| 17 | use futures::pin_mut; | ||
| 18 | use nrf52840_hal::clocks; | ||
| 19 | |||
| 20 | use embassy::executor::{task, Executor}; | 13 | use embassy::executor::{task, Executor}; |
| 21 | use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; | 14 | use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; |
| 22 | use embassy::util::{Forever, Steal}; | 15 | use embassy::util::{Forever, Steal}; |
| 16 | use embassy_nrf::gpio::NoPin; | ||
| 23 | use embassy_nrf::{buffered_uarte::BufferedUarte, interrupt, peripherals, rtc, uarte, Peripherals}; | 17 | use embassy_nrf::{buffered_uarte::BufferedUarte, interrupt, peripherals, rtc, uarte, Peripherals}; |
| 18 | use example_common::*; | ||
| 19 | use futures::pin_mut; | ||
| 24 | 20 | ||
| 25 | #[task] | 21 | #[task] |
| 26 | async fn run() { | 22 | async fn run() { |
| @@ -85,14 +81,9 @@ fn main() -> ! { | |||
| 85 | 81 | ||
| 86 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 82 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 87 | 83 | ||
| 88 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 84 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 89 | .enable_ext_hfosc() | ||
| 90 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 91 | .start_lfclk(); | ||
| 92 | |||
| 93 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 85 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 94 | rtc.start(); | 86 | rtc.start(); |
| 95 | |||
| 96 | unsafe { embassy::time::set_clock(rtc) }; | 87 | unsafe { embassy::time::set_clock(rtc) }; |
| 97 | 88 | ||
| 98 | let alarm = ALARM.put(rtc.alarm0()); | 89 | let alarm = ALARM.put(rtc.alarm0()); |
diff --git a/embassy-nrf-examples/src/bin/executor_fairness_test.rs b/embassy-nrf-examples/src/bin/executor_fairness_test.rs index cfcfd9496..67610ef05 100644 --- a/embassy-nrf-examples/src/bin/executor_fairness_test.rs +++ b/embassy-nrf-examples/src/bin/executor_fairness_test.rs | |||
| @@ -9,7 +9,6 @@ | |||
| 9 | mod example_common; | 9 | mod example_common; |
| 10 | use example_common::*; | 10 | use example_common::*; |
| 11 | 11 | ||
| 12 | use core::mem; | ||
| 13 | use core::task::Poll; | 12 | use core::task::Poll; |
| 14 | use cortex_m_rt::entry; | 13 | use cortex_m_rt::entry; |
| 15 | use defmt::panic; | 14 | use defmt::panic; |
| @@ -18,7 +17,6 @@ use embassy::time::{Duration, Instant, Timer}; | |||
| 18 | use embassy::util::Forever; | 17 | use embassy::util::Forever; |
| 19 | use embassy_nrf::peripherals; | 18 | use embassy_nrf::peripherals; |
| 20 | use embassy_nrf::{interrupt, rtc}; | 19 | use embassy_nrf::{interrupt, rtc}; |
| 21 | use nrf52840_hal::clocks; | ||
| 22 | 20 | ||
| 23 | #[task] | 21 | #[task] |
| 24 | async fn run1() { | 22 | async fn run1() { |
| @@ -54,14 +52,9 @@ fn main() -> ! { | |||
| 54 | 52 | ||
| 55 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 53 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 56 | 54 | ||
| 57 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 55 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 58 | .enable_ext_hfosc() | ||
| 59 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 60 | .start_lfclk(); | ||
| 61 | |||
| 62 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 56 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 63 | rtc.start(); | 57 | rtc.start(); |
| 64 | |||
| 65 | unsafe { embassy::time::set_clock(rtc) }; | 58 | unsafe { embassy::time::set_clock(rtc) }; |
| 66 | 59 | ||
| 67 | let alarm = ALARM.put(rtc.alarm0()); | 60 | let alarm = ALARM.put(rtc.alarm0()); |
diff --git a/embassy-nrf-examples/src/bin/multiprio.rs b/embassy-nrf-examples/src/bin/multiprio.rs index 017de3c0d..aa2824f6b 100644 --- a/embassy-nrf-examples/src/bin/multiprio.rs +++ b/embassy-nrf-examples/src/bin/multiprio.rs | |||
| @@ -62,14 +62,10 @@ | |||
| 62 | 62 | ||
| 63 | #[path = "../example_common.rs"] | 63 | #[path = "../example_common.rs"] |
| 64 | mod example_common; | 64 | mod example_common; |
| 65 | use core::mem; | ||
| 66 | |||
| 67 | use example_common::*; | 65 | use example_common::*; |
| 68 | 66 | ||
| 69 | use cortex_m_rt::entry; | 67 | use cortex_m_rt::entry; |
| 70 | use defmt::panic; | 68 | use defmt::panic; |
| 71 | use nrf52840_hal::clocks; | ||
| 72 | |||
| 73 | use embassy::executor::{task, Executor, InterruptExecutor}; | 69 | use embassy::executor::{task, Executor, InterruptExecutor}; |
| 74 | use embassy::interrupt::InterruptExt; | 70 | use embassy::interrupt::InterruptExt; |
| 75 | use embassy::time::{Duration, Instant, Timer}; | 71 | use embassy::time::{Duration, Instant, Timer}; |
| @@ -132,11 +128,7 @@ fn main() -> ! { | |||
| 132 | 128 | ||
| 133 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 129 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 134 | 130 | ||
| 135 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 131 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 136 | .enable_ext_hfosc() | ||
| 137 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 138 | .start_lfclk(); | ||
| 139 | |||
| 140 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 132 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 141 | rtc.start(); | 133 | rtc.start(); |
| 142 | unsafe { embassy::time::set_clock(rtc) }; | 134 | unsafe { embassy::time::set_clock(rtc) }; |
diff --git a/embassy-nrf-examples/src/bin/ppi.rs b/embassy-nrf-examples/src/bin/ppi.rs index 87854fa5c..382c18f88 100644 --- a/embassy-nrf-examples/src/bin/ppi.rs +++ b/embassy-nrf-examples/src/bin/ppi.rs | |||
| @@ -20,7 +20,6 @@ use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; | |||
| 20 | use embassy_nrf::gpiote::{self, InputChannel, InputChannelPolarity}; | 20 | use embassy_nrf::gpiote::{self, InputChannel, InputChannelPolarity}; |
| 21 | use embassy_nrf::ppi::Ppi; | 21 | use embassy_nrf::ppi::Ppi; |
| 22 | use embassy_nrf::{interrupt, Peripherals}; | 22 | use embassy_nrf::{interrupt, Peripherals}; |
| 23 | use futures::future; | ||
| 24 | use gpiote::{OutputChannel, OutputChannelPolarity}; | 23 | use gpiote::{OutputChannel, OutputChannelPolarity}; |
| 25 | 24 | ||
| 26 | #[task] | 25 | #[task] |
diff --git a/embassy-nrf-examples/src/bin/raw_spawn.rs b/embassy-nrf-examples/src/bin/raw_spawn.rs index 1dd604031..f8e021d9b 100644 --- a/embassy-nrf-examples/src/bin/raw_spawn.rs +++ b/embassy-nrf-examples/src/bin/raw_spawn.rs | |||
| @@ -3,19 +3,17 @@ | |||
| 3 | 3 | ||
| 4 | #[path = "../example_common.rs"] | 4 | #[path = "../example_common.rs"] |
| 5 | mod example_common; | 5 | mod example_common; |
| 6 | use core::mem; | ||
| 7 | |||
| 8 | use embassy::executor::raw::Task; | ||
| 9 | use example_common::*; | 6 | use example_common::*; |
| 10 | 7 | ||
| 8 | use core::mem; | ||
| 11 | use cortex_m_rt::entry; | 9 | use cortex_m_rt::entry; |
| 12 | use defmt::panic; | 10 | use defmt::panic; |
| 11 | use embassy::executor::raw::Task; | ||
| 13 | use embassy::executor::Executor; | 12 | use embassy::executor::Executor; |
| 14 | use embassy::time::{Duration, Timer}; | 13 | use embassy::time::{Duration, Timer}; |
| 15 | use embassy::util::Forever; | 14 | use embassy::util::Forever; |
| 16 | use embassy_nrf::peripherals; | 15 | use embassy_nrf::peripherals; |
| 17 | use embassy_nrf::{interrupt, rtc}; | 16 | use embassy_nrf::{interrupt, rtc}; |
| 18 | use nrf52840_hal::clocks; | ||
| 19 | 17 | ||
| 20 | async fn run1() { | 18 | async fn run1() { |
| 21 | loop { | 19 | loop { |
| @@ -41,14 +39,9 @@ fn main() -> ! { | |||
| 41 | 39 | ||
| 42 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 40 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 43 | 41 | ||
| 44 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 42 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 45 | .enable_ext_hfosc() | ||
| 46 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 47 | .start_lfclk(); | ||
| 48 | |||
| 49 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 43 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 50 | rtc.start(); | 44 | rtc.start(); |
| 51 | |||
| 52 | unsafe { embassy::time::set_clock(rtc) }; | 45 | unsafe { embassy::time::set_clock(rtc) }; |
| 53 | 46 | ||
| 54 | let alarm = ALARM.put(rtc.alarm0()); | 47 | let alarm = ALARM.put(rtc.alarm0()); |
diff --git a/embassy-nrf-examples/src/bin/spim.rs b/embassy-nrf-examples/src/bin/spim.rs index 77058bf26..5e2340ffb 100644 --- a/embassy-nrf-examples/src/bin/spim.rs +++ b/embassy-nrf-examples/src/bin/spim.rs | |||
| @@ -8,8 +8,6 @@ | |||
| 8 | #[path = "../example_common.rs"] | 8 | #[path = "../example_common.rs"] |
| 9 | mod example_common; | 9 | mod example_common; |
| 10 | 10 | ||
| 11 | use core::mem; | ||
| 12 | |||
| 13 | use cortex_m_rt::entry; | 11 | use cortex_m_rt::entry; |
| 14 | use defmt::panic; | 12 | use defmt::panic; |
| 15 | use embassy::executor::{task, Executor}; | 13 | use embassy::executor::{task, Executor}; |
| @@ -22,7 +20,6 @@ use embassy_traits::spi::FullDuplex; | |||
| 22 | use embedded_hal::digital::v2::*; | 20 | use embedded_hal::digital::v2::*; |
| 23 | use example_common::*; | 21 | use example_common::*; |
| 24 | use futures::pin_mut; | 22 | use futures::pin_mut; |
| 25 | use nrf52840_hal::clocks; | ||
| 26 | 23 | ||
| 27 | #[task] | 24 | #[task] |
| 28 | async fn run() { | 25 | async fn run() { |
| @@ -98,13 +95,10 @@ fn main() -> ! { | |||
| 98 | 95 | ||
| 99 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 96 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 100 | 97 | ||
| 101 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 98 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 102 | .enable_ext_hfosc() | ||
| 103 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 104 | .start_lfclk(); | ||
| 105 | |||
| 106 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 99 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 107 | rtc.start(); | 100 | rtc.start(); |
| 101 | unsafe { embassy::time::set_clock(rtc) }; | ||
| 108 | 102 | ||
| 109 | unsafe { embassy::time::set_clock(rtc) }; | 103 | unsafe { embassy::time::set_clock(rtc) }; |
| 110 | 104 | ||
diff --git a/embassy-nrf-examples/src/bin/timer.rs b/embassy-nrf-examples/src/bin/timer.rs index 41e5d77a7..47d5d6774 100644 --- a/embassy-nrf-examples/src/bin/timer.rs +++ b/embassy-nrf-examples/src/bin/timer.rs | |||
| @@ -7,8 +7,6 @@ | |||
| 7 | 7 | ||
| 8 | #[path = "../example_common.rs"] | 8 | #[path = "../example_common.rs"] |
| 9 | mod example_common; | 9 | mod example_common; |
| 10 | use core::mem; | ||
| 11 | |||
| 12 | use example_common::*; | 10 | use example_common::*; |
| 13 | 11 | ||
| 14 | use cortex_m_rt::entry; | 12 | use cortex_m_rt::entry; |
| @@ -16,9 +14,7 @@ use defmt::panic; | |||
| 16 | use embassy::executor::{task, Executor}; | 14 | use embassy::executor::{task, Executor}; |
| 17 | use embassy::time::{Duration, Timer}; | 15 | use embassy::time::{Duration, Timer}; |
| 18 | use embassy::util::Forever; | 16 | use embassy::util::Forever; |
| 19 | use embassy_nrf::peripherals; | 17 | use embassy_nrf::{interrupt, peripherals, rtc}; |
| 20 | use embassy_nrf::{interrupt, rtc}; | ||
| 21 | use nrf52840_hal::clocks; | ||
| 22 | 18 | ||
| 23 | #[task] | 19 | #[task] |
| 24 | async fn run1() { | 20 | async fn run1() { |
| @@ -44,16 +40,11 @@ static EXECUTOR: Forever<Executor> = Forever::new(); | |||
| 44 | fn main() -> ! { | 40 | fn main() -> ! { |
| 45 | info!("Hello World!"); | 41 | info!("Hello World!"); |
| 46 | 42 | ||
| 47 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | ||
| 48 | .enable_ext_hfosc() | ||
| 49 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 50 | .start_lfclk(); | ||
| 51 | |||
| 52 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 43 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 53 | 44 | ||
| 45 | unsafe { embassy_nrf::system::configure(Default::default()) }; | ||
| 54 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 46 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 55 | rtc.start(); | 47 | rtc.start(); |
| 56 | |||
| 57 | unsafe { embassy::time::set_clock(rtc) }; | 48 | unsafe { embassy::time::set_clock(rtc) }; |
| 58 | 49 | ||
| 59 | let alarm = ALARM.put(rtc.alarm0()); | 50 | let alarm = ALARM.put(rtc.alarm0()); |
diff --git a/embassy-nrf-examples/src/bin/uart.rs b/embassy-nrf-examples/src/bin/uart.rs index d8644167b..9bbcb3d4e 100644 --- a/embassy-nrf-examples/src/bin/uart.rs +++ b/embassy-nrf-examples/src/bin/uart.rs | |||
| @@ -7,9 +7,6 @@ | |||
| 7 | 7 | ||
| 8 | #[path = "../example_common.rs"] | 8 | #[path = "../example_common.rs"] |
| 9 | mod example_common; | 9 | mod example_common; |
| 10 | use core::mem; | ||
| 11 | |||
| 12 | use embassy_nrf::gpio::NoPin; | ||
| 13 | use example_common::*; | 10 | use example_common::*; |
| 14 | 11 | ||
| 15 | use cortex_m_rt::entry; | 12 | use cortex_m_rt::entry; |
| @@ -17,9 +14,9 @@ use defmt::panic; | |||
| 17 | use embassy::executor::{task, Executor}; | 14 | use embassy::executor::{task, Executor}; |
| 18 | use embassy::traits::uart::{Read, Write}; | 15 | use embassy::traits::uart::{Read, Write}; |
| 19 | use embassy::util::{Forever, Steal}; | 16 | use embassy::util::{Forever, Steal}; |
| 17 | use embassy_nrf::gpio::NoPin; | ||
| 20 | use embassy_nrf::{interrupt, peripherals, rtc, uarte, Peripherals}; | 18 | use embassy_nrf::{interrupt, peripherals, rtc, uarte, Peripherals}; |
| 21 | use futures::pin_mut; | 19 | use futures::pin_mut; |
| 22 | use nrf52840_hal::clocks; | ||
| 23 | 20 | ||
| 24 | #[task] | 21 | #[task] |
| 25 | async fn run() { | 22 | async fn run() { |
| @@ -88,14 +85,9 @@ fn main() -> ! { | |||
| 88 | 85 | ||
| 89 | let p = unwrap!(embassy_nrf::Peripherals::take()); | 86 | let p = unwrap!(embassy_nrf::Peripherals::take()); |
| 90 | 87 | ||
| 91 | clocks::Clocks::new(unsafe { mem::transmute(()) }) | 88 | unsafe { embassy_nrf::system::configure(Default::default()) }; |
| 92 | .enable_ext_hfosc() | ||
| 93 | .set_lfclk_src_external(clocks::LfOscConfiguration::NoExternalNoBypass) | ||
| 94 | .start_lfclk(); | ||
| 95 | |||
| 96 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); | 89 | let rtc = RTC.put(rtc::RTC::new(p.RTC1, interrupt::take!(RTC1))); |
| 97 | rtc.start(); | 90 | rtc.start(); |
| 98 | |||
| 99 | unsafe { embassy::time::set_clock(rtc) }; | 91 | unsafe { embassy::time::set_clock(rtc) }; |
| 100 | 92 | ||
| 101 | let alarm = ALARM.put(rtc.alarm0()); | 93 | let alarm = ALARM.put(rtc.alarm0()); |
diff --git a/embassy-nrf-examples/src/example_common.rs b/embassy-nrf-examples/src/example_common.rs index d16964d4f..54d633837 100644 --- a/embassy-nrf-examples/src/example_common.rs +++ b/embassy-nrf-examples/src/example_common.rs | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | #![macro_use] | 1 | #![macro_use] |
| 2 | 2 | ||
| 3 | use defmt_rtt as _; // global logger | 3 | use defmt_rtt as _; // global logger |
| 4 | use nrf52840_hal as _; | ||
| 5 | use panic_probe as _; | 4 | use panic_probe as _; |
| 6 | 5 | ||
| 7 | pub use defmt::*; | 6 | pub use defmt::*; |
diff --git a/embassy-nrf/Cargo.toml b/embassy-nrf/Cargo.toml index 3ab2c60bd..8ec5b0878 100644 --- a/embassy-nrf/Cargo.toml +++ b/embassy-nrf/Cargo.toml | |||
| @@ -31,8 +31,8 @@ embedded-hal = { version = "0.2.4" } | |||
| 31 | embedded-dma = { version = "0.1.2" } | 31 | embedded-dma = { version = "0.1.2" } |
| 32 | futures = { version = "0.3.5", default-features = false } | 32 | futures = { version = "0.3.5", default-features = false } |
| 33 | 33 | ||
| 34 | nrf52810-pac = { version = "0.9.0", optional = true } | 34 | nrf52810-pac = { version = "0.9.0", optional = true, features = [ "rt" ]} |
| 35 | nrf52811-pac = { version = "0.9.1", optional = true } | 35 | nrf52811-pac = { version = "0.9.1", optional = true, features = [ "rt" ]} |
| 36 | nrf52832-pac = { version = "0.9.0", optional = true } | 36 | nrf52832-pac = { version = "0.9.0", optional = true, features = [ "rt" ]} |
| 37 | nrf52833-pac = { version = "0.9.0", optional = true } | 37 | nrf52833-pac = { version = "0.9.0", optional = true, features = [ "rt" ]} |
| 38 | nrf52840-pac = { version = "0.9.0", optional = true } | 38 | nrf52840-pac = { version = "0.9.0", optional = true, features = [ "rt" ]} |
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index 042050d2f..33d764fba 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs | |||
| @@ -92,6 +92,7 @@ pub mod qspi; | |||
| 92 | pub mod rtc; | 92 | pub mod rtc; |
| 93 | pub mod saadc; | 93 | pub mod saadc; |
| 94 | pub mod spim; | 94 | pub mod spim; |
| 95 | pub mod system; | ||
| 95 | pub mod timer; | 96 | pub mod timer; |
| 96 | pub mod uarte; | 97 | pub mod uarte; |
| 97 | 98 | ||
diff --git a/embassy-nrf/src/system.rs b/embassy-nrf/src/system.rs new file mode 100644 index 000000000..5d36e66fa --- /dev/null +++ b/embassy-nrf/src/system.rs | |||
| @@ -0,0 +1,76 @@ | |||
| 1 | use crate::pac; | ||
| 2 | |||
| 3 | pub enum HfclkSource { | ||
| 4 | Internal, | ||
| 5 | ExternalXtal, | ||
| 6 | } | ||
| 7 | |||
| 8 | pub enum LfclkSource { | ||
| 9 | InternalRC, | ||
| 10 | Synthesized, | ||
| 11 | ExternalXtal, | ||
| 12 | ExternalLowSwing, | ||
| 13 | ExternalFullSwing, | ||
| 14 | } | ||
| 15 | |||
| 16 | #[non_exhaustive] | ||
| 17 | pub struct Config { | ||
| 18 | pub hfclk_source: HfclkSource, | ||
| 19 | pub lfclk_source: LfclkSource, | ||
| 20 | } | ||
| 21 | |||
| 22 | impl Default for Config { | ||
| 23 | fn default() -> Self { | ||
| 24 | Self { | ||
| 25 | // There are hobby nrf52 boards out there without external XTALs... | ||
| 26 | // Default everything to internal so it Just Works. User can enable external | ||
| 27 | // xtals if they know they have them. | ||
| 28 | hfclk_source: HfclkSource::Internal, | ||
| 29 | lfclk_source: LfclkSource::InternalRC, | ||
| 30 | } | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 34 | /// safety: must only call once. | ||
| 35 | pub unsafe fn configure(config: Config) { | ||
| 36 | let r = &*pac::CLOCK::ptr(); | ||
| 37 | |||
| 38 | // Start HFCLK. | ||
| 39 | match config.hfclk_source { | ||
| 40 | HfclkSource::Internal => {} | ||
| 41 | HfclkSource::ExternalXtal => { | ||
| 42 | // Datasheet says this is likely to take 0.36ms | ||
| 43 | r.events_hfclkstarted.write(|w| unsafe { w.bits(0) }); | ||
| 44 | r.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | ||
| 45 | while r.events_hfclkstarted.read().bits() == 0 {} | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | // Configure LFCLK. | ||
| 50 | match config.lfclk_source { | ||
| 51 | LfclkSource::InternalRC => r.lfclksrc.write(|w| w.src().rc()), | ||
| 52 | LfclkSource::Synthesized => r.lfclksrc.write(|w| w.src().synth()), | ||
| 53 | |||
| 54 | LfclkSource::ExternalXtal => r.lfclksrc.write(move |w| w.src().xtal()), | ||
| 55 | |||
| 56 | LfclkSource::ExternalLowSwing => r.lfclksrc.write(move |w| { | ||
| 57 | w.src().xtal(); | ||
| 58 | w.external().enabled(); | ||
| 59 | w.bypass().disabled(); | ||
| 60 | w | ||
| 61 | }), | ||
| 62 | LfclkSource::ExternalFullSwing => r.lfclksrc.write(move |w| { | ||
| 63 | w.src().xtal(); | ||
| 64 | w.external().enabled(); | ||
| 65 | w.bypass().enabled(); | ||
| 66 | w | ||
| 67 | }), | ||
| 68 | } | ||
| 69 | |||
| 70 | // Start LFCLK. | ||
| 71 | // Datasheet says this could take 100us from synth source | ||
| 72 | // 600us from rc source, 0.25s from an external source. | ||
| 73 | r.events_lfclkstarted.write(|w| unsafe { w.bits(0) }); | ||
| 74 | r.tasks_lfclkstart.write(|w| unsafe { w.bits(1) }); | ||
| 75 | while r.events_lfclkstarted.read().bits() == 0 {} | ||
| 76 | } | ||
