-
Notifications
You must be signed in to change notification settings - Fork 1
/
Timer.cpp
105 lines (92 loc) · 3.06 KB
/
Timer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "Timer.hpp"
enum {
T2CON = 0xBF800800, TMRX_SPACING = 0x80, //spacing in words
ON = 15,
SIDL = 13,
TGATE = 7,
TCKPS_SHIFT = 4, TCKPS_MASK = 7,
T32 = 3,
TCS = 1
};
//Timer
//=============================================================================
Timer::
Timer (TMRX e)
:
m_txcon( (vu32ptr)T2CON + (e * TMRX_SPACING) ),
m_tmrx( *((vu32ptr)T2CON + (e * TMRX_SPACING) + 4) ),
m_prx( *((vu32ptr)T2CON + (e * TMRX_SPACING) + 8) )
{
}
//=============================================================================
auto Timer::
count (uint32_t n) -> void
{
m_tmrx = n;
}
//=============================================================================
auto Timer::
count () -> uint32_t
{
return m_tmrx;
}
//=============================================================================
auto Timer::
period (uint32_t n) -> void
{
m_prx = n;
}
//=============================================================================
auto Timer::
period () -> uint32_t
{
return m_prx;
}
//=============================================================================
auto Timer::
on (bool tf) -> void
{
setbit(m_txcon, 1<<ON, tf);
}
//=============================================================================
auto Timer::
stop_idle (bool tf) -> void
{
setbit(m_txcon, 1<<SIDL, tf);
}
//=============================================================================
auto Timer::
gate (bool tf) -> void
{
setbit(m_txcon, 1<<TGATE, tf);
}
//=============================================================================
auto Timer::
prescale (PRESCALE e) -> void
{
clrbit(m_txcon, TCKPS_MASK<<TCKPS_SHIFT);
setbit(m_txcon, e<<TCKPS_SHIFT);
}
//=============================================================================
auto Timer::
prescale () -> PRESCALE
{
return (PRESCALE) ((val(m_txcon) >> TCKPS_SHIFT) bitand TCKPS_MASK);
}
//=============================================================================
auto Timer::
mode32 (bool tf) -> void
{
//T2 controls T32, so only do if this is T2 or T4
if (m_txcon == (vu32ptr)T2CON || m_txcon == (vu32ptr)T2CON + (2 * TMRX_SPACING)){
setbit(m_txcon, 1<<T32, tf);
//set T3 or T5 SIDL off
clrbit(m_txcon + TMRX_SPACING, SIDL);
}
}
//=============================================================================
auto Timer::
clk_src (CLK e) -> void
{
setbit(m_txcon, 1<<TCS, e);
}