From 905629fdca76eb89bb77b86a1fba76d3ba3df479 Mon Sep 17 00:00:00 2001 From: Bergi Date: Sun, 17 Jun 2018 18:59:25 +0200 Subject: [PATCH 1/2] add method to trigger system reset --- src/peripheral/scb.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/peripheral/scb.rs b/src/peripheral/scb.rs index 2ad07702..cfd5e136 100644 --- a/src/peripheral/scb.rs +++ b/src/peripheral/scb.rs @@ -598,3 +598,21 @@ impl SCB { } } } + +const SCB_AIRCR_VECTKEY: u32 = 0x05FA << 16; +const SCB_AIRCR_PRIGROUP_MASK: u32 = 0x5 << 8; +const SCB_AIRCR_SYSRESETREQ: u32 = 1 << 2; + +impl SCB { + /// Initiate a system reset request to reset the MCU + pub fn system_reset(&mut self) -> ! { + ::asm::dsb(); + unsafe { self.aircr.modify(|r| + SCB_AIRCR_VECTKEY | // otherwise the write is ignored + r & SCB_AIRCR_PRIGROUP_MASK | // keep priority group unchanged + SCB_AIRCR_SYSRESETREQ // set the bit + ) }; + ::asm::dsb(); + loop {} // wait for the reset + } +} From 30b40ebe309ac3f2b112e0a318ad6463ecce74da Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Thu, 2 Aug 2018 19:29:31 -0500 Subject: [PATCH 2/2] add side effect to the infinite loop to avoid a LLVM bug --- src/peripheral/scb.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/peripheral/scb.rs b/src/peripheral/scb.rs index cfd5e136..569ec6ac 100644 --- a/src/peripheral/scb.rs +++ b/src/peripheral/scb.rs @@ -613,6 +613,8 @@ impl SCB { SCB_AIRCR_SYSRESETREQ // set the bit ) }; ::asm::dsb(); - loop {} // wait for the reset + loop { // wait for the reset + ::asm::nop(); // avoid rust-lang/rust#28728 + } } }