diff options
| author | Ulf Lilleengen <[email protected]> | 2025-09-17 09:19:38 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-17 09:19:38 +0000 |
| commit | 90f6497959adf6f0f0a65f1c53be0bd6b0e3f1a7 (patch) | |
| tree | 0cc2100d2e2cf93954d0033d210afcace25cf471 /examples | |
| parent | bbc93851fb9fb31342cc44ba096bed84134427f6 (diff) | |
| parent | a54996d8d76d7168ec458597cee276de975bd699 (diff) | |
Merge pull request #4216 from 1-rafael-1/rp2040-rtc-alarm
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 | 66 |
2 files changed, 73 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..94b5fbd27 --- /dev/null +++ b/examples/rp/src/bin/rtc_alarm.rs | |||
| @@ -0,0 +1,66 @@ | |||
| 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 | if rtc.alarm_scheduled().is_none() { | ||
| 51 | info!("Scheduling alarm for 30 seconds from now"); | ||
| 52 | rtc.schedule_alarm(DateTimeFilter::default().second((dt.second + 30) % 60)); | ||
| 53 | info!("Alarm scheduled: {}", rtc.alarm_scheduled().unwrap()); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | // Alarm triggered | ||
| 57 | Either::Second(_) => { | ||
| 58 | let dt = rtc.now().unwrap(); | ||
| 59 | info!( | ||
| 60 | "ALARM TRIGGERED! Now: {}-{:02}-{:02} {}:{:02}:{:02}", | ||
| 61 | dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, | ||
| 62 | ); | ||
| 63 | } | ||
| 64 | } | ||
| 65 | } | ||
| 66 | } | ||
