50 GPT_OUT_LOW_PULSE = 4u,
53class GPTimer :
private GPT_Type
57 void (*irqCB)(GPTimer *);
60 static ctx_t sCtxs[2];
61 static ctx_t *sGetCtx(GPTimer *timer)
63 switch ((uint32_t)timer) {
64 case GPT1_BASE:
return sCtxs + 0;
65 case GPT2_BASE:
return sCtxs + 1;
73 friend void irq_gpt1();
74 friend void irq_gpt2();
76 static inline GPTimer *GPT(GPT_Type *gpt);
78 void Init(uint32_t div,
bool freeRun,
bool restartFromZero, GPT_Clk clk = GPT_CLK_PERIPH);
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();
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);
105 inline void SetIRQFn(
void (*fn)(GPTimer *) );
106 inline uint32_t GetIRQCount();
109inline GPTimer *GPTimer::
112 return (GPTimer*)(gpt);
118 CR |= GPT_CR_SWR_MASK;
while((CR & GPT_CR_SWR_MASK));
122SetClkSrc(GPT_Clk clk)
124 CR = (CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK))
126 | ((clk == GPT_CLK_XO) ? GPT_CR_EN_24M_MASK : 0);
129inline GPT_Clk GPTimer::
132 return (GPT_Clk)((CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT);
136SetClkDiv(uint32_t div)
138 PR = (PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(div - 1U);
141inline uint32_t GPTimer::
144 return ((PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U;
148SetOscClkDiv(uint32_t divider)
150 PR = (PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U);
153inline uint32_t GPTimer::
156 return ((PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U;
162 CR |= GPT_CR_EN_MASK;
168 CR &= ~GPT_CR_EN_MASK;
171inline uint32_t GPTimer::
178SetCapEdge(GPT_CapCh ch, GPT_CapEdge edge)
180 CR = (CR & ~(GPT_CR_IM1_MASK << ((uint32_t)ch * 2UL)))
181 | (GPT_CR_IM1(edge) << ((uint32_t)ch * 2UL));
184inline GPT_CapEdge GPTimer::
185GetCapEdge(GPT_CapCh ch)
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));
192inline uint32_t GPTimer::
193GetCapVal(GPT_CapCh ch)
199SetOutMode(GPT_CompCh ch, GPT_OutMode mode)
201 CR = (CR & ~(GPT_CR_OM1_MASK << ((uint32_t)ch * 3UL)))
202 | (GPT_CR_OM1(mode) << ((uint32_t)ch * 3UL));
205inline GPT_OutMode GPTimer::
206GetOutMode(GPT_CompCh ch)
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));
214SetCompVal(GPT_CompCh ch, uint32_t val)
219inline uint32_t GPTimer::
220GetCompVal(GPT_CompCh ch)
226ForceOutput(GPT_CompCh ch)
228 CR |= (GPT_CR_FO1_MASK << (uint32_t)ch);
232EnableIRQ(uint32_t mask)
238DisableIRQ(uint32_t mask)
243inline uint32_t GPTimer::
249inline uint32_t GPTimer::
250GetStatus(uint32_t flags)
256ClrIRQ(uint32_t flags)
263SetIRQFn(
void (*fn)(GPTimer *) )
265 GPTimer::ctx_t *ctx = sGetCtx(
this);
266 if (ctx) { ctx->irqCB = fn; }
269inline uint32_t GPTimer::
272 GPTimer::ctx_t *ctx = sGetCtx(
this);
273 if (ctx) {
return ctx->irqCount; }