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