aboutsummaryrefslogtreecommitdiff
path: root/embassy-nrf/src
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2021-10-18 15:24:31 +0200
committerUlf Lilleengen <[email protected]>2021-10-19 07:18:56 +0200
commit2ef4a45fa0e153cb6435c4dc52f19108ca808cc7 (patch)
tree8681889a127109a49d592b2857232c18e64645a6 /embassy-nrf/src
parent729b17bc25fed42b4348cae0fb3d781590572c3f (diff)
Add support for temperature sensor peripheral
* Add TEMP peripheral to all nRF52 chips * Add async HAL for reading temperature values * Add example application reading temperature values
Diffstat (limited to 'embassy-nrf/src')
-rw-r--r--embassy-nrf/src/chips/nrf52805.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52810.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52811.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52820.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52832.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52833.rs3
-rw-r--r--embassy-nrf/src/chips/nrf52840.rs3
-rw-r--r--embassy-nrf/src/lib.rs2
-rw-r--r--embassy-nrf/src/temp.rs84
9 files changed, 107 insertions, 0 deletions
diff --git a/embassy-nrf/src/chips/nrf52805.rs b/embassy-nrf/src/chips/nrf52805.rs
index db1fac2ff..317e6ed66 100644
--- a/embassy-nrf/src/chips/nrf52805.rs
+++ b/embassy-nrf/src/chips/nrf52805.rs
@@ -114,6 +114,9 @@ embassy_hal_common::peripherals! {
114 P0_29, 114 P0_29,
115 P0_30, 115 P0_30,
116 P0_31, 116 P0_31,
117
118 // TEMP
119 TEMP,
117} 120}
118 121
119impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 122impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52810.rs b/embassy-nrf/src/chips/nrf52810.rs
index 06b9bfb38..b26f30cbf 100644
--- a/embassy-nrf/src/chips/nrf52810.rs
+++ b/embassy-nrf/src/chips/nrf52810.rs
@@ -117,6 +117,9 @@ embassy_hal_common::peripherals! {
117 P0_29, 117 P0_29,
118 P0_30, 118 P0_30,
119 P0_31, 119 P0_31,
120
121 // TEMP
122 TEMP,
120} 123}
121 124
122impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 125impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52811.rs b/embassy-nrf/src/chips/nrf52811.rs
index 2f8d98b31..9fbe3594e 100644
--- a/embassy-nrf/src/chips/nrf52811.rs
+++ b/embassy-nrf/src/chips/nrf52811.rs
@@ -117,6 +117,9 @@ embassy_hal_common::peripherals! {
117 P0_29, 117 P0_29,
118 P0_30, 118 P0_30,
119 P0_31, 119 P0_31,
120
121 // TEMP
122 TEMP,
120} 123}
121 124
122impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 125impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52820.rs b/embassy-nrf/src/chips/nrf52820.rs
index fc7a367ef..abbdba7ac 100644
--- a/embassy-nrf/src/chips/nrf52820.rs
+++ b/embassy-nrf/src/chips/nrf52820.rs
@@ -112,6 +112,9 @@ embassy_hal_common::peripherals! {
112 P0_29, 112 P0_29,
113 P0_30, 113 P0_30,
114 P0_31, 114 P0_31,
115
116 // TEMP
117 TEMP,
115} 118}
116 119
117impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 120impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52832.rs b/embassy-nrf/src/chips/nrf52832.rs
index 47cf27de4..de6dd7a8c 100644
--- a/embassy-nrf/src/chips/nrf52832.rs
+++ b/embassy-nrf/src/chips/nrf52832.rs
@@ -124,6 +124,9 @@ embassy_hal_common::peripherals! {
124 P0_29, 124 P0_29,
125 P0_30, 125 P0_30,
126 P0_31, 126 P0_31,
127
128 // TEMP
129 TEMP,
127} 130}
128 131
129impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 132impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52833.rs b/embassy-nrf/src/chips/nrf52833.rs
index b3d813e24..c5e1c9d33 100644
--- a/embassy-nrf/src/chips/nrf52833.rs
+++ b/embassy-nrf/src/chips/nrf52833.rs
@@ -144,6 +144,9 @@ embassy_hal_common::peripherals! {
144 P1_13, 144 P1_13,
145 P1_14, 145 P1_14,
146 P1_15, 146 P1_15,
147
148 // TEMP
149 TEMP,
147} 150}
148 151
149impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 152impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/chips/nrf52840.rs b/embassy-nrf/src/chips/nrf52840.rs
index 473036f61..76cabe6f1 100644
--- a/embassy-nrf/src/chips/nrf52840.rs
+++ b/embassy-nrf/src/chips/nrf52840.rs
@@ -147,6 +147,9 @@ embassy_hal_common::peripherals! {
147 P1_13, 147 P1_13,
148 P1_14, 148 P1_14,
149 P1_15, 149 P1_15,
150
151 // TEMP
152 TEMP,
150} 153}
151 154
152impl_uarte!(UARTE0, UARTE0, UARTE0_UART0); 155impl_uarte!(UARTE0, UARTE0, UARTE0_UART0);
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs
index 00c719a17..120df99d5 100644
--- a/embassy-nrf/src/lib.rs
+++ b/embassy-nrf/src/lib.rs
@@ -43,6 +43,8 @@ pub mod timer;
43pub mod twim; 43pub mod twim;
44pub mod uarte; 44pub mod uarte;
45pub mod wdt; 45pub mod wdt;
46#[cfg(not(feature = "nrf9160"))]
47pub mod temp;
46 48
47// This mod MUST go last, so that it sees all the `impl_foo!` macros 49// This mod MUST go last, so that it sees all the `impl_foo!` macros
48#[cfg(feature = "nrf52805")] 50#[cfg(feature = "nrf52805")]
diff --git a/embassy-nrf/src/temp.rs b/embassy-nrf/src/temp.rs
new file mode 100644
index 000000000..6a334c64d
--- /dev/null
+++ b/embassy-nrf/src/temp.rs
@@ -0,0 +1,84 @@
1//! Temperature sensor interface.
2
3use crate::interrupt;
4use crate::pac;
5use crate::peripherals::TEMP;
6
7use core::future::Future;
8use core::marker::PhantomData;
9use embassy::channel::signal::Signal;
10use embassy::interrupt::InterruptExt;
11use embassy::util::Unborrow;
12use embassy_hal_common::{drop::OnDrop, unborrow};
13use fixed::types::I30F2;
14
15/// Integrated temperature sensor.
16pub struct Temp<'d> {
17 _temp: PhantomData<&'d TEMP>,
18 _irq: interrupt::TEMP,
19}
20
21static IRQ: Signal<I30F2> = Signal::new();
22
23impl<'d> Temp<'d> {
24 pub fn new(
25 _t: impl Unborrow<Target = TEMP> + 'd,
26 irq: impl Unborrow<Target = interrupt::TEMP> + 'd,
27 ) -> Self {
28 unborrow!(_t, irq);
29
30 let t = Self::regs();
31
32 // Enable interrupt that signals temperature values
33 t.intenset.write(|w| w.datardy().set());
34 irq.disable();
35 irq.set_handler(|_| {
36 let t = Self::regs();
37 t.events_datardy.reset();
38 let raw = t.temp.read().bits();
39 IRQ.signal(I30F2::from_bits(raw as i32));
40 });
41 irq.enable();
42 Self {
43 _temp: PhantomData,
44 _irq: irq,
45 }
46 }
47
48 /// Perform an asynchronous temperature measurement. The returned future
49 /// can be awaited to obtain the measurement.
50 ///
51 /// If the future is dropped, the measurement is cancelled.
52 ///
53 /// # Example
54 ///
55 /// ```no_run
56 /// let mut t = Temp::new(p.TEMP, interrupt::take!(TEMP));
57 /// let v: u16 = t.read().await.to_num::<u16>();
58 /// ```
59 pub fn read(&mut self) -> impl Future<Output = I30F2> {
60 // In case the future is dropped, stop the task and reset events.
61 let on_drop = OnDrop::new(|| {
62 let t = Self::regs();
63 unsafe {
64 t.tasks_stop.write(|w| w.bits(1));
65 }
66 t.events_datardy.reset();
67 });
68
69 let t = Self::regs();
70 // Empty signal channel and start measurement.
71 IRQ.reset();
72 unsafe { t.tasks_start.write(|w| w.bits(1)) };
73
74 async move {
75 let value = IRQ.wait().await;
76 on_drop.defuse();
77 value
78 }
79 }
80
81 fn regs() -> &'static pac::temp::RegisterBlock {
82 unsafe { &*pac::TEMP::ptr() }
83 }
84}