1 /*
2 * Copyright (c) 2021 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #ifndef HPM_QEI_DRV_H
9 #define HPM_QEI_DRV_H
10
11 #include "hpm_common.h"
12 #include "hpm_qei_regs.h"
13 /**
14 * @brief QEI driver APIs
15 * @defgroup qei_interface QEI driver APIs
16 * @ingroup io_interfaces
17 * @{
18 *
19 */
20 #define QEI_EVENT_WDOG_FLAG_MASK (1U << 31) /**< watchdog flag */
21 #define QEI_EVENT_HOME_FLAG_MASK (1U << 30) /**< home flag */
22 #define QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK (1U << 29) /**< postion compare match flag */
23 #define QEI_EVENT_Z_PHASE_FLAG_MASK (1U << 28) /**< z input flag */
24
25 /**
26 * @brief counting mode of Z-phase counter
27 *
28 */
29 typedef enum qei_z_count_inc_mode {
30 qei_z_count_inc_on_z_input_assert = 0, /**< zcnt will increment or decrement when Z input assert */
31 qei_z_count_inc_on_phase_count_max = 1, /**< zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0 */
32 } qei_z_count_inc_mode_t;
33
34 /**
35 * @brief motor rotation direction
36 *
37 */
38 typedef enum qei_rotation_dir_cmp {
39 qei_rotation_dir_cmp_positive = 0, /**< position compare need positive rotation */
40 qei_rotation_dir_cmp_negative = 1, /**< position compare need negative rotation */
41 qei_rotation_dir_cmp_ignore = 2, /**< ignore */
42 } qei_rotation_dir_cmp_t;
43
44 /**
45 * @brief counter type
46 *
47 */
48 typedef enum qei_counter_type {
49 qei_counter_type_z = 0, /**< Z counter */
50 qei_counter_type_phase = 1, /**< Phase counter */
51 qei_counter_type_speed = 2, /**< Speed counter */
52 qei_counter_type_timer = 3, /**< Timer counter */
53 } qei_counter_type_t;
54
55 /**
56 * @brief qei work mode
57 *
58 */
59 typedef enum qei_work_mode {
60 qei_work_mode_abz = 0, /**< Orthogonal decoder mode */
61 qei_work_mode_pd = 1, /**< Directional (PD) mode */
62 qei_work_mode_ud = 2, /**< Up and Down (UD) mode */
63 } qei_work_mode_t;
64
65 /**
66 * @brief speed history type
67 *
68 */
69 typedef enum qei_speed_his_type {
70 qei_speed_his0 = QEI_SPDHIS_SPDHIS0, /**< Speed history0 */
71 qei_speed_his1 = QEI_SPDHIS_SPDHIS1, /**< Speed history1 */
72 qei_speed_his2 = QEI_SPDHIS_SPDHIS2, /**< Speed history2 */
73 qei_speed_his3 = QEI_SPDHIS_SPDHIS3, /**< Speed history3 */
74 } qei_speed_his_type_t;
75
76 #ifdef __cplusplus
77 extern "C" {
78 #endif
79
80 /**
81 * @brief enable qei watchdog
82 *
83 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
84 */
qei_wdog_enable(QEI_Type * qei_x)85 static inline void qei_wdog_enable(QEI_Type *qei_x)
86 {
87 qei_x->WDGCFG |= QEI_WDGCFG_WDGEN_MASK;
88 }
89
90 /**
91 * @brief disable qei watchdog
92 *
93 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
94 */
qei_wdog_disable(QEI_Type * qei_x)95 static inline void qei_wdog_disable(QEI_Type *qei_x)
96 {
97 qei_x->WDGCFG &= ~QEI_WDGCFG_WDGEN_MASK;
98 }
99
100 /**
101 * @brief config watchdog
102 *
103 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
104 * @param[in] timeout watchdog timeout time
105 * @param[in] enable
106 * @arg 1 - enable watchdog, You can use the @ref qei_wdog_disable open watchdog
107 * @arg 0 - disable watchdog, You can use the @ref qei_wdog_enable open watchdog
108 */
qei_wdog_config(QEI_Type * qei_x,uint32_t timeout,bool enable)109 static inline void qei_wdog_config(QEI_Type *qei_x, uint32_t timeout, bool enable)
110 {
111 qei_x->WDGCFG = QEI_WDGCFG_WDGTO_SET(timeout) | QEI_WDGCFG_WDGEN_SET(enable);
112 }
113
114 /**
115 * @brief
116 *
117 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
118 * @param[in] phase_count maximum phcnt number, phcnt will rollover to 0 when it upcount to phmax
119 * @param[in] mode
120 * @arg 1 zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0
121 * @arg 0 zcnt will increment or decrement when Z input assert
122 * @param[in] z_calibrate 1- phcnt will set to phidx when Z input assert
123 */
qei_phase_config(QEI_Type * qei_x,uint32_t phase_count,qei_z_count_inc_mode_t mode,bool z_calibrate)124 static inline void qei_phase_config(QEI_Type *qei_x, uint32_t phase_count,
125 qei_z_count_inc_mode_t mode, bool z_calibrate)
126 {
127 qei_x->PHCFG = QEI_PHCFG_ZCNTCFG_SET(mode) | QEI_PHCFG_PHCALIZ_SET(z_calibrate)
128 | QEI_PHCFG_PHMAX_SET(phase_count - 1);
129 }
130
131 /**
132 * @brief set phase index
133 *
134 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
135 * @param[in] phase_index phcnt reset value, phcnt will reset to phidx when phcaliz set to 1
136 */
qei_phase_set_index(QEI_Type * qei_x,uint32_t phase_index)137 static inline void qei_phase_set_index(QEI_Type *qei_x, uint32_t phase_index)
138 {
139 qei_x->PHIDX = QEI_PHIDX_PHIDX_SET(phase_index);
140 }
141
142 /**
143 * @brief enable trigger event
144 *
145 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
146 * @param[in] event_mask
147 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
148 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
149 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
150 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
151 */
qei_output_trigger_event_enable(QEI_Type * qei_x,uint32_t event_mask)152 static inline void qei_output_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
153 {
154 qei_x->TRGOEN |= event_mask;
155 }
156
157 /**
158 * @brief disable trigger event
159 *
160 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
161 * @param[in] event_mask
162 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
163 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
164 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
165 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
166 */
qei_output_trigger_event_disable(QEI_Type * qei_x,uint32_t event_mask)167 static inline void qei_output_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
168 {
169 qei_x->TRGOEN &= ~event_mask;
170 }
171
172 /**
173 * @brief enable load read trigger event
174 *
175 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
176 * @param[in] event_mask
177 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
178 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
179 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
180 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
181 */
qei_load_read_trigger_event_enable(QEI_Type * qei_x,uint32_t event_mask)182 static inline void qei_load_read_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
183 {
184 qei_x->READEN |= event_mask;
185 }
186
187 /**
188 * @brief disable load read trigger event
189 *
190 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
191 * @param[in] event_mask
192 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
193 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
194 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
195 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
196 */
qei_load_read_trigger_event_disable(QEI_Type * qei_x,uint32_t event_mask)197 static inline void qei_load_read_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
198 {
199 qei_x->READEN &= ~event_mask;
200 }
201
202 /**
203 * @brief set zcnt postion compare value
204 *
205 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
206 * @param[in] cmp zcnt postion compare value
207 */
qei_z_cmp_set(QEI_Type * qei_x,uint32_t cmp)208 static inline void qei_z_cmp_set(QEI_Type *qei_x, uint32_t cmp)
209 {
210 qei_x->ZCMP = QEI_ZCMP_ZCMP_SET(cmp);
211 }
212
213 /**
214 * @brief set spdcnt position compare value
215 *
216 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
217 * @param[in] cmp spdcnt position compare value
218 */
qei_speed_cmp_set(QEI_Type * qei_x,uint32_t cmp)219 static inline void qei_speed_cmp_set(QEI_Type *qei_x, uint32_t cmp)
220 {
221 qei_x->SPDCMP = QEI_SPDCMP_SPDCMP_SET(cmp);
222 }
223
224 /**
225 * @brief set Phase comparator value
226 *
227 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
228 * @param[in] cmp phcnt position compare value
229 * @param[in] cmp_z 1- postion compare not include zcnt
230 * @param[in] rotation_dir @ref qei_rotation_dir_cmp_t
231 */
qei_phase_cmp_set(QEI_Type * qei_x,uint32_t cmp,bool cmp_z,qei_rotation_dir_cmp_t rotation_dir)232 static inline void qei_phase_cmp_set(QEI_Type *qei_x, uint32_t cmp,
233 bool cmp_z, qei_rotation_dir_cmp_t rotation_dir)
234 {
235 qei_x->PHCMP = QEI_PHCMP_PHCMP_SET(cmp)
236 | QEI_PHCMP_ZCMPDIS_SET(!cmp_z)
237 | ((rotation_dir == qei_rotation_dir_cmp_ignore)
238 ? QEI_PHCMP_DIRCMPDIS_MASK : (QEI_PHCMP_DIRCMP_SET(rotation_dir)));
239 }
240
241 /**
242 * @brief clear qei status register
243 *
244 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
245 * @param[in] mask
246 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
247 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
248 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
249 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
250 */
qei_clear_status(QEI_Type * qei_x,uint32_t mask)251 static inline void qei_clear_status(QEI_Type *qei_x, uint32_t mask)
252 {
253 qei_x->SR = mask;
254 }
255
256 /**
257 * @brief get qei status
258 *
259 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
260 * @retval qei status:
261 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
262 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
263 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
264 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
265 */
qei_get_status(QEI_Type * qei_x)266 static inline uint32_t qei_get_status(QEI_Type *qei_x)
267 {
268 return qei_x->SR;
269 }
270
271 /**
272 * @brief get qei bit status
273 *
274 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
275 * @param[in] mask
276 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
277 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
278 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
279 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
280 * @retval true or false
281 */
qei_get_bit_status(QEI_Type * qei_x,uint32_t mask)282 static inline bool qei_get_bit_status(QEI_Type *qei_x, uint32_t mask)
283 {
284 if ((qei_x->SR & mask) == mask) {
285 return true;
286 } else {
287 return false;
288 }
289 }
290
291 /**
292 * @brief enable qei irq
293 *
294 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
295 * @param[in] mask
296 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
297 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
298 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
299 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
300 */
qei_irq_enable(QEI_Type * qei_x,uint32_t mask)301 static inline void qei_irq_enable(QEI_Type *qei_x, uint32_t mask)
302 {
303 qei_x->IRQEN |= mask;
304 }
305
306 /**
307 * @brief disable qei irq
308 *
309 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
310 * @param[in] mask
311 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
312 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
313 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
314 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
315 */
qei_irq_disable(QEI_Type * qei_x,uint32_t mask)316 static inline void qei_irq_disable(QEI_Type *qei_x, uint32_t mask)
317 {
318 qei_x->IRQEN &= ~mask;
319 }
320
321 /**
322 * @brief enable dma request
323 *
324 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
325 * @param[in] mask
326 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
327 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
328 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
329 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
330 */
qei_dma_request_enable(QEI_Type * qei_x,uint32_t mask)331 static inline void qei_dma_request_enable(QEI_Type *qei_x, uint32_t mask)
332 {
333 qei_x->DMAEN |= mask;
334 }
335
336 /**
337 * @brief disable qei dma
338 *
339 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
340 * @param[in] mask
341 * @arg @ref QEI_EVENT_WDOG_FLAG_MASK
342 * @arg @ref QEI_EVENT_HOME_FLAG_MASK
343 * @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
344 * @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
345 */
qei_dma_request_disable(QEI_Type * qei_x,uint32_t mask)346 static inline void qei_dma_request_disable(QEI_Type *qei_x, uint32_t mask)
347 {
348 qei_x->DMAEN &= ~mask;
349 }
350
351 /**
352 * @brief get current counter value
353 *
354 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
355 * @param[in] type @ref qei_counter_type_t
356 * @retval counter value
357 */
qei_get_current_count(QEI_Type * qei_x,qei_counter_type_t type)358 static inline uint32_t qei_get_current_count(QEI_Type *qei_x,
359 qei_counter_type_t type)
360 {
361 return *(&qei_x->COUNT[QEI_COUNT_CURRENT].Z + type);
362 }
363
364 /**
365 * @brief get current phcnt value
366 *
367 * @param qei_x QEI base address, HPM_QEIx(x=0...n)
368 * @return phcnt value
369 */
qei_get_current_phase_phcnt(QEI_Type * qei_x)370 static inline uint32_t qei_get_current_phase_phcnt(QEI_Type *qei_x)
371 {
372 return QEI_COUNT_PH_PHCNT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
373 }
374
375 /**
376 * @brief get current a phase status
377 *
378 * @param qei_x QEI base address, HPM_QEIx(x=0...n)
379 * @return a phase level
380 */
qei_get_current_phase_astat(QEI_Type * qei_x)381 static inline bool qei_get_current_phase_astat(QEI_Type *qei_x)
382 {
383 return QEI_COUNT_PH_ASTAT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
384 }
385
386 /**
387 * @brief get current b phase status
388 *
389 * @param qei_x QEI base address, HPM_QEIx(x=0...n)
390 * @return b phase level
391 */
qei_get_current_phase_bstat(QEI_Type * qei_x)392 static inline bool qei_get_current_phase_bstat(QEI_Type *qei_x)
393 {
394 return QEI_COUNT_PH_BSTAT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
395 }
396
397 /**
398 * @brief get current phase dir
399 *
400 * @param qei_x QEI base address, HPM_QEIx(x=0...n)
401 * @return dir
402 */
qei_get_current_phase_dir(QEI_Type * qei_x)403 static inline bool qei_get_current_phase_dir(QEI_Type *qei_x)
404 {
405 return QEI_COUNT_PH_DIR_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
406 }
407
408 /**
409 * @brief get read event count value
410 *
411 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
412 * @param[in] type @ref qei_counter_type_t
413 * @retval counter value
414 */
qei_get_count_on_read_event(QEI_Type * qei_x,qei_counter_type_t type)415 static inline uint32_t qei_get_count_on_read_event(QEI_Type *qei_x,
416 qei_counter_type_t type)
417 {
418 return *(&(qei_x->COUNT[QEI_COUNT_READ].Z) + type);
419 }
420
421 /**
422 * @brief read the value of each phase snapshot 0 counter
423 *
424 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
425 * @param[in] type @ref qei_counter_type_t
426 * @retval counter value
427 */
qei_get_count_on_snap0_event(QEI_Type * qei_x,qei_counter_type_t type)428 static inline uint32_t qei_get_count_on_snap0_event(QEI_Type *qei_x,
429 qei_counter_type_t type)
430 {
431 return *(&qei_x->COUNT[QEI_COUNT_SNAP0].Z + type);
432 }
433
434 /**
435 * @brief read the value of each phase snapshot 1 counter
436 *
437 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
438 * @param[in] type @ref qei_counter_type_t
439 * @retval counter value
440 */
qei_get_count_on_snap1_event(QEI_Type * qei_x,qei_counter_type_t type)441 static inline uint32_t qei_get_count_on_snap1_event(QEI_Type *qei_x,
442 qei_counter_type_t type)
443 {
444 return *(&qei_x->COUNT[QEI_COUNT_SNAP1].Z + type);
445 }
446
447 /**
448 * @brief get speed history
449 *
450 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
451 * @param[in] hist_index @ref qei_speed_his_type_t
452 * @retval speed history value
453 * @arg counter value
454 */
qei_get_speed_history(QEI_Type * qei_x,qei_speed_his_type_t hist_index)455 static inline uint32_t qei_get_speed_history(QEI_Type *qei_x, qei_speed_his_type_t hist_index)
456 {
457 return QEI_SPDHIS_SPDHIS0_GET(qei_x->SPDHIS[hist_index]);
458 }
459
460 /**
461 * @brief load phcnt, zcnt, spdcnt and tmrcnt into their read registers
462 *
463 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
464 */
qei_load_counter_to_read_registers(QEI_Type * qei_x)465 static inline void qei_load_counter_to_read_registers(QEI_Type *qei_x)
466 {
467 qei_x->CR |= QEI_CR_READ_MASK;
468 }
469
470 /**
471 * @brief reset spdcnt/phcnt/zcnt
472 *
473 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
474 * @param[in] counter_mask
475 * @arg 1 reset zcnt when H assert
476 * @arg (1<<1) reset phcnt when H assert
477 * @arg (1<<2) reset spdcnt when H assert
478 */
qei_reset_counter_on_h_assert(QEI_Type * qei_x,uint32_t counter_mask)479 static inline void qei_reset_counter_on_h_assert(QEI_Type *qei_x,
480 uint32_t counter_mask)
481 {
482 qei_x->CR |= counter_mask << 16;
483 }
484
485 /**
486 * @brief pause spdcnt when PAUSE assert
487 *
488 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
489 * @param[in] counter_mask
490 * @arg 1 pause spdcnt when PAUSE assert
491 * @arg (1<<1) pause spdcnt when PAUSE assert
492 * @arg (1<<2) pause spdcnt when PAUSE assert
493 */
qei_pause_counter_on_pause(QEI_Type * qei_x,uint32_t counter_mask)494 static inline void qei_pause_counter_on_pause(QEI_Type *qei_x,
495 uint32_t counter_mask)
496 {
497 qei_x->CR |= counter_mask << 12;
498 }
499
500 /**
501 * @brief load phcnt, zcnt, spdcnt and tmrcnt into their snap registers
502 *
503 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
504 */
qei_snap_enable(QEI_Type * qei_x)505 static inline void qei_snap_enable(QEI_Type *qei_x)
506 {
507 qei_x->CR |= QEI_CR_SNAPEN_MASK;
508 }
509
510 /**
511 * @brief disable snap
512 *
513 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
514 */
qei_snap_disable(QEI_Type * qei_x)515 static inline void qei_snap_disable(QEI_Type *qei_x)
516 {
517 qei_x->CR &= ~QEI_CR_SNAPEN_MASK;
518 }
519
520 /**
521 * @brief reset zcnt, spdcnt and tmrcnt to 0
522 *
523 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
524 */
qei_counter_reset_assert(QEI_Type * qei_x)525 static inline void qei_counter_reset_assert(QEI_Type *qei_x)
526 {
527 qei_x->CR |= QEI_CR_RSTCNT_MASK;
528 }
529
530 /**
531 * @brief qei counter reset release
532 *
533 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
534 */
qei_counter_reset_release(QEI_Type * qei_x)535 static inline void qei_counter_reset_release(QEI_Type *qei_x)
536 {
537 qei_x->CR &= ~QEI_CR_RSTCNT_MASK;
538 }
539
540 /**
541 * @brief set work mode
542 *
543 * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
544 * @param[in] mode @ref qei_work_mode_t
545 */
qei_set_work_mode(QEI_Type * qei_x,qei_work_mode_t mode)546 static inline void qei_set_work_mode(QEI_Type *qei_x, qei_work_mode_t mode)
547 {
548 qei_x->CR = (qei_x->CR & ~QEI_CR_ENCTYP_MASK) | QEI_CR_ENCTYP_SET(mode);
549 }
550
551 #ifdef __cplusplus
552 }
553 #endif
554 /**
555 * @}
556 */
557 #endif /* HPM_QEI_DRV_H */
558