diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/rp/src/bin/rtc.rs | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/examples/rp/src/bin/rtc.rs b/examples/rp/src/bin/rtc.rs index 6300950d4..2ddde3257 100644 --- a/examples/rp/src/bin/rtc.rs +++ b/examples/rp/src/bin/rtc.rs | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_rp::pac::rtc::regs::{Rtc0, Rtc1}; | ||
| 7 | use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc}; | 8 | use embassy_rp::rtc::{DateTime, DayOfWeek, Rtc}; |
| 8 | use embassy_time::{Duration, Timer}; | 9 | use embassy_time::{Duration, Timer}; |
| 9 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -11,29 +12,41 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 11 | #[embassy_executor::main] | 12 | #[embassy_executor::main] |
| 12 | async fn main(_spawner: Spawner) { | 13 | async fn main(_spawner: Spawner) { |
| 13 | let p = embassy_rp::init(Default::default()); | 14 | let p = embassy_rp::init(Default::default()); |
| 14 | info!("Hello World!"); | 15 | info!("Wait for 20s"); |
| 15 | |||
| 16 | let now = DateTime { | ||
| 17 | year: 2020, | ||
| 18 | month: 5, | ||
| 19 | day: 15, | ||
| 20 | day_of_week: DayOfWeek::Monday, | ||
| 21 | hour: 10, | ||
| 22 | minute: 30, | ||
| 23 | second: 50, | ||
| 24 | }; | ||
| 25 | 16 | ||
| 17 | let mut watchdog = embassy_rp::watchdog::Watchdog::new(p.WATCHDOG); | ||
| 26 | let mut rtc = Rtc::new(p.RTC); | 18 | let mut rtc = Rtc::new(p.RTC); |
| 27 | if rtc.set_datetime(now).is_ok() { | ||
| 28 | // In reality the delay would be much longer | ||
| 29 | Timer::after(Duration::from_millis(20000)).await; | ||
| 30 | 19 | ||
| 31 | if let Ok(dt) = rtc.now() { | 20 | let rtc0 = Rtc0(watchdog.get_scratch0()); |
| 32 | info!( | 21 | let rtc1 = Rtc1(watchdog.get_scratch1()); |
| 33 | "Now: {}-{}-{} {}:{}:{}", | 22 | if rtc1.year() >= 2020 { |
| 34 | dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, | 23 | rtc.restore(rtc1, rtc0); |
| 35 | ); | 24 | } else { |
| 36 | } | 25 | let now = DateTime { |
| 26 | year: 2020, | ||
| 27 | month: 5, | ||
| 28 | day: 15, | ||
| 29 | day_of_week: DayOfWeek::Monday, | ||
| 30 | hour: 10, | ||
| 31 | minute: 30, | ||
| 32 | second: 50, | ||
| 33 | }; | ||
| 34 | rtc.set_datetime(now).unwrap(); | ||
| 37 | } | 35 | } |
| 38 | info!("Done."); | 36 | |
| 37 | Timer::after(Duration::from_millis(20000)).await; | ||
| 38 | |||
| 39 | if let Ok(dt) = rtc.now() { | ||
| 40 | info!( | ||
| 41 | "Now: {}-{:02}-{:02} {}:{:02}:{:02}", | ||
| 42 | dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, | ||
| 43 | ); | ||
| 44 | let (rtc1, rtc0) = rtc.save(); | ||
| 45 | watchdog.set_scratch0(rtc0.0); | ||
| 46 | watchdog.set_scratch1(rtc1.0); | ||
| 47 | } | ||
| 48 | |||
| 49 | info!("Reboot."); | ||
| 50 | Timer::after(Duration::from_millis(200)).await; | ||
| 51 | cortex_m::peripheral::SCB::sys_reset(); | ||
| 39 | } | 52 | } |
