49 QTMR_PRI_IN_CNTR0 = 0u,
50 QTMR_PRI_IN_CNTR1 = 1u,
51 QTMR_PRI_IN_CNTR2 = 2u,
52 QTMR_PRI_IN_CNTR3 = 3u,
53 QTMR_PRI_OUT_CNTR0 = 4u,
54 QTMR_PRI_OUT_CNTR1 = 5u,
55 QTMR_PRI_OUT_CNTR2 = 6u,
56 QTMR_PRI_OUT_CNTR3 = 7u,
57 QTMR_PRI_CLK_DIV_1 = 8u,
58 QTMR_PRI_CLK_DIV_2 = 9u,
59 QTMR_PRI_CLK_DIV_4 = 10u,
60 QTMR_PRI_CLK_DIV_8 = 11u,
61 QTMR_PRI_CLK_DIV_16 = 12u,
62 QTMR_PRI_CLK_DIV_32 = 13u,
63 QTMR_PRI_CLK_DIV_64 = 14u,
64 QTMR_PRI_CLK_DIV_128= 15u,
79 QTMR_FORCE_OUT_ZERO = 2u,
80 QTMR_DBG_HALT_FORCE_OUT_ZERO= 3u,
94 QTMR_COUNT_PRIM_RISING = 1u,
95 QTMR_COUNT_PRIM_BOTH = 2u,
96 QTMR_COUNT_PRIM_RISING_IN_HIGH = 3u,
97 QTMR_COUNT_QUADRATURE = 4u,
98 QTMR_COUNT_PRIM_RISING_IN_DIR = 5u,
99 QTMR_COUNT_IN_EDGE = 6u,
100 QTMR_COUNT_CASCADE = 7u,
105 QTMR_PRELOAD_NEVER = 0u,
106 QTMR_PRELOAD_COMP1 = 1u,
107 QTMR_PRELOAD_COMP2 = 2u,
112 QTMR_OUT_WHEN_ACTIVE = 0u,
113 QTMR_OUT_CMP_CLR = 1u,
114 QTMR_OUT_CMP_SET = 2u,
115 QTMR_OUT_CMP_TGL = 3u,
116 QTMR_OUT_CMP_TGL_ALT = 4u,
117 QTMR_OUT_CMP_SET_IN_CLR = 5u,
118 QTMR_OUT_CMP_SET_ROLL_CLR = 6u,
119 QTMR_OUT_GATE_CLK = 7u,
124 QTMR_IRQ_CMP = (TMR_SCTRL_TCFIE_MASK << 16),
125 QTMR_IRQ_OVERFLOW = (TMR_SCTRL_TOFIE_MASK << 16),
126 QTMR_IRQ_IN_EDGE = (TMR_SCTRL_IEFIE_MASK << 16),
127 QTMR_IRQ_CMP1 = (TMR_CSCTRL_TCF1EN_MASK),
128 QTMR_IRQ_CMP2 = (TMR_CSCTRL_TCF2EN_MASK),
133 QTMR_STAT_CMP = (TMR_SCTRL_TCF_MASK << 16),
134 QTMR_STAT_OVERFLOW = (TMR_SCTRL_TOF_MASK << 16),
135 QTMR_STAT_IN_EDGE = (TMR_SCTRL_IEF_MASK << 16),
136 QTMR_STAT_CMP1 = (TMR_CSCTRL_TCF1_MASK),
137 QTMR_STAT_CMP2 = (TMR_CSCTRL_TCF2_MASK),
142 QTMR_DMA_IN_EDGE = (TMR_DMA_IEFDE_MASK),
143 QTMR_DMA_PLD_CMP1 = (TMR_DMA_CMPLD1DE_MASK),
144 QTMR_DMA_PLD_CMP2 = (TMR_DMA_CMPLD2DE_MASK),
148struct QTimer_Channel;
150typedef void (*QTimer_CB)(QTimer *);
151typedef void (*QTimer_Channel_CB)(QTimer *, QTMR_Channel);
153struct QTimer_Channel : TMR_Channel_Type
158 QTimer_Channel_CB irqCB;
162 static ctx_t *sGetCtx(QTimer_Channel *ch);
166 void isr(QTimer * tmr, QTMR_Channel chNum);
167 friend struct QTimer;
169 void Init(QTMR_Primary priSrc, QTMR_Input secSrc,
170 bool masterMode,
bool enExtForce,
171 uint8_t faultFiltCount, uint8_t faultFiltPer,
172 QTMR_DbgMode dbgMode);
173 bool SetupPwm(uint32_t pwmFreq, uint8_t dutyPcnt,
174 bool invertPolarity, uint32_t srcFreq);
175 void SetupCapture(QTMR_Input pin,
176 bool invertPolarity,
bool reloadOnCapture,
178 void SetupCascade(uint16_t countVal);
180 inline void ConfigOutput(
bool enabled,
bool invertPolarity, QTMR_OutMode mode);
181 inline void ForceOutput(
bool val);
182 void EnableIRQs(uint32_t mask);
183 void DisableIRQs(uint32_t mask);
184 uint32_t GetEnabledIRQs();
185 uint32_t GetStatus();
186 void ClearStatus(uint32_t mask);
187 void SetPeriod(uint16_t period);
188 inline uint16_t GetCurCount();
189 inline void Start(QTMR_CountMode mode);
190 inline QTMR_CountMode Stop();
191 inline QTMR_CountMode GetCurMode();
192 void EnableDMA(uint32_t mask);
193 void DisableDMA(uint32_t mask);
199 QTimer_Channel_CB SetIRQFn(QTimer_Channel_CB fn);
202struct QTimer : TMR_Type
209 QTimer_Channel::ctx_t ch[4];
212 static ctx_t sCtxs[4];
213 static ctx_t *sGetCtx(QTimer *timer)
215 switch ((uint32_t)timer) {
216 case TMR1_BASE:
return sCtxs + 0;
217 case TMR2_BASE:
return sCtxs + 1;
218 case TMR3_BASE:
return sCtxs + 2;
219 case TMR4_BASE:
return sCtxs + 3;
227 friend QTimer_Channel::ctx_t * QTimer_Channel::sGetCtx(QTimer_Channel *ch);
228 friend QTimer_Channel_CB QTimer_Channel::SetIRQFn(QTimer_Channel_CB fn);
230 friend void isr_qtimer0();
231 friend void isr_qtimer1();
232 friend void isr_qtimer2();
233 friend void isr_qtimer3();
235 inline QTimer_Channel &operator[](
int i);
237 static inline QTimer *TMR(TMR_Type *tmr);
239 inline void Init(QTMR_Channel chNum, QTMR_Primary priSrc, QTMR_Input secSrc,
240 bool masterMode,
bool enExtForce, uint8_t faultFiltCount,
241 uint8_t faultFiltPer, QTMR_DbgMode dbgMode);
242 inline bool SetupPwm(QTMR_Channel chNum, uint32_t pwmFreq, uint8_t dutyPcnt,
243 bool invertPolarity, uint32_t srcFreq);
244 inline void SetupCapture(QTMR_Channel chNum, QTMR_Input pin,
245 bool invertPolarity,
bool reloadOnCapture,
247 inline void ConfigOutput(QTMR_Channel chNum,
bool enabled,
bool invertPolarity, QTMR_OutMode mode);
248 inline void ForceOutput(QTMR_Channel chNum,
bool val);
249 inline void EnableIRQs(QTMR_Channel chNum, uint32_t mask);
250 inline void DisableIRQs(QTMR_Channel chNum, uint32_t mask);
251 inline uint32_t GetEnabledIRQs(QTMR_Channel chNum);
252 inline uint32_t GetStatus(QTMR_Channel chNum);
253 inline void ClearStatus(QTMR_Channel chNum, uint32_t mask);
254 inline void SetPeriod(QTMR_Channel chNum, uint16_t period);
255 inline uint16_t GetCurCount(QTMR_Channel chNum);
256 inline void Start(QTMR_Channel chNum, QTMR_CountMode mode);
257 inline QTMR_CountMode Stop(QTMR_Channel chNum);
258 inline QTMR_CountMode GetCurMode(QTMR_Channel chNum);
259 inline void EnableDMA(QTMR_Channel chNum, uint32_t mask);
260 inline void DisableDMA(QTMR_Channel chNum, uint32_t mask);
261 inline void EnableChannels(uint16_t mask);
262 inline void DisableChannels(uint16_t mask);
264 QTimer_CB SetIRQFn(QTimer_CB fn);
265 QTimer_Channel_CB SetChIRQFn(QTMR_Channel chNum, QTimer_Channel_CB fn);
269Init(QTMR_Channel chNum, QTMR_Primary priSrc, QTMR_Input secSrc,
270 bool masterMode,
bool enExtForce, uint8_t faultFiltCount,
271 uint8_t faultFiltPer, QTMR_DbgMode dbgMode)
273 ((QTimer_Channel *)(CHANNEL+chNum))
274 ->Init(priSrc, secSrc, masterMode, enExtForce, faultFiltCount,
275 faultFiltPer, dbgMode);
279SetupPwm(QTMR_Channel chNum, uint32_t pwmFreq, uint8_t dutyPcnt,
280 bool invertPolarity, uint32_t srcFreq)
282 return ((QTimer_Channel *)(CHANNEL+chNum))
283 ->SetupPwm(pwmFreq, dutyPcnt, invertPolarity, srcFreq);
288SetupCapture(QTMR_Channel chNum, QTMR_Input pin,
bool invertPolarity,
289 bool reloadOnCapture, QTMR_CapEdge edge)
291 ((QTimer_Channel *)(CHANNEL+chNum))
292 ->SetupCapture(pin, invertPolarity, reloadOnCapture, edge);
296ConfigOutput(QTMR_Channel chNum,
bool enabled,
bool invertPolarity, QTMR_OutMode mode)
298 ((QTimer_Channel *)(CHANNEL+chNum))->ConfigOutput(enabled,invertPolarity,mode);
302ForceOutput(QTMR_Channel chNum,
bool val)
304 ((QTimer_Channel *)(CHANNEL+chNum))->ForceOutput(val);
308EnableIRQs(QTMR_Channel chNum, uint32_t mask)
310 ((QTimer_Channel *)(CHANNEL+chNum))
315DisableIRQs(QTMR_Channel chNum, uint32_t mask)
317 ((QTimer_Channel *)(CHANNEL+chNum))
321inline uint32_t QTimer::
322GetEnabledIRQs(QTMR_Channel chNum)
324 return ((QTimer_Channel *)(CHANNEL+chNum))
328inline uint32_t QTimer::
329GetStatus(QTMR_Channel chNum)
331 return ((QTimer_Channel *)(CHANNEL+chNum))
336ClearStatus(QTMR_Channel chNum, uint32_t mask)
338 ((QTimer_Channel *)(CHANNEL+chNum))
343SetPeriod(QTMR_Channel chNum, uint16_t period)
345 ((QTimer_Channel *)(CHANNEL+chNum))
350EnableDMA(QTMR_Channel chNum, uint32_t mask)
352 ((QTimer_Channel *)(CHANNEL+chNum))
357DisableDMA(QTMR_Channel chNum, uint32_t mask)
359 ((QTimer_Channel *)(CHANNEL+chNum))
363inline QTimer_Channel & QTimer::
365{
return *(QTimer_Channel *)(CHANNEL+i); }
367inline QTimer *QTimer::
369{
return (QTimer *)tmr; }
371inline uint16_t QTimer::
372GetCurCount(QTMR_Channel chNum)
373{
return CHANNEL[chNum].CNTR; }
376Start(QTMR_Channel chNum, QTMR_CountMode mode)
378 CHANNEL[chNum].CTRL =
379 (CHANNEL[chNum].CTRL & (uint16_t)(~(TMR_CTRL_CM_MASK)))
383inline QTMR_CountMode QTimer::
384Stop(QTMR_Channel chNum)
386 uint8_t mode = (CHANNEL[chNum].CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
387 CHANNEL[chNum].CTRL &= (uint16_t)(~(TMR_CTRL_CM_MASK));
388 return (QTMR_CountMode)mode;
391inline QTMR_CountMode QTimer::
392GetCurMode(QTMR_Channel chNum)
394 uint8_t mode = (CHANNEL[chNum].CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
395 return (QTMR_CountMode)mode;
399EnableChannels(uint16_t mask)
401 CHANNEL[0].ENBL |= mask;
407DisableChannels(uint16_t mask)
409 CHANNEL[0].ENBL &= ~mask;
412inline uint16_t QTimer_Channel::
416inline void QTimer_Channel::
417Start(QTMR_CountMode mode)
419 CTRL = (CTRL & (uint16_t)(~(TMR_CTRL_CM_MASK))) | TMR_CTRL_CM(mode);
422inline QTMR_CountMode QTimer_Channel::
425 uint8_t mode = (CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
426 CTRL &= (uint16_t)(~(TMR_CTRL_CM_MASK));
427 return (QTMR_CountMode)mode;
430inline QTMR_CountMode QTimer_Channel::
433 uint8_t mode = (CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
434 return (QTMR_CountMode)mode;
437inline void QTimer_Channel::
438ConfigOutput(
bool enabled,
bool invertPolarity, QTMR_OutMode mode)
440 SCTRL = (SCTRL & ~(TMR_SCTRL_OPS_MASK | TMR_SCTRL_OEN_MASK))
441 | TMR_SCTRL_OPS(invertPolarity) | TMR_SCTRL_OEN(enabled);
442 CTRL = (CTRL & ~(TMR_CTRL_OUTMODE_MASK))
443 | TMR_CTRL_OUTMODE(mode);
446inline void QTimer_Channel::
449 SCTRL = (SCTRL & ~(TMR_SCTRL_VAL_MASK))
450 | TMR_SCTRL_VAL(val) | TMR_SCTRL_FORCE(1);