50 GPT_OUT_LOW_PULSE = 4u,
54const uint32_t GPT_STATUS_ROV=(32);
55const uint32_t GPT_STATUS_IF2=(16);
56const uint32_t GPT_STATUS_IF1=(8);
57const uint32_t GPT_STATUS_OF3=(4);
58const uint32_t GPT_STATUS_OF2=(2);
59const uint32_t GPT_STATUS_OF1=(1);
62class GPTimer :
private GPT_Type
66 void (*irqCB)(GPTimer *);
69 static ctx_t sCtxs[2];
70 static ctx_t *sGetCtx(GPTimer *timer)
72 switch ((uint32_t)timer) {
73 case GPT1_BASE:
return sCtxs + 0;
74 case GPT2_BASE:
return sCtxs + 1;
82 friend void irq_gpt1();
83 friend void irq_gpt2();
85 static inline GPTimer *GPT(GPT_Type *gpt);
87 void Init(uint32_t div,
bool freeRun,
bool restartFromZero, GPT_Clk clk = GPT_CLK_PERIPH);
91 inline void SetClkSrc(GPT_Clk clk);
92 inline GPT_Clk GetClkSrc();
93 inline void SetClkDiv(uint32_t div);
94 inline uint32_t GetClkDiv();
95 inline void SetOscClkDiv(uint32_t divider);
96 inline uint32_t GetOscClkDiv();
99 inline uint32_t GetCurCount();
100 inline void SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge);
101 inline GPT_CapEdge GetCapEdge(GPT_CapCh ch);
102 inline uint32_t GetCapVal(GPT_CapCh ch);
103 inline void SetOutMode(GPT_CompCh ch, GPT_OutMode mode);
104 inline GPT_OutMode GetOutMode(GPT_CompCh ch);
105 inline void SetCompVal(GPT_CompCh ch, uint32_t val);
106 inline uint32_t GetCompVal(GPT_CompCh ch);
107 inline void ForceOutput(GPT_CompCh ch);
108 inline void EnableIRQ(uint32_t mask);
109 inline void DisableIRQ(uint32_t mask);
110 inline uint32_t GetEnabledIRQ();
111 inline uint32_t GetStatus(uint32_t flags = 0xFFFFFFFF);
112 inline void ClrIRQ(uint32_t flags);
114 inline void SetIRQFn(
void (*fn)(GPTimer *) );
115 inline uint32_t GetIRQCount();
118inline GPTimer *GPTimer::GPT(GPT_Type *gpt)
120 return (GPTimer*)(gpt);
126 CR |= GPT_CR_SWR_MASK;
while((CR & GPT_CR_SWR_MASK));
130SetClkSrc(GPT_Clk clk)
132 CR = (CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK))
134 | ((clk == GPT_CLK_XO) ? GPT_CR_EN_24M_MASK : 0);
137inline GPT_Clk GPTimer::
140 return (GPT_Clk)((CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT);
144SetClkDiv(uint32_t div)
146 PR = (PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(div - 1U);
149inline uint32_t GPTimer::
152 return ((PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U;
156SetOscClkDiv(uint32_t divider)
158 PR = (PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U);
161inline uint32_t GPTimer::
164 return ((PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U;
170 CR |= GPT_CR_EN_MASK;
176 CR &= ~GPT_CR_EN_MASK;
179inline uint32_t GPTimer::
186SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge)
188 CR = (CR & ~(GPT_CR_IM1_MASK << ((uint32_t)ch * 2UL)))
189 | (GPT_CR_IM1(edge) << ((uint32_t)ch * 2UL));
192inline GPT_CapEdge GPTimer::
193GetCapEdge(GPT_CapCh ch)
195 return (GPT_CapEdge)(uint8_t)
196 ((CR >> (GPT_CR_IM1_SHIFT + (uint32_t)ch * 2UL))
197 & (GPT_CR_IM1_MASK >> GPT_CR_IM1_SHIFT));
200inline uint32_t GPTimer::
201GetCapVal(GPT_CapCh ch)
207SetOutMode(GPT_CompCh ch, GPT_OutMode mode)
209 CR = (CR & ~(GPT_CR_OM1_MASK << ((uint32_t)ch * 3UL)))
210 | (GPT_CR_OM1(mode) << ((uint32_t)ch * 3UL));
213inline GPT_OutMode GPTimer::
214GetOutMode(GPT_CompCh ch)
216 return (GPT_OutMode)(uint8_t)
217 ((CR >> (GPT_CR_OM1_SHIFT + (uint32_t)ch * 3UL))
218 & (GPT_CR_OM1_MASK >> GPT_CR_OM1_SHIFT));
222SetCompVal(GPT_CompCh ch, uint32_t val)
227inline uint32_t GPTimer::
228GetCompVal(GPT_CompCh ch)
234ForceOutput(GPT_CompCh ch)
236 CR |= (GPT_CR_FO1_MASK << (uint32_t)ch);
240EnableIRQ(uint32_t mask)
246DisableIRQ(uint32_t mask)
251inline uint32_t GPTimer::
257inline uint32_t GPTimer::
258GetStatus(uint32_t flags)
264ClrIRQ(uint32_t flags)
271SetIRQFn(
void (*fn)(GPTimer *) )
273 GPTimer::ctx_t *ctx = sGetCtx(
this);
274 if (ctx) { ctx->irqCB = fn; }
277inline uint32_t GPTimer::
280 GPTimer::ctx_t *ctx = sGetCtx(
this);
281 if (ctx) {
return ctx->irqCount; }