diff options
| author | 1-rafael-1 <[email protected]> | 2025-05-16 23:22:34 +0200 |
|---|---|---|
| committer | 1-rafael-1 <[email protected]> | 2025-05-16 23:22:34 +0200 |
| commit | 1a12942f530df6b3dbd316ca29daf0b9d83ec36d (patch) | |
| tree | 62cf7a05a4ff6497aab9e176415ca469a6c8046f /examples | |
| parent | 575eab3c60c0d2098f9e9d2a22429aa174b6b968 (diff) | |
embassy-rp (rp2040): Rtc wait_for_alarm
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/rp/src/bin/rtc.rs | 8 | ||||
| -rw-r--r-- | examples/rp/src/bin/rtc_alarm.rs | 69 |
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 | ||
| 6 | use defmt::*; | 6 | use defmt::*; |
| 7 | use embassy_executor::Spawner; | 7 | use embassy_executor::Spawner; |
| 8 | use embassy_rp::bind_interrupts; | ||
| 8 | use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc}; | 9 | use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc}; |
| 9 | use embassy_time::Timer; | 10 | use embassy_time::Timer; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 11 | 12 | ||
| 13 | // Bind the RTC interrupt to the handler | ||
| 14 | bind_interrupts!(struct Irqs { | ||
| 15 | RTC_IRQ => embassy_rp::rtc::InterruptHandler; | ||
| 16 | }); | ||
| 17 | |||
| 12 | #[embassy_executor::main] | 18 | #[embassy_executor::main] |
| 13 | async fn main(_spawner: Spawner) { | 19 | async 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 | |||
| 6 | use defmt::*; | ||
| 7 | use embassy_executor::Spawner; | ||
| 8 | use embassy_futures::select::{select, Either}; | ||
| 9 | use embassy_rp::bind_interrupts; | ||
| 10 | use embassy_rp::rtc::{DateTime, DateTimeFilter, DayOfWeek, Rtc}; | ||
| 11 | use embassy_time::Timer; | ||
| 12 | use {defmt_rtt as _, panic_probe as _}; | ||
| 13 | |||
| 14 | // Bind the RTC interrupt to the handler | ||
| 15 | bind_interrupts!(struct Irqs { | ||
| 16 | RTC_IRQ => embassy_rp::rtc::InterruptHandler; | ||
| 17 | }); | ||
| 18 | |||
| 19 | #[embassy_executor::main] | ||
| 20 | async 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 | } | ||
