-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
clock.c
78 lines (63 loc) · 1.51 KB
/
clock.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <sys/clock.h>
#include <sys/cc.h>
#include <sys/etimer.h>
#include <debug-uart.h>
#include <libopencm3/cm3/systick.h>
static volatile clock_time_t current_clock = 0;
static volatile unsigned long current_seconds = 0;
static unsigned int second_countdown = CLOCK_SECOND;
void sys_tick_handler(void) __attribute__ ((interrupt));
void
sys_tick_handler(void)
{
current_clock++;
if(etimer_pending() && etimer_next_expiration_time() <= current_clock) {
etimer_request_poll();
/* printf("%d,%d\n", clock_time(),etimer_next_expiration_time ()); */
}
if(--second_countdown == 0) {
current_seconds++;
second_countdown = CLOCK_SECOND;
}
}
void
clock_init()
{
systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8);
/*72mhz / 8 / 1000 */
systick_set_reload(MCK / 8 / CLOCK_SECOND);
systick_interrupt_enable();
systick_counter_enable();
}
clock_time_t
clock_time(void)
{
return current_clock;
}
unsigned long
clock_seconds(void)
{
return current_seconds;
}
/* TODO: This code needs to be evaluated for the stm32f107 and
* implemented
*/
#if 0
/* The inner loop takes 4 cycles. The outer 5+SPIN_COUNT*4. */
#define SPIN_TIME 2 /* us */
#define SPIN_COUNT (((MCK*SPIN_TIME/1000000)-5)/4)
#ifndef __MAKING_DEPS__
void
clock_delay(unsigned int t)
{
#ifdef __THUMBEL__
asm
volatile
("1: mov r1,%2\n2:\tsub r1,#1\n\tbne 2b\n\tsub %0,#1\n\tbne 1b\n":"=l"
(t):"0"(t), "l"(SPIN_COUNT));
#else
#error Must be compiled in thumb mode
#endif
}
#endif
#endif /* __MAKING_DEPS__ */