OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [software/] [app/] [interrupt_test.c] - Blame information for rev 13

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
#include <hf-risc.h>
2
 
3
volatile int32_t ccount=0, ccount2=0, cmpcount=0, cmp2count=0, irq0count=0, irq1count=0;
4
 
5
/*
6
ISRs - interrupt service routines
7
*/
8
void counter_handler(void){                                             // 10.48ms @ 25MHz
9
        uint32_t m;
10
 
11
        ccount++;
12
        m = IRQ_MASK;                                                           // read interrupt mask
13
        m ^= (IRQ_COUNTER | IRQ_COUNTER_NOT);                           // toggle timer interrupt mask
14
        IRQ_MASK = m;                                                           // write to irq mask register
15
}
16
 
17
void counter_handler2(void){                                            // 2.62ms @ 25MHz
18
        uint32_t m;
19
 
20
        ccount2++;
21
        m = IRQ_MASK;                                                           // read interrupt mask
22
        m ^= (IRQ_COUNTER2 | IRQ_COUNTER2_NOT);                         // toggle timer interrupt mask
23
        IRQ_MASK = m;                                                           // write to irq mask register
24
}
25
 
26
void compare_handler(void){
27
        uint32_t val;
28
 
29
        cmpcount++;
30
        val = COUNTER;
31
        val += (CPU_SPEED/1000) * 5;            // 5 ms @ 25MHz
32
        COMPARE = val;                                          // update compare reg, clear irq
33
}
34
 
35
void compare2_handler(void){
36
        uint32_t val;
37
 
38
        cmp2count++;
39
        val = COUNTER;
40
        val += (CPU_SPEED/1000) * 1;            // 1 ms @ 25MHz
41
        COMPARE2 = val;                                         // update compare2 reg, clear irq
42
}
43
 
44
void irq0_handler(void){
45
        irq0count++;
46
}
47
 
48
void irq1_handler(void){
49
        irq1count++;
50
}
51
 
52
int main(void){
53
        // register ISRs
54
        interrupt_register(IRQ_COUNTER, counter_handler);
55
        interrupt_register(IRQ_COUNTER_NOT, counter_handler);
56
        interrupt_register(IRQ_COUNTER2, counter_handler2);
57
        interrupt_register(IRQ_COUNTER2_NOT, counter_handler2);
58
        interrupt_register(IRQ_COMPARE, compare_handler);
59
        interrupt_register(IRQ_COMPARE2, compare2_handler);
60
        interrupt_register(EXT_IRQ0, irq0_handler);
61
        interrupt_register(EXT_IRQ1, irq1_handler);
62
 
63
        // initialize compare registers, clear compare irqs
64
        COMPARE = COUNTER + (CPU_SPEED/1000) * 5;
65
        COMPARE2 = COUNTER + (CPU_SPEED/1000) * 1;
66
 
67
        // set interrupt mask (unmask peripheral interrupts)
68
        IRQ_MASK = (IRQ_COUNTER | IRQ_COUNTER2 | IRQ_COMPARE | IRQ_COMPARE2 | EXT_IRQ0 | EXT_IRQ1);
69
 
70
        // global interrupts enable
71
        IRQ_STATUS = 1;
72
 
73
        ccount=0; ccount2=0; cmpcount=0; cmp2count=0; irq0count=0; irq1count=0;
74
 
75
        for(;;){
76
                printf("\ninterrupts -> counter18: %d counter16: %d compare: %d compare2: %d ext_irq0: %d ext_irq1: %d", ccount, ccount2, cmpcount, cmp2count, irq0count, irq1count);
77
        }
78
}
79
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.