4 #include <system_def.h>
6 static volatile timer_t timer;
8 static void timer_isr(void) __attribute__ ((interrupt_handler));
14 //*TPU_TSR3 &= ~TSR2_TCFVm ; //reset overflow flag (clear interrupt)
15 *TPU_TSR3 &= ~TSR3_TCFVm & ~TSR3_TGFAm; //reset overflow and comare match flags
18 //timer initialisation
19 /*free running counter*/
20 int init_timer3(long long nsec)
22 #define CPU_CYCLE_NSEC (1000000000/CPU_SYS_HZ)
23 long long timer_tick = CPU_CYCLE_NSEC;
25 const signed char presc_tab[] = {0,1,2,3,6,5,7,-1};
26 long long nsec_scaled = nsec >> 16;
27 while (presc_ind < 8 &&
28 (timer_tick < nsec_scaled
29 || presc_tab[presc_ind] < 0)) {
33 if (timer_tick < nsec_scaled)
37 *SYS_MSTPCRA &= ~MSTPCRA_TPUm; // power TPU unit
39 *TPU_TCR3 = TCR3_CCLR0m | presc_tab[presc_ind]; //rising edge, cleared by TGA, prescaler is calculated
40 *TPU_TMDR3 =0x00; // normal mode
41 *TPU_TIOR3L = TIOR3L_IOC1m; // output 1 at compare match
42 *TPU_TSR3 &= ~TSR3_TCFVm & ~TSR3_TGFAm; //reset overflow and comare match flags
43 //*TPU_TIER3 |=TIER3_TCIEVm; //enable overflow interrupt
44 *TPU_TIER3 |=TIER3_TGIEAm; //enable compare match interrupt
45 *TPU_TGR3A = (unsigned)(nsec/timer_tick);
47 *TPU_TSTR |=TSTR_CST3m; //start timer
49 //excptvec_set(EXCPTVEC_TCI3V, timer_isr); /* handle overflow interrupt */
50 excptvec_set(EXCPTVEC_TGI3A, timer_isr); /* handle TGRA match interrupt */