76 GPT_OUT_LOW_PULSE = 4u,
79class GPTimer :
private GPT_Type
83 void (*irqCB)(GPTimer *);
86 static ctx_t sCtxs[2];
87 static ctx_t *sGetCtx(GPTimer *timer)
89 switch ((uint32_t)timer) {
90 case GPT1_BASE:
return sCtxs + 0;
91 case GPT2_BASE:
return sCtxs + 1;
99 friend void irq_gpt1();
100 friend void irq_gpt2();
102 static inline GPTimer *GPT(GPT_Type *gpt);
104 void Init(uint32_t div,
bool freeRun,
bool restartFromZero, GPT_Clk clk = GPT_CLK_PERIPH);
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();
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);
131 inline void SetIRQFn(
void (*fn)(GPTimer *) );
132 inline uint32_t GetIRQCount();
135inline GPTimer *GPTimer::
138 return (GPTimer*)(gpt);
144 CR |= GPT_CR_SWR_MASK;
while((CR & GPT_CR_SWR_MASK));
148SetClkSrc(GPT_Clk clk)
150 CR = (CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK))
152 | ((clk == GPT_CLK_XO) ? GPT_CR_EN_24M_MASK : 0);
155inline GPT_Clk GPTimer::
158 return (GPT_Clk)((CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT);
162SetClkDiv(uint32_t div)
164 PR = (PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(div - 1U);
167inline uint32_t GPTimer::
170 return ((PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U;
174SetOscClkDiv(uint32_t divider)
176 PR = (PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U);
179inline uint32_t GPTimer::
182 return ((PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U;
188 CR |= GPT_CR_EN_MASK;
194 CR &= ~GPT_CR_EN_MASK;
197inline uint32_t GPTimer::
204SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge)
206 CR = (CR & ~(GPT_CR_IM1_MASK << ((uint32_t)ch * 2UL)))
207 | (GPT_CR_IM1(edge) << ((uint32_t)ch * 2UL));
210inline GPT_CapEdge GPTimer::
211GetCapEdge(GPT_CapCh ch)
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));
218inline uint32_t GPTimer::
219GetCapVal(GPT_CapCh ch)
225SetOutMode(GPT_CompCh ch, GPT_OutMode mode)
227 CR = (CR & ~(GPT_CR_OM1_MASK << ((uint32_t)ch * 3UL)))
228 | (GPT_CR_OM1(mode) << ((uint32_t)ch * 3UL));
231inline GPT_OutMode GPTimer::
232GetOutMode(GPT_CompCh ch)
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));
240SetCompVal(GPT_CompCh ch, uint32_t val)
245inline uint32_t GPTimer::
246GetCompVal(GPT_CompCh ch)
252ForceOutput(GPT_CompCh ch)
254 CR |= (GPT_CR_FO1_MASK << (uint32_t)ch);
258EnableIRQ(uint32_t mask)
264DisableIRQ(uint32_t mask)
269inline uint32_t GPTimer::
275inline uint32_t GPTimer::
276GetStatus(uint32_t flags)
282ClrIRQ(uint32_t flags)
288SetIRQFn(
void (*fn)(GPTimer *) )
290 GPTimer::ctx_t *ctx = sGetCtx(
this);
291 if (ctx) { ctx->irqCB = fn; }
294inline uint32_t GPTimer::
297 GPTimer::ctx_t *ctx = sGetCtx(
this);
298 if (ctx) {
return ctx->irqCount; }