From f5de8307b24bc6e8ce0190c73ebf6ae423d0c9ac Mon Sep 17 00:00:00 2001 From: Jorge Aparicio Date: Wed, 1 May 2019 23:32:22 +0200 Subject: [PATCH] unlock the DWT, if locked, when using the timer queue --- macros/src/codegen.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs index 4468216f53..d5bd3b4229 100644 --- a/macros/src/codegen.rs +++ b/macros/src/codegen.rs @@ -2024,6 +2024,15 @@ fn pre_init(ctxt: &Context, app: &App, analysis: &Analysis) -> proc_macro2::Toke // Set the cycle count to 0 and disable it while `init` executes if cfg!(feature = "timer-queue") { + exprs.push(quote!( + // unlock the DWT, if software locked + // See ARM CoreSight Architecture Specification v3.0, section B2.3.10 + // 1 << 0 = Software lock mechanism is implemented. + // 1 << 1 = Writing to the other registers in the component is blocked + if p.DWT.lsr.read() & 0b11 == 0b11 { + p.DWT.lar.write(0xC5ACCE55); + } + )); exprs.push(quote!(p.DWT.ctrl.modify(|r| r & !1);)); exprs.push(quote!(p.DWT.cyccnt.write(0);)); }