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 21

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
#include <hf-risc.h>
2
 
3 21 serginhofr
volatile int32_t ccount=0, ccount2=0, cmpcount=0, cmp2count=0;
4 13 serginhofr
 
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
int main(void){
45
        // register ISRs
46
        interrupt_register(IRQ_COUNTER, counter_handler);
47
        interrupt_register(IRQ_COUNTER_NOT, counter_handler);
48
        interrupt_register(IRQ_COUNTER2, counter_handler2);
49
        interrupt_register(IRQ_COUNTER2_NOT, counter_handler2);
50
        interrupt_register(IRQ_COMPARE, compare_handler);
51
        interrupt_register(IRQ_COMPARE2, compare2_handler);
52
 
53
        // initialize compare registers, clear compare irqs
54
        COMPARE = COUNTER + (CPU_SPEED/1000) * 5;
55
        COMPARE2 = COUNTER + (CPU_SPEED/1000) * 1;
56
 
57
        // set interrupt mask (unmask peripheral interrupts)
58 21 serginhofr
        IRQ_MASK = (IRQ_COUNTER | IRQ_COUNTER2 | IRQ_COMPARE | IRQ_COMPARE2);
59 13 serginhofr
 
60
        // global interrupts enable
61
        IRQ_STATUS = 1;
62
 
63 21 serginhofr
        ccount=0; ccount2=0; cmpcount=0; cmp2count=0;
64 13 serginhofr
 
65
        for(;;){
66 21 serginhofr
                printf("\ninterrupts -> counter18: %d counter16: %d compare: %d compare2: %d", ccount, ccount2, cmpcount, cmp2count);
67 13 serginhofr
        }
68
}
69
 

powered by: WebSVN 2.1.0

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