38 lines
751 B
C
38 lines
751 B
C
|
|
||
|
#include "delay.h"
|
||
|
#include "mk20dx128.h"
|
||
|
|
||
|
// the systick interrupt is supposed to increment this at 1 kHz rate
|
||
|
volatile uint32_t systick_millis_count = 0;
|
||
|
|
||
|
void yield(void) {};
|
||
|
|
||
|
uint32_t micros(void)
|
||
|
{
|
||
|
uint32_t count, current, istatus;
|
||
|
|
||
|
__disable_irq();
|
||
|
current = SYST_CVR;
|
||
|
count = systick_millis_count;
|
||
|
istatus = SCB_ICSR; // bit 26 indicates if systick exception pending
|
||
|
__enable_irq();
|
||
|
if ((istatus & SCB_ICSR_PENDSTSET) && current > ((F_CPU / 1000) - 50)) count++;
|
||
|
current = ((F_CPU / 1000) - 1) - current;
|
||
|
return count * 1000 + current / (F_CPU / 1000000);
|
||
|
}
|
||
|
|
||
|
void delay(uint32_t ms)
|
||
|
{
|
||
|
uint32_t start = micros();
|
||
|
|
||
|
while (1) {
|
||
|
if ((micros() - start) >= 1000) {
|
||
|
ms--;
|
||
|
if (ms == 0) break;
|
||
|
start += 1000;
|
||
|
}
|
||
|
yield();
|
||
|
}
|
||
|
}
|
||
|
|