24 QTMR_PRI_IN_CNTR0 = 0u,
25 QTMR_PRI_IN_CNTR1 = 1u,
26 QTMR_PRI_IN_CNTR2 = 2u,
27 QTMR_PRI_IN_CNTR3 = 3u,
28 QTMR_PRI_OUT_CNTR0 = 4u,
29 QTMR_PRI_OUT_CNTR1 = 5u,
30 QTMR_PRI_OUT_CNTR2 = 6u,
31 QTMR_PRI_OUT_CNTR3 = 7u,
32 QTMR_PRI_CLK_DIV_1 = 8u,
33 QTMR_PRI_CLK_DIV_2 = 9u,
34 QTMR_PRI_CLK_DIV_4 = 10u,
35 QTMR_PRI_CLK_DIV_8 = 11u,
36 QTMR_PRI_CLK_DIV_16 = 12u,
37 QTMR_PRI_CLK_DIV_32 = 13u,
38 QTMR_PRI_CLK_DIV_64 = 14u,
39 QTMR_PRI_CLK_DIV_128= 15u,
54 QTMR_FORCE_OUT_ZERO = 2u,
55 QTMR_DBG_HALT_FORCE_OUT_ZERO= 3u,
69 QTMR_COUNT_PRIM_RISING = 1u,
70 QTMR_COUNT_PRIM_BOTH = 2u,
71 QTMR_COUNT_PRIM_RISING_IN_HIGH = 3u,
72 QTMR_COUNT_QUADRATURE = 4u,
73 QTMR_COUNT_PRIM_RISING_IN_DIR = 5u,
74 QTMR_COUNT_IN_EDGE = 6u,
75 QTMR_COUNT_CASCADE = 7u,
80 QTMR_PRELOAD_NEVER = 0u,
81 QTMR_PRELOAD_COMP1 = 1u,
82 QTMR_PRELOAD_COMP2 = 2u,
87 QTMR_OUT_WHEN_ACTIVE = 0u,
88 QTMR_OUT_CMP_CLR = 1u,
89 QTMR_OUT_CMP_SET = 2u,
90 QTMR_OUT_CMP_TGL = 3u,
91 QTMR_OUT_CMP_TGL_ALT = 4u,
92 QTMR_OUT_CMP_SET_IN_CLR = 5u,
93 QTMR_OUT_CMP_SET_ROLL_CLR = 6u,
94 QTMR_OUT_GATE_CLK = 7u,
99 QTMR_IRQ_CMP = (TMR_SCTRL_TCFIE_MASK << 16),
100 QTMR_IRQ_OVERFLOW = (TMR_SCTRL_TOFIE_MASK << 16),
101 QTMR_IRQ_IN_EDGE = (TMR_SCTRL_IEFIE_MASK << 16),
102 QTMR_IRQ_CMP1 = (TMR_CSCTRL_TCF1EN_MASK),
103 QTMR_IRQ_CMP2 = (TMR_CSCTRL_TCF2EN_MASK),
108 QTMR_STAT_CMP = (TMR_SCTRL_TCF_MASK << 16),
109 QTMR_STAT_OVERFLOW = (TMR_SCTRL_TOF_MASK << 16),
110 QTMR_STAT_IN_EDGE = (TMR_SCTRL_IEF_MASK << 16),
111 QTMR_STAT_CMP1 = (TMR_CSCTRL_TCF1_MASK),
112 QTMR_STAT_CMP2 = (TMR_CSCTRL_TCF2_MASK),
117 QTMR_DMA_IN_EDGE = (TMR_DMA_IEFDE_MASK),
118 QTMR_DMA_PLD_CMP1 = (TMR_DMA_CMPLD1DE_MASK),
119 QTMR_DMA_PLD_CMP2 = (TMR_DMA_CMPLD2DE_MASK),
123struct QTimer_Channel;
125typedef void (*QTimer_CB)(QTimer *);
126typedef void (*QTimer_Channel_CB)(QTimer *, QTMR_Channel);
128struct QTimer_Channel : TMR_Channel_Type
133 QTimer_Channel_CB irqCB;
137 static ctx_t *sGetCtx(QTimer_Channel *ch);
141 void isr(QTimer * tmr, QTMR_Channel chNum);
142 friend struct QTimer;
144 void Init(QTMR_Primary priSrc, QTMR_Input secSrc,
145 bool masterMode,
bool enExtForce,
146 uint8_t faultFiltCount, uint8_t faultFiltPer,
147 QTMR_DbgMode dbgMode);
148 bool SetupPwm(uint32_t pwmFreq, uint8_t dutyPcnt,
149 bool invertPolarity, uint32_t srcFreq);
150 void SetupCapture(QTMR_Input pin,
bool invertPolarity,
bool reloadOnCapture, QTMR_CapEdge edge);
151 void SetupCascade(uint16_t countVal);
153 inline void ConfigOutput(
bool enabled,
bool invertPolarity, QTMR_OutMode mode);
154 inline void ForceOutput(
bool val);
155 void EnableIRQs(uint32_t mask);
156 void DisableIRQs(uint32_t mask);
157 uint32_t GetEnabledIRQs();
158 uint32_t GetStatus();
159 void ClearStatus(uint32_t mask);
160 void SetPeriod(uint16_t period);
161 inline uint16_t GetCurCount();
162 inline uint16_t GetCurCap();
163 inline void Start(QTMR_CountMode mode);
164 inline QTMR_CountMode Stop();
165 void EnableDMA(uint32_t mask);
166 void DisableDMA(uint32_t mask);
172 QTimer_Channel_CB SetIRQFn(QTimer_Channel_CB fn);
175struct QTimer : TMR_Type
182 QTimer_Channel::ctx_t ch[4];
185 static ctx_t sCtxs[4];
186 static ctx_t *sGetCtx(QTimer *timer)
188 switch ((uint32_t)timer) {
189 case TMR1_BASE:
return sCtxs + 0;
190 case TMR2_BASE:
return sCtxs + 1;
191 case TMR3_BASE:
return sCtxs + 2;
192 case TMR4_BASE:
return sCtxs + 3;
200 friend QTimer_Channel::ctx_t * QTimer_Channel::sGetCtx(QTimer_Channel *ch);
201 friend QTimer_Channel_CB QTimer_Channel::SetIRQFn(QTimer_Channel_CB fn);
203 friend void isr_qtimer0();
204 friend void isr_qtimer1();
205 friend void isr_qtimer2();
206 friend void isr_qtimer3();
208 inline QTimer_Channel &operator[](
int i);
210 static inline QTimer *TMR(TMR_Type *tmr);
212 inline void Init(QTMR_Channel chNum, QTMR_Primary priSrc, QTMR_Input secSrc,
213 bool masterMode,
bool enExtForce, uint8_t faultFiltCount,
214 uint8_t faultFiltPer, QTMR_DbgMode dbgMode);
215 inline bool SetupPwm(QTMR_Channel chNum, uint32_t pwmFreq, uint8_t dutyPcnt,
216 bool invertPolarity, uint32_t srcFreq);
217 inline void SetupCapture(QTMR_Channel chNum, QTMR_Input pin,
218 bool invertPolarity,
bool reloadOnCapture,
220 inline void ConfigOutput(QTMR_Channel chNum,
bool enabled,
bool invertPolarity, QTMR_OutMode mode);
221 inline void ForceOutput(QTMR_Channel chNum,
bool val);
222 inline void EnableIRQs(QTMR_Channel chNum, uint32_t mask);
223 inline void DisableIRQs(QTMR_Channel chNum, uint32_t mask);
224 inline uint32_t GetEnabledIRQs(QTMR_Channel chNum);
225 inline uint32_t GetStatus(QTMR_Channel chNum);
226 inline void ClearStatus(QTMR_Channel chNum, uint32_t mask);
227 inline void SetPeriod(QTMR_Channel chNum, uint16_t period);
228 inline uint16_t GetCurCount(QTMR_Channel chNum);
229 inline void Start(QTMR_Channel chNum, QTMR_CountMode mode);
230 inline QTMR_CountMode Stop(QTMR_Channel chNum);
231 inline void EnableDMA(QTMR_Channel chNum, uint32_t mask);
232 inline void DisableDMA(QTMR_Channel chNum, uint32_t mask);
233 inline void EnableChannels(uint16_t mask);
234 inline void DisableChannels(uint16_t mask);
236 QTimer_CB SetIRQFn(QTimer_CB fn);
237 QTimer_Channel_CB SetChIRQFn(QTMR_Channel chNum, QTimer_Channel_CB fn);
241Init(QTMR_Channel chNum, QTMR_Primary priSrc, QTMR_Input secSrc,
242 bool masterMode,
bool enExtForce, uint8_t faultFiltCount,
243 uint8_t faultFiltPer, QTMR_DbgMode dbgMode)
245 ((QTimer_Channel *)(CHANNEL+chNum))
246 ->Init(priSrc, secSrc, masterMode, enExtForce, faultFiltCount,
247 faultFiltPer, dbgMode);
251SetupPwm(QTMR_Channel chNum, uint32_t pwmFreq, uint8_t dutyPcnt,
252 bool invertPolarity, uint32_t srcFreq)
254 return ((QTimer_Channel *)(CHANNEL+chNum))
255 ->SetupPwm(pwmFreq, dutyPcnt, invertPolarity, srcFreq);
260SetupCapture(QTMR_Channel chNum, QTMR_Input pin,
bool invertPolarity,
261 bool reloadOnCapture, QTMR_CapEdge edge)
263 ((QTimer_Channel *)(CHANNEL+chNum))
264 ->SetupCapture(pin, invertPolarity, reloadOnCapture, edge);
268ConfigOutput(QTMR_Channel chNum,
bool enabled,
bool invertPolarity, QTMR_OutMode mode)
270 ((QTimer_Channel *)(CHANNEL+chNum))->ConfigOutput(enabled,invertPolarity,mode);
274ForceOutput(QTMR_Channel chNum,
bool val)
276 ((QTimer_Channel *)(CHANNEL+chNum))->ForceOutput(val);
280EnableIRQs(QTMR_Channel chNum, uint32_t mask)
282 ((QTimer_Channel *)(CHANNEL+chNum))
287DisableIRQs(QTMR_Channel chNum, uint32_t mask)
289 ((QTimer_Channel *)(CHANNEL+chNum))
293inline uint32_t QTimer::
294GetEnabledIRQs(QTMR_Channel chNum)
296 return ((QTimer_Channel *)(CHANNEL+chNum))
300inline uint32_t QTimer::
301GetStatus(QTMR_Channel chNum)
303 return ((QTimer_Channel *)(CHANNEL+chNum))
308ClearStatus(QTMR_Channel chNum, uint32_t mask)
310 ((QTimer_Channel *)(CHANNEL+chNum))
315SetPeriod(QTMR_Channel chNum, uint16_t period)
317 ((QTimer_Channel *)(CHANNEL+chNum))
322EnableDMA(QTMR_Channel chNum, uint32_t mask)
324 ((QTimer_Channel *)(CHANNEL+chNum))
329DisableDMA(QTMR_Channel chNum, uint32_t mask)
331 ((QTimer_Channel *)(CHANNEL+chNum))
335inline QTimer_Channel & QTimer::
337{
return *(QTimer_Channel *)(CHANNEL+i); }
339inline QTimer *QTimer::
341{
return (QTimer *)tmr; }
343inline uint16_t QTimer::GetCurCount(QTMR_Channel chNum){
return CHANNEL[chNum].CNTR; }
345inline void QTimer::Start(QTMR_Channel chNum, QTMR_CountMode mode)
347 CHANNEL[chNum].CTRL =
348 (CHANNEL[chNum].CTRL & (uint16_t)(~(TMR_CTRL_CM_MASK)))
352inline QTMR_CountMode QTimer::
353Stop(QTMR_Channel chNum)
355 uint8_t mode = (CHANNEL[chNum].CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
356 CHANNEL[chNum].CTRL &= (uint16_t)(~(TMR_CTRL_CM_MASK));
357 return (QTMR_CountMode)mode;
361EnableChannels(uint16_t mask)
363 CHANNEL[0].ENBL |= mask;
369DisableChannels(uint16_t mask)
371 CHANNEL[0].ENBL &= ~mask;
374inline uint16_t QTimer_Channel::GetCurCount(){
return CNTR; }
375inline uint16_t QTimer_Channel::GetCurCap(){
return CAPT; }
377inline void QTimer_Channel::
378Start(QTMR_CountMode mode)
380 CTRL = (CTRL & (uint16_t)(~(TMR_CTRL_CM_MASK))) | TMR_CTRL_CM(mode);
383inline QTMR_CountMode QTimer_Channel::
386 uint8_t mode = (CTRL & TMR_CTRL_CM_MASK) >> TMR_CTRL_CM_SHIFT;
387 CTRL &= (uint16_t)(~(TMR_CTRL_CM_MASK));
388 return (QTMR_CountMode)mode;
391inline void QTimer_Channel::
392ConfigOutput(
bool enabled,
bool invertPolarity, QTMR_OutMode mode)
394 SCTRL = (SCTRL & ~(TMR_SCTRL_OPS_MASK | TMR_SCTRL_OEN_MASK))
395 | TMR_SCTRL_OPS(invertPolarity) | TMR_SCTRL_OEN(enabled);
396 CTRL = (CTRL & ~(TMR_CTRL_OUTMODE_MASK))
397 | TMR_CTRL_OUTMODE(mode);
400inline void QTimer_Channel::
403 SCTRL = (SCTRL & ~(TMR_SCTRL_VAL_MASK))
404 | TMR_SCTRL_VAL(val) | TMR_SCTRL_FORCE(1);