X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=teensytas.git;a=blobdiff_plain;f=teensy3%2Fpins_teensy.c;fp=teensy3%2Fpins_teensy.c;h=52df77794b83eb129713406b3d196a8bdb787b29;hp=1c81ee9e70e9d34d385a0a38ad648fcfa60626b2;hb=328c1b3394b711135fed11225cccef84220ef6be;hpb=de20174211c3896daaec07af3fba6d3a798e0ae9 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();