NetBurner 3.5.6
PDF Version
gpt.h
1/*NB_REVISION*/
2
3/*NB_COPYRIGHT*/
4
5#ifndef __GPT_H
6#define __GPT_H
7
8#include <predef.h>
9#include <stdint.h>
10#include <stddef.h>
11#include <sim.h>
12
13enum GPT_Clk
14{
15 GPT_CLK_OFF = 0u,
16 GPT_CLK_PERIPH = 1u,
17 GPT_CLK_HF_REF = 2u,
18 GPT_CLK_EXT = 3u,
19 GPT_CLK_LF_REF = 4u,
20 GPT_CLK_XO = 5u,
21};
22
23enum GPT_CapCh
24{
25 GPT_CAP_CH1 = 0u,
26 GPT_CAP_CH2 = 1u
27};
28
29enum GPT_CapEdge
30{
31 GPT_CAP_NONE = 0u,
32 GPT_CAP_RISING = 1u,
33 GPT_CAP_FALLING = 2u,
34 GPT_CAP_BOTH = 3u,
35};
36
37enum GPT_CompCh
38{
39 GPT_COMP_CH1 = 0u,
40 GPT_COMP_CH2 = 1u,
41 GPT_COMP_CH3 = 2u,
42};
43
44enum GPT_OutMode
45{
46 GPT_OUT_NONE = 0u,
47 GPT_OUT_TGL = 1u,
48 GPT_OUT_CLR = 2u,
49 GPT_OUT_SET = 3u,
50 GPT_OUT_LOW_PULSE = 4u,
51};
52
53class GPTimer : private GPT_Type
54{
55 struct ctx_t
56 {
57 void (*irqCB)(GPTimer *);
58 uint32_t irqCount;
59 };
60 static ctx_t sCtxs[2];
61 static ctx_t *sGetCtx(GPTimer *timer)
62 {
63 switch ((uint32_t)timer) {
64 case GPT1_BASE: return sCtxs + 0;
65 case GPT2_BASE: return sCtxs + 1;
66 }
67 return NULL;
68 }
69
70 GPTimer();
71 void isr();
72
73 friend void irq_gpt1();
74 friend void irq_gpt2();
75public:
76 static inline GPTimer *GPT(GPT_Type *gpt);
77
78 void Init(uint32_t div, bool freeRun, bool restartFromZero, GPT_Clk clk = GPT_CLK_PERIPH);
79
80 inline void Reset();
81 void ResetCount();
82 inline void SetClkSrc(GPT_Clk clk);
83 inline GPT_Clk GetClkSrc();
84 inline void SetClkDiv(uint32_t div);
85 inline uint32_t GetClkDiv();
86 inline void SetOscClkDiv(uint32_t divider);
87 inline uint32_t GetOscClkDiv();
88 inline void Start();
89 inline void Stop();
90 inline uint32_t GetCurCount();
91 inline void SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge);
92 inline GPT_CapEdge GetCapEdge(GPT_CapCh ch);
93 inline uint32_t GetCapVal(GPT_CapCh ch);
94 inline void SetOutMode(GPT_CompCh ch, GPT_OutMode mode);
95 inline GPT_OutMode GetOutMode(GPT_CompCh ch);
96 inline void SetCompVal(GPT_CompCh ch, uint32_t val);
97 inline uint32_t GetCompVal(GPT_CompCh ch);
98 inline void ForceOutput(GPT_CompCh ch);
99 inline void EnableIRQ(uint32_t mask);
100 inline void DisableIRQ(uint32_t mask);
101 inline uint32_t GetEnabledIRQ();
102 inline uint32_t GetStatus(uint32_t flags = 0xFFFFFFFF);
103 inline void ClrIRQ(uint32_t flags);
104
105 inline void SetIRQFn( void (*fn)(GPTimer *) );
106 inline uint32_t GetIRQCount();
107};
108
109inline GPTimer *GPTimer::
110GPT(GPT_Type *gpt)
111{
112 return (GPTimer*)(gpt);
113}
114
115inline void GPTimer::
116Reset()
117{
118 CR |= GPT_CR_SWR_MASK; while((CR & GPT_CR_SWR_MASK));
119}
120
121inline void GPTimer::
122SetClkSrc(GPT_Clk clk)
123{
124 CR = (CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK))
125 | GPT_CR_CLKSRC(clk)
126 | ((clk == GPT_CLK_XO) ? GPT_CR_EN_24M_MASK : 0);
127}
128
129inline GPT_Clk GPTimer::
130GetClkSrc()
131{
132 return (GPT_Clk)((CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT);
133}
134
135inline void GPTimer::
136SetClkDiv(uint32_t div)
137{
138 PR = (PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(div - 1U);
139}
140
141inline uint32_t GPTimer::
142GetClkDiv()
143{
144 return ((PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U;
145}
146
147inline void GPTimer::
148SetOscClkDiv(uint32_t divider)
149{
150 PR = (PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U);
151}
152
153inline uint32_t GPTimer::
154GetOscClkDiv()
155{
156 return ((PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U;
157}
158
159inline void GPTimer::
160Start()
161{
162 CR |= GPT_CR_EN_MASK;
163}
164
165inline void GPTimer::
166Stop()
167{
168 CR &= ~GPT_CR_EN_MASK;
169}
170
171inline uint32_t GPTimer::
172GetCurCount()
173{
174 return CNT;
175}
176
177inline void GPTimer::
178SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge)
179{
180 CR = (CR & ~(GPT_CR_IM1_MASK << ((uint32_t)ch * 2UL)))
181 | (GPT_CR_IM1(edge) << ((uint32_t)ch * 2UL));
182}
183
184inline GPT_CapEdge GPTimer::
185GetCapEdge(GPT_CapCh ch)
186{
187 return (GPT_CapEdge)(uint8_t)
188 ((CR >> (GPT_CR_IM1_SHIFT + (uint32_t)ch * 2UL))
189 & (GPT_CR_IM1_MASK >> GPT_CR_IM1_SHIFT));
190}
191
192inline uint32_t GPTimer::
193GetCapVal(GPT_CapCh ch)
194{
195 return ICR[ch];
196}
197
198inline void GPTimer::
199SetOutMode(GPT_CompCh ch, GPT_OutMode mode)
200{
201 CR = (CR & ~(GPT_CR_OM1_MASK << ((uint32_t)ch * 3UL)))
202 | (GPT_CR_OM1(mode) << ((uint32_t)ch * 3UL));
203}
204
205inline GPT_OutMode GPTimer::
206GetOutMode(GPT_CompCh ch)
207{
208 return (GPT_OutMode)(uint8_t)
209 ((CR >> (GPT_CR_OM1_SHIFT + (uint32_t)ch * 3UL))
210 & (GPT_CR_OM1_MASK >> GPT_CR_OM1_SHIFT));
211}
212
213inline void GPTimer::
214SetCompVal(GPT_CompCh ch, uint32_t val)
215{
216 OCR[ch] = val;
217}
218
219inline uint32_t GPTimer::
220GetCompVal(GPT_CompCh ch)
221{
222 return OCR[ch];
223}
224
225inline void GPTimer::
226ForceOutput(GPT_CompCh ch)
227{
228 CR |= (GPT_CR_FO1_MASK << (uint32_t)ch);
229}
230
231inline void GPTimer::
232EnableIRQ(uint32_t mask)
233{
234 IR |= mask;
235}
236
237inline void GPTimer::
238DisableIRQ(uint32_t mask)
239{
240 IR &= ~mask;
241}
242
243inline uint32_t GPTimer::
244GetEnabledIRQ()
245{
246 return IR;
247}
248
249inline uint32_t GPTimer::
250GetStatus(uint32_t flags)
251{
252 return SR & flags;
253}
254
255inline void GPTimer::
256ClrIRQ(uint32_t flags)
257{
258 SR = flags;
259 asm("dsb");
260}
261
262inline void GPTimer::
263SetIRQFn( void (*fn)(GPTimer *) )
264{
265 GPTimer::ctx_t *ctx = sGetCtx(this);
266 if (ctx) { ctx->irqCB = fn; }
267}
268
269inline uint32_t GPTimer::
270GetIRQCount()
271{
272 GPTimer::ctx_t *ctx = sGetCtx(this);
273 if (ctx) { return ctx->irqCount; }
274 return 0;
275}
276
277
278
279#endif /* ----- #ifndef __GPT_H ----- */