From 328c1b3394b711135fed11225cccef84220ef6be Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 26 Oct 2014 01:14:39 +0300 Subject: [PATCH] micros() implementation without irq disable --- teensy3/pins_teensy.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/teensy3/pins_teensy.c b/teensy3/pins_teensy.c index 1c81ee9..52df777 100644 --- a/teensy3/pins_teensy.c +++ b/teensy3/pins_teensy.c @@ -690,7 +690,7 @@ volatile uint32_t systick_millis_count = 0; //uint32_t systick_current, systick_count, systick_istatus; // testing only -uint32_t micros(void) +static uint32_t micros_mask(void) { uint32_t count, current, istatus; @@ -707,6 +707,24 @@ uint32_t micros(void) return count * 1000 + current / (F_CPU / 1000000); } +uint32_t micros(void) +{ + uint32_t count, current, istatus; + + if (nvic_execution_priority() <= (SCB_SHPR3 >> 24)) + return micros_mask(); + + do { + current = SYST_CVR; + count = systick_millis_count; + istatus = SCB_ICSR; // bit 26 indicates if systick exception pending + } + while (istatus & SCB_ICSR_PENDSTSET); + + current = ((F_CPU / 1000) - 1) - current; + return count * 1000 + current / (F_CPU / 1000000); +} + void delay(uint32_t ms) { uint32_t start = micros(); -- 2.39.5