risc-v-tlm/tests/C/timer/timer.c

68 lines
1.3 KiB
C
Raw Normal View History

2019-01-13 08:30:49 +08:00
#include <stdio.h>
2019-01-22 20:26:41 +08:00
#define TIMER (*(uint64_t volatile *)0x40004000)
#define TIMER_CMP (*(uint64_t volatile *)0x40004008)
#define TRACE (*(unsigned char volatile *)0x40000000)
2019-01-13 08:30:49 +08:00
2019-01-22 20:26:41 +08:00
volatile uint32_t ticks = 0;
2019-01-13 08:30:49 +08:00
int _write(int file, const char *ptr, int len) {
int x;
for (x = 0; x < len; x++) {
TRACE = *ptr++;
}
return (len);
}
void timer_ISR() {
2019-01-22 20:26:41 +08:00
volatile uint32_t timer_value;
2019-01-13 08:30:49 +08:00
ticks++;
2019-01-22 20:26:41 +08:00
timer_value = TIMER;
// timer is in nanoseconds, set to 1 ms.
// comparator value fixed to take into account number of instructions executed
TIMER_CMP = timer_value + 610;
2019-01-13 08:30:49 +08:00
}
void register_timer_isr() {
2019-01-22 20:26:41 +08:00
asm volatile("la t0, TIMER_CMP_INT");
asm volatile("csrw mtvec, t0");
asm volatile("li t1, 0x888");
asm volatile("csrw mie, t1");
2019-01-23 02:31:13 +08:00
// enable interrupts
asm volatile( "csrs mstatus,1" );
2019-01-13 08:30:49 +08:00
}
int main(void) {
uint32_t timer_value;
uint32_t start_time;
register_timer_isr();
start_time = TIMER;
TIMER_CMP = start_time + 10000;
2019-02-12 03:26:23 +08:00
printf("set timer to %d ns\n", start_time + 10000);
2019-01-22 20:26:41 +08:00
2019-01-13 08:30:49 +08:00
do {
timer_value = TIMER;
2019-01-22 20:26:41 +08:00
} while (timer_value < start_time + 2000000);
2019-01-13 08:30:49 +08:00
2019-02-12 03:26:23 +08:00
printf("Timer: %d ns\n", timer_value);
printf("ticks: %d\n", ticks);
2019-01-22 20:26:41 +08:00
if (ticks > 2100) {
printf("Test OK!\n");
}
printf("Finish\n");
2019-01-13 08:30:49 +08:00
asm volatile ("ecall");
return 0;
}