aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/src/wdt.rs24
-rw-r--r--examples/boot/application/nrf/src/bin/a.rs18
2 files changed, 42 insertions, 0 deletions
diff --git a/embassy-nrf/src/wdt.rs b/embassy-nrf/src/wdt.rs
index 8760aa301..330ca98bf 100644
--- a/embassy-nrf/src/wdt.rs
+++ b/embassy-nrf/src/wdt.rs
@@ -23,6 +23,30 @@ pub struct Config {
23 pub run_during_debug_halt: bool, 23 pub run_during_debug_halt: bool,
24} 24}
25 25
26impl Config {
27 /// Create a config structure from the current configuration of the WDT
28 /// peripheral.
29 pub fn try_new(_wdt: &peripherals::WDT) -> Option<Self> {
30 let r = unsafe { &*WDT::ptr() };
31
32 #[cfg(not(feature = "_nrf9160"))]
33 let runstatus = r.runstatus.read().runstatus().bit();
34 #[cfg(feature = "_nrf9160")]
35 let runstatus = r.runstatus.read().runstatuswdt().bit();
36
37 if runstatus {
38 let config = r.config.read();
39 Some(Self {
40 timeout_ticks: r.crv.read().bits(),
41 run_during_sleep: config.sleep().bit(),
42 run_during_debug_halt: config.halt().bit(),
43 })
44 } else {
45 None
46 }
47 }
48}
49
26impl Default for Config { 50impl Default for Config {
27 fn default() -> Self { 51 fn default() -> Self {
28 Self { 52 Self {
diff --git a/examples/boot/application/nrf/src/bin/a.rs b/examples/boot/application/nrf/src/bin/a.rs
index 7a404a914..83191f388 100644
--- a/examples/boot/application/nrf/src/bin/a.rs
+++ b/examples/boot/application/nrf/src/bin/a.rs
@@ -8,6 +8,7 @@ use embassy_embedded_hal::adapter::BlockingAsync;
8use embassy_executor::Spawner; 8use embassy_executor::Spawner;
9use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; 9use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull};
10use embassy_nrf::nvmc::Nvmc; 10use embassy_nrf::nvmc::Nvmc;
11use embassy_nrf::wdt::{self, Watchdog};
11use panic_reset as _; 12use panic_reset as _;
12 13
13static APP_B: &[u8] = include_bytes!("../../b.bin"); 14static APP_B: &[u8] = include_bytes!("../../b.bin");
@@ -20,6 +21,23 @@ async fn main(_spawner: Spawner) {
20 //let mut led = Output::new(p.P1_10, Level::Low, OutputDrive::Standard); 21 //let mut led = Output::new(p.P1_10, Level::Low, OutputDrive::Standard);
21 //let mut button = Input::new(p.P1_02, Pull::Up); 22 //let mut button = Input::new(p.P1_02, Pull::Up);
22 23
24 // The following code block illustrates how to obtain a watchdog that is configured
25 // as per the existing watchdog. Ordinarily, we'd use the handle returned to "pet" the
26 // watchdog periodically. If we don't, and we're not going to for this example, then
27 // the watchdog will cause the device to reset as per its configured timeout in the bootloader.
28 // This helps is avoid a situation where new firmware might be bad and block our executor.
29 // If firmware is bad in this way then the bootloader will revert to any previous version.
30 let wdt_config = wdt::Config::try_new(&p.WDT).unwrap();
31 let (_wdt, [_wdt_handle]) = match Watchdog::try_new(p.WDT, wdt_config) {
32 Ok(x) => x,
33 Err(_) => {
34 // Watchdog already active with the wrong number of handles, waiting for it to timeout...
35 loop {
36 cortex_m::asm::wfe();
37 }
38 }
39 };
40
23 let nvmc = Nvmc::new(p.NVMC); 41 let nvmc = Nvmc::new(p.NVMC);
24 let mut nvmc = BlockingAsync::new(nvmc); 42 let mut nvmc = BlockingAsync::new(nvmc);
25 43