aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-03-29 00:42:08 +0200
committerDario Nieuwenhuis <[email protected]>2021-03-29 00:58:58 +0200
commit48cf1f6ebf0906de1b043b7e6213a0f6ec70b207 (patch)
tree3d0ecf1d74f60fa7dc9a851b95285c51d0c162f8
parent3a18373828577e5e9d06e9f5c108376fef32fe18 (diff)
nrf/system: add configure
-rw-r--r--embassy-nrf-examples/Cargo.toml1
-rw-r--r--embassy-nrf-examples/src/bin/buffered_uart.rs17
-rw-r--r--embassy-nrf-examples/src/bin/executor_fairness_test.rs9
-rw-r--r--embassy-nrf-examples/src/bin/multiprio.rs10
-rw-r--r--embassy-nrf-examples/src/bin/ppi.rs1
-rw-r--r--embassy-nrf-examples/src/bin/raw_spawn.rs13
-rw-r--r--embassy-nrf-examples/src/bin/spim.rs10
-rw-r--r--embassy-nrf-examples/src/bin/timer.rs13
-rw-r--r--embassy-nrf-examples/src/bin/uart.rs12
-rw-r--r--embassy-nrf-examples/src/example_common.rs1
-rw-r--r--embassy-nrf/Cargo.toml10
-rw-r--r--embassy-nrf/src/lib.rs1
-rw-r--r--embassy-nrf/src/system.rs76
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"] }
28cortex-m-rt = "0.6.13" 28cortex-m-rt = "0.6.13"
29embedded-hal = { version = "0.2.4" } 29embedded-hal = { version = "0.2.4" }
30panic-probe = "0.1.0" 30panic-probe = "0.1.0"
31nrf52840-hal = { version = "0.12.1" }
32futures = { version = "0.3.8", default-features = false, features = ["async-await"] } \ No newline at end of file 31futures = { 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"]
9mod example_common; 9mod example_common;
10use core::mem;
11
12use embassy_nrf::gpio::NoPin;
13use example_common::*;
14 10
15use cortex_m_rt::entry; 11use cortex_m_rt::entry;
16use defmt::panic; 12use defmt::panic;
17use futures::pin_mut;
18use nrf52840_hal::clocks;
19
20use embassy::executor::{task, Executor}; 13use embassy::executor::{task, Executor};
21use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; 14use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
22use embassy::util::{Forever, Steal}; 15use embassy::util::{Forever, Steal};
16use embassy_nrf::gpio::NoPin;
23use embassy_nrf::{buffered_uarte::BufferedUarte, interrupt, peripherals, rtc, uarte, Peripherals}; 17use embassy_nrf::{buffered_uarte::BufferedUarte, interrupt, peripherals, rtc, uarte, Peripherals};
18use example_common::*;
19use futures::pin_mut;
24 20
25#[task] 21#[task]
26async fn run() { 22async 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 @@
9mod example_common; 9mod example_common;
10use example_common::*; 10use example_common::*;
11 11
12use core::mem;
13use core::task::Poll; 12use core::task::Poll;
14use cortex_m_rt::entry; 13use cortex_m_rt::entry;
15use defmt::panic; 14use defmt::panic;
@@ -18,7 +17,6 @@ use embassy::time::{Duration, Instant, Timer};
18use embassy::util::Forever; 17use embassy::util::Forever;
19use embassy_nrf::peripherals; 18use embassy_nrf::peripherals;
20use embassy_nrf::{interrupt, rtc}; 19use embassy_nrf::{interrupt, rtc};
21use nrf52840_hal::clocks;
22 20
23#[task] 21#[task]
24async fn run1() { 22async 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"]
64mod example_common; 64mod example_common;
65use core::mem;
66
67use example_common::*; 65use example_common::*;
68 66
69use cortex_m_rt::entry; 67use cortex_m_rt::entry;
70use defmt::panic; 68use defmt::panic;
71use nrf52840_hal::clocks;
72
73use embassy::executor::{task, Executor, InterruptExecutor}; 69use embassy::executor::{task, Executor, InterruptExecutor};
74use embassy::interrupt::InterruptExt; 70use embassy::interrupt::InterruptExt;
75use embassy::time::{Duration, Instant, Timer}; 71use 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};
20use embassy_nrf::gpiote::{self, InputChannel, InputChannelPolarity}; 20use embassy_nrf::gpiote::{self, InputChannel, InputChannelPolarity};
21use embassy_nrf::ppi::Ppi; 21use embassy_nrf::ppi::Ppi;
22use embassy_nrf::{interrupt, Peripherals}; 22use embassy_nrf::{interrupt, Peripherals};
23use futures::future;
24use gpiote::{OutputChannel, OutputChannelPolarity}; 23use 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"]
5mod example_common; 5mod example_common;
6use core::mem;
7
8use embassy::executor::raw::Task;
9use example_common::*; 6use example_common::*;
10 7
8use core::mem;
11use cortex_m_rt::entry; 9use cortex_m_rt::entry;
12use defmt::panic; 10use defmt::panic;
11use embassy::executor::raw::Task;
13use embassy::executor::Executor; 12use embassy::executor::Executor;
14use embassy::time::{Duration, Timer}; 13use embassy::time::{Duration, Timer};
15use embassy::util::Forever; 14use embassy::util::Forever;
16use embassy_nrf::peripherals; 15use embassy_nrf::peripherals;
17use embassy_nrf::{interrupt, rtc}; 16use embassy_nrf::{interrupt, rtc};
18use nrf52840_hal::clocks;
19 17
20async fn run1() { 18async 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"]
9mod example_common; 9mod example_common;
10 10
11use core::mem;
12
13use cortex_m_rt::entry; 11use cortex_m_rt::entry;
14use defmt::panic; 12use defmt::panic;
15use embassy::executor::{task, Executor}; 13use embassy::executor::{task, Executor};
@@ -22,7 +20,6 @@ use embassy_traits::spi::FullDuplex;
22use embedded_hal::digital::v2::*; 20use embedded_hal::digital::v2::*;
23use example_common::*; 21use example_common::*;
24use futures::pin_mut; 22use futures::pin_mut;
25use nrf52840_hal::clocks;
26 23
27#[task] 24#[task]
28async fn run() { 25async 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"]
9mod example_common; 9mod example_common;
10use core::mem;
11
12use example_common::*; 10use example_common::*;
13 11
14use cortex_m_rt::entry; 12use cortex_m_rt::entry;
@@ -16,9 +14,7 @@ use defmt::panic;
16use embassy::executor::{task, Executor}; 14use embassy::executor::{task, Executor};
17use embassy::time::{Duration, Timer}; 15use embassy::time::{Duration, Timer};
18use embassy::util::Forever; 16use embassy::util::Forever;
19use embassy_nrf::peripherals; 17use embassy_nrf::{interrupt, peripherals, rtc};
20use embassy_nrf::{interrupt, rtc};
21use nrf52840_hal::clocks;
22 18
23#[task] 19#[task]
24async fn run1() { 20async fn run1() {
@@ -44,16 +40,11 @@ static EXECUTOR: Forever<Executor> = Forever::new();
44fn main() -> ! { 40fn 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"]
9mod example_common; 9mod example_common;
10use core::mem;
11
12use embassy_nrf::gpio::NoPin;
13use example_common::*; 10use example_common::*;
14 11
15use cortex_m_rt::entry; 12use cortex_m_rt::entry;
@@ -17,9 +14,9 @@ use defmt::panic;
17use embassy::executor::{task, Executor}; 14use embassy::executor::{task, Executor};
18use embassy::traits::uart::{Read, Write}; 15use embassy::traits::uart::{Read, Write};
19use embassy::util::{Forever, Steal}; 16use embassy::util::{Forever, Steal};
17use embassy_nrf::gpio::NoPin;
20use embassy_nrf::{interrupt, peripherals, rtc, uarte, Peripherals}; 18use embassy_nrf::{interrupt, peripherals, rtc, uarte, Peripherals};
21use futures::pin_mut; 19use futures::pin_mut;
22use nrf52840_hal::clocks;
23 20
24#[task] 21#[task]
25async fn run() { 22async 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
3use defmt_rtt as _; // global logger 3use defmt_rtt as _; // global logger
4use nrf52840_hal as _;
5use panic_probe as _; 4use panic_probe as _;
6 5
7pub use defmt::*; 6pub 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" }
31embedded-dma = { version = "0.1.2" } 31embedded-dma = { version = "0.1.2" }
32futures = { version = "0.3.5", default-features = false } 32futures = { version = "0.3.5", default-features = false }
33 33
34nrf52810-pac = { version = "0.9.0", optional = true } 34nrf52810-pac = { version = "0.9.0", optional = true, features = [ "rt" ]}
35nrf52811-pac = { version = "0.9.1", optional = true } 35nrf52811-pac = { version = "0.9.1", optional = true, features = [ "rt" ]}
36nrf52832-pac = { version = "0.9.0", optional = true } 36nrf52832-pac = { version = "0.9.0", optional = true, features = [ "rt" ]}
37nrf52833-pac = { version = "0.9.0", optional = true } 37nrf52833-pac = { version = "0.9.0", optional = true, features = [ "rt" ]}
38nrf52840-pac = { version = "0.9.0", optional = true } 38nrf52840-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;
92pub mod rtc; 92pub mod rtc;
93pub mod saadc; 93pub mod saadc;
94pub mod spim; 94pub mod spim;
95pub mod system;
95pub mod timer; 96pub mod timer;
96pub mod uarte; 97pub 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 @@
1use crate::pac;
2
3pub enum HfclkSource {
4 Internal,
5 ExternalXtal,
6}
7
8pub enum LfclkSource {
9 InternalRC,
10 Synthesized,
11 ExternalXtal,
12 ExternalLowSwing,
13 ExternalFullSwing,
14}
15
16#[non_exhaustive]
17pub struct Config {
18 pub hfclk_source: HfclkSource,
19 pub lfclk_source: LfclkSource,
20}
21
22impl 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.
35pub 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}