aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
author1-rafael-1 <[email protected]>2025-05-16 23:22:34 +0200
committer1-rafael-1 <[email protected]>2025-05-16 23:22:34 +0200
commit1a12942f530df6b3dbd316ca29daf0b9d83ec36d (patch)
tree62cf7a05a4ff6497aab9e176415ca469a6c8046f /examples
parent575eab3c60c0d2098f9e9d2a22429aa174b6b968 (diff)
embassy-rp (rp2040): Rtc wait_for_alarm
Diffstat (limited to 'examples')
-rw-r--r--examples/rp/src/bin/rtc.rs8
-rw-r--r--examples/rp/src/bin/rtc_alarm.rs69
2 files changed, 76 insertions, 1 deletions
diff --git a/examples/rp/src/bin/rtc.rs b/examples/rp/src/bin/rtc.rs
index e9a5e43a8..1692bdf36 100644
--- a/examples/rp/src/bin/rtc.rs
+++ b/examples/rp/src/bin/rtc.rs
@@ -5,16 +5,22 @@
5 5
6use defmt::*; 6use defmt::*;
7use embassy_executor::Spawner; 7use embassy_executor::Spawner;
8use embassy_rp::bind_interrupts;
8use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc}; 9use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc};
9use embassy_time::Timer; 10use embassy_time::Timer;
10use {defmt_rtt as _, panic_probe as _}; 11use {defmt_rtt as _, panic_probe as _};
11 12
13// Bind the RTC interrupt to the handler
14bind_interrupts!(struct Irqs {
15 RTC_IRQ => embassy_rp::rtc::InterruptHandler;
16});
17
12#[embassy_executor::main] 18#[embassy_executor::main]
13async fn main(_spawner: Spawner) { 19async fn main(_spawner: Spawner) {
14 let p = embassy_rp::init(Default::default()); 20 let p = embassy_rp::init(Default::default());
15 info!("Wait for 20s"); 21 info!("Wait for 20s");
16 22
17 let mut rtc = Rtc::new(p.RTC); 23 let mut rtc = Rtc::new(p.RTC, Irqs);
18 24
19 if !rtc.is_running() { 25 if !rtc.is_running() {
20 info!("Start RTC"); 26 info!("Start RTC");
diff --git a/examples/rp/src/bin/rtc_alarm.rs b/examples/rp/src/bin/rtc_alarm.rs
new file mode 100644
index 000000000..83421014f
--- /dev/null
+++ b/examples/rp/src/bin/rtc_alarm.rs
@@ -0,0 +1,69 @@
1//! This example shows how to use RTC (Real Time Clock) for scheduling alarms and reacting to them.
2
3#![no_std]
4#![no_main]
5
6use defmt::*;
7use embassy_executor::Spawner;
8use embassy_futures::select::{select, Either};
9use embassy_rp::bind_interrupts;
10use embassy_rp::rtc::{DateTime, DateTimeFilter, DayOfWeek, Rtc};
11use embassy_time::Timer;
12use {defmt_rtt as _, panic_probe as _};
13
14// Bind the RTC interrupt to the handler
15bind_interrupts!(struct Irqs {
16 RTC_IRQ => embassy_rp::rtc::InterruptHandler;
17});
18
19#[embassy_executor::main]
20async fn main(_spawner: Spawner) {
21 let p = embassy_rp::init(Default::default());
22 let mut rtc = Rtc::new(p.RTC, Irqs);
23
24 if !rtc.is_running() {
25 info!("Start RTC");
26 let now = DateTime {
27 year: 2000,
28 month: 1,
29 day: 1,
30 day_of_week: DayOfWeek::Saturday,
31 hour: 0,
32 minute: 0,
33 second: 0,
34 };
35 rtc.set_datetime(now).unwrap();
36 }
37
38 loop {
39 // Wait for 5 seconds or until the alarm is triggered
40 match select(Timer::after_secs(5), rtc.wait_for_alarm()).await {
41 // Timer expired
42 Either::First(_) => {
43 let dt = rtc.now().unwrap();
44 info!(
45 "Now: {}-{:02}-{:02} {}:{:02}:{:02}",
46 dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second,
47 );
48
49 // See if the alarm is already scheduled, if not, schedule it
50 match rtc.alarm_scheduled() {
51 None => {
52 info!("Scheduling alarm for 30 seconds from now");
53 let next_30s = if dt.second == 59 { 0 } else { dt.second + 30 };
54 let dtf = DateTimeFilter::default().second(next_30s);
55
56 rtc.schedule_alarm(dtf);
57
58 info!("Alarm scheduled: {}", rtc.alarm_scheduled().unwrap());
59 }
60 Some(_) => {}
61 }
62 }
63 // Alarm triggered
64 Either::Second(_) => {
65 info!("ALARM TRIGGERED!");
66 }
67 }
68 }
69}