filename | test/timer.c |
changeset | 262:bc96e0b79308 |
prev | 225:e5cea6125580 |
next | 272:fb6be85235e8 |
author | nkeynes |
date | Wed Jan 03 09:03:50 2007 +0000 (17 years ago) |
permissions | -rw-r--r-- |
last change | Fix to actually work (need the write read/write sizes) Implement the microsecond conversion function |
file | annotate | diff | log | raw |
nkeynes@225 | 1 | #include "../lib.h" |
nkeynes@225 | 2 | #define TMU_CHANNEL 2 |
nkeynes@262 | 3 | #define BASE_TICKS_PER_US 200 |
nkeynes@262 | 4 | #define CLOCK_DIVIDER 16 |
nkeynes@225 | 5 | #define TOCR 0xFFD80000 /* Output control register */ |
nkeynes@225 | 6 | #define TSTR 0xFFD80004 /* Start register */ |
nkeynes@225 | 7 | #define TCOR(c) (0xFFD80008 + (c*12)) /* Constant register */ |
nkeynes@225 | 8 | #define TCNT(c) (0xFFD8000C + (c*12)) /* Count register */ |
nkeynes@225 | 9 | #define TCR(c) (0xFFD80010 + (c*12)) /* Control register */ |
nkeynes@225 | 10 | |
nkeynes@225 | 11 | /** |
nkeynes@225 | 12 | * Initialize the on-chip timer controller. We snag TMU channel 2 in its |
nkeynes@225 | 13 | * highest resolution mode, and start it counting down from max_int. |
nkeynes@225 | 14 | */ |
nkeynes@225 | 15 | void timer_start() { |
nkeynes@262 | 16 | unsigned int val = byte_read(TSTR); |
nkeynes@262 | 17 | byte_write( TSTR, val & (~(1<<TMU_CHANNEL)) ); /* Stop counter */ |
nkeynes@225 | 18 | long_write( TCOR(TMU_CHANNEL), 0xFFFFFFFF ); |
nkeynes@225 | 19 | long_write( TCNT(TMU_CHANNEL), 0xFFFFFFFF ); |
nkeynes@262 | 20 | word_write( TCR(TMU_CHANNEL), 0x00000000 ); |
nkeynes@262 | 21 | byte_write( TSTR, val | (1<<TMU_CHANNEL) ); |
nkeynes@225 | 22 | } |
nkeynes@225 | 23 | |
nkeynes@225 | 24 | /** |
nkeynes@225 | 25 | * Report the current value of TMU2. |
nkeynes@225 | 26 | */ |
nkeynes@262 | 27 | unsigned int timer_gettime() { |
nkeynes@225 | 28 | return long_read(TCNT(TMU_CHANNEL)); |
nkeynes@225 | 29 | } |
nkeynes@225 | 30 | |
nkeynes@225 | 31 | /** |
nkeynes@225 | 32 | * Stop TMU2 and report the current value. |
nkeynes@225 | 33 | */ |
nkeynes@262 | 34 | unsigned int timer_stop() { |
nkeynes@225 | 35 | long_write( TSTR, long_read(TSTR) & (~(1<<TMU_CHANNEL)) ); |
nkeynes@225 | 36 | return long_read( TCNT(TMU_CHANNEL) ); |
nkeynes@225 | 37 | } |
nkeynes@225 | 38 | |
nkeynes@225 | 39 | |
nkeynes@225 | 40 | /** |
nkeynes@225 | 41 | * Convert the supplied timer value to a number of micro seconds since the timer |
nkeynes@225 | 42 | * was started. |
nkeynes@225 | 43 | */ |
nkeynes@262 | 44 | unsigned int timer_to_microsecs( unsigned int value ) { |
nkeynes@262 | 45 | return (0xFFFFFFFF - value) * CLOCK_DIVIDER / BASE_TICKS_PER_US; |
nkeynes@225 | 46 | } |
nkeynes@262 | 47 | |
nkeynes@262 | 48 | unsigned int timer_gettime_us() { |
nkeynes@262 | 49 | return timer_to_microsecs( timer_gettime() ); |
nkeynes@262 | 50 | } |
.