HPM SDK
HPMicro Software Development Kit
hpm_qei_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025 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"
20 #define QEI_EVENT_WDOG_FLAG_MASK (1U << 31)
21 #define QEI_EVENT_HOME_FLAG_MASK (1U << 30)
22 #define QEI_EVENT_POSITION_COMPARE_FLAG_MASK (1U << 29)
23 #define QEI_EVENT_Z_PHASE_FLAG_MASK (1U << 28)
25 #define QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK QEI_EVENT_POSITION_COMPARE_FLAG_MASK /* Legacy macro, kept for backwards compatibility */
26 
31 typedef enum qei_z_count_inc_mode {
35 
40 typedef enum qei_rotation_dir_cmp {
45 
50 typedef enum qei_counter_type {
56 
61 typedef enum qei_work_mode {
66 
71 typedef enum qei_speed_his_type {
77 
81 typedef struct {
83  qei_z_count_inc_mode_t z_count_inc_mode;
84  uint32_t phcnt_max;
85  bool z_cali_enable;
86  uint32_t phcnt_idx;
92 typedef struct {
105 typedef struct {
111 #ifdef __cplusplus
112 extern "C" {
113 #endif
114 
120 static inline void qei_wdog_enable(QEI_Type *qei_x)
121 {
122  qei_x->WDGCFG |= QEI_WDGCFG_WDGEN_MASK;
123 }
124 
130 static inline void qei_wdog_disable(QEI_Type *qei_x)
131 {
132  qei_x->WDGCFG &= ~QEI_WDGCFG_WDGEN_MASK;
133 }
134 
144 static inline void qei_wdog_config(QEI_Type *qei_x, uint32_t timeout, bool enable)
145 {
146  qei_x->WDGCFG = QEI_WDGCFG_WDGTO_SET(timeout) | QEI_WDGCFG_WDGEN_SET(enable);
147 }
148 
159 static inline void qei_phase_config(QEI_Type *qei_x, uint32_t phase_count,
160  qei_z_count_inc_mode_t mode, bool z_calibrate)
161 {
162  qei_x->PHCFG = QEI_PHCFG_ZCNTCFG_SET(mode) | QEI_PHCFG_PHCALIZ_SET(z_calibrate)
163  | QEI_PHCFG_PHMAX_SET(phase_count - 1);
164 }
165 
172 static inline void qei_phase_set_index(QEI_Type *qei_x, uint32_t phase_index)
173 {
174  qei_x->PHIDX = QEI_PHIDX_PHIDX_SET(phase_index);
175 }
176 
187 static inline void qei_output_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
188 {
189  qei_x->TRGOEN |= event_mask;
190 }
191 
202 static inline void qei_output_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
203 {
204  qei_x->TRGOEN &= ~event_mask;
205 }
206 
217 static inline void qei_load_read_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
218 {
219  qei_x->READEN |= event_mask;
220 }
221 
232 static inline void qei_load_read_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
233 {
234  qei_x->READEN &= ~event_mask;
235 }
236 
243 static inline void qei_z_cmp_set(QEI_Type *qei_x, uint32_t cmp)
244 {
245  qei_x->ZCMP = QEI_ZCMP_ZCMP_SET(cmp);
246 }
247 
254 static inline void qei_speed_cmp_set(QEI_Type *qei_x, uint32_t cmp)
255 {
256  qei_x->SPDCMP = QEI_SPDCMP_SPDCMP_SET(cmp);
257 }
258 
267 static inline void qei_phase_cmp_set(QEI_Type *qei_x, uint32_t cmp,
268  bool cmp_z, qei_rotation_dir_cmp_t rotation_dir)
269 {
270  qei_x->PHCMP = QEI_PHCMP_PHCMP_SET(cmp)
271  | QEI_PHCMP_ZCMPDIS_SET(!cmp_z)
272  | ((rotation_dir == qei_rotation_dir_cmp_ignore)
273  ? QEI_PHCMP_DIRCMPDIS_MASK : (QEI_PHCMP_DIRCMP_SET(rotation_dir)));
274 }
275 
286 static inline void qei_clear_status(QEI_Type *qei_x, uint32_t mask)
287 {
288  qei_x->SR = mask;
289 }
290 
301 static inline uint32_t qei_get_status(QEI_Type *qei_x)
302 {
303  return qei_x->SR;
304 }
305 
317 static inline bool qei_get_bit_status(QEI_Type *qei_x, uint32_t mask)
318 {
319  if ((qei_x->SR & mask) == mask) {
320  return true;
321  } else {
322  return false;
323  }
324 }
325 
336 static inline void qei_irq_enable(QEI_Type *qei_x, uint32_t mask)
337 {
338  qei_x->IRQEN |= mask;
339 }
340 
351 static inline void qei_irq_disable(QEI_Type *qei_x, uint32_t mask)
352 {
353  qei_x->IRQEN &= ~mask;
354 }
355 
366 static inline void qei_dma_request_enable(QEI_Type *qei_x, uint32_t mask)
367 {
368  qei_x->DMAEN |= mask;
369 }
370 
381 static inline void qei_dma_request_disable(QEI_Type *qei_x, uint32_t mask)
382 {
383  qei_x->DMAEN &= ~mask;
384 }
385 
393 static inline uint32_t qei_get_current_count(QEI_Type *qei_x,
394  qei_counter_type_t type)
395 {
396  return *(&qei_x->COUNT[QEI_COUNT_CURRENT].Z + type);
397 }
398 
405 static inline uint32_t qei_get_current_phase_phcnt(QEI_Type *qei_x)
406 {
408 }
409 
416 static inline bool qei_get_current_phase_astat(QEI_Type *qei_x)
417 {
419 }
420 
427 static inline bool qei_get_current_phase_bstat(QEI_Type *qei_x)
428 {
430 }
431 
438 static inline bool qei_get_current_phase_dir(QEI_Type *qei_x)
439 {
441 }
442 
450 static inline uint32_t qei_get_count_on_read_event(QEI_Type *qei_x,
451  qei_counter_type_t type)
452 {
453  return *(&(qei_x->COUNT[QEI_COUNT_READ].Z) + type);
454 }
455 
463 static inline uint32_t qei_get_count_on_snap0_event(QEI_Type *qei_x,
464  qei_counter_type_t type)
465 {
466  return *(&qei_x->COUNT[QEI_COUNT_SNAP0].Z + type);
467 }
468 
476 static inline uint32_t qei_get_count_on_snap1_event(QEI_Type *qei_x,
477  qei_counter_type_t type)
478 {
479  return *(&qei_x->COUNT[QEI_COUNT_SNAP1].Z + type);
480 }
481 
490 static inline uint32_t qei_get_speed_history(QEI_Type *qei_x, qei_speed_his_type_t hist_index)
491 {
492  return QEI_SPDHIS_SPDHIS0_GET(qei_x->SPDHIS[hist_index]);
493 }
494 
501 {
502  qei_x->CR |= QEI_CR_READ_MASK;
503 }
504 
514 static inline void qei_reset_counter_on_h_assert(QEI_Type *qei_x,
515  uint32_t counter_mask)
516 {
517  qei_x->CR |= counter_mask << 16;
518 }
519 
529 static inline void qei_pause_counter_on_pause(QEI_Type *qei_x,
530  uint32_t counter_mask)
531 {
532  qei_x->CR |= counter_mask << 12;
533 }
534 
540 static inline void qei_snap_enable(QEI_Type *qei_x)
541 {
542  qei_x->CR |= QEI_CR_SNAPEN_MASK;
543 }
544 
550 static inline void qei_snap_disable(QEI_Type *qei_x)
551 {
552  qei_x->CR &= ~QEI_CR_SNAPEN_MASK;
553 }
554 
560 static inline void qei_counter_reset_assert(QEI_Type *qei_x)
561 {
562  qei_x->CR |= QEI_CR_RSTCNT_MASK;
563 }
564 
570 static inline void qei_counter_reset_release(QEI_Type *qei_x)
571 {
572  qei_x->CR &= ~QEI_CR_RSTCNT_MASK;
573 }
574 
581 static inline void qei_set_work_mode(QEI_Type *qei_x, qei_work_mode_t mode)
582 {
583  qei_x->CR = (qei_x->CR & ~QEI_CR_ENCTYP_MASK) | QEI_CR_ENCTYP_SET(mode);
584 }
585 
592 void qei_config_mode(QEI_Type *qei_x, qei_mode_config_t *config);
593 
600 void qei_config_h_phase(QEI_Type *qei_x, qei_h_phase_config_t *config);
601 
608 void qei_config_pause(QEI_Type *qei_x, qei_pause_config_t *config);
609 
610 #ifdef __cplusplus
611 }
612 #endif
616 #endif /* HPM_QEI_DRV_H */
#define QEI_PHCFG_PHMAX_SET(x)
Definition: hpm_qei_regs.h:205
#define QEI_SPDHIS_SPDHIS0
Definition: hpm_qei_regs.h:630
#define QEI_COUNT_READ
Definition: hpm_qei_regs.h:625
#define QEI_COUNT_PH_PHCNT_GET(x)
Definition: hpm_qei_regs.h:558
#define QEI_PHCFG_ZCNTCFG_SET(x)
Definition: hpm_qei_regs.h:185
#define QEI_SPDHIS_SPDHIS0_GET(x)
Definition: hpm_qei_regs.h:619
#define QEI_CR_ENCTYP_MASK
Definition: hpm_qei_regs.h:171
#define QEI_PHCMP_PHCMP_SET(x)
Definition: hpm_qei_regs.h:372
#define QEI_COUNT_PH_BSTAT_GET(x)
Definition: hpm_qei_regs.h:549
#define QEI_COUNT_SNAP1
Definition: hpm_qei_regs.h:627
#define QEI_CR_ENCTYP_SET(x)
Definition: hpm_qei_regs.h:173
#define QEI_CR_RSTCNT_MASK
Definition: hpm_qei_regs.h:161
#define QEI_SPDHIS_SPDHIS3
Definition: hpm_qei_regs.h:633
#define QEI_COUNT_PH_ASTAT_GET(x)
Definition: hpm_qei_regs.h:539
#define QEI_PHCFG_PHCALIZ_SET(x)
Definition: hpm_qei_regs.h:195
#define QEI_SPDHIS_SPDHIS2
Definition: hpm_qei_regs.h:632
#define QEI_PHCMP_ZCMPDIS_SET(x)
Definition: hpm_qei_regs.h:341
#define QEI_WDGCFG_WDGEN_MASK
Definition: hpm_qei_regs.h:214
#define QEI_CR_READ_MASK
Definition: hpm_qei_regs.h:41
#define QEI_COUNT_SNAP0
Definition: hpm_qei_regs.h:626
#define QEI_ZCMP_ZCMP_SET(x)
Definition: hpm_qei_regs.h:330
#define QEI_CR_SNAPEN_MASK
Definition: hpm_qei_regs.h:151
#define QEI_PHIDX_PHIDX_SET(x)
Definition: hpm_qei_regs.h:237
#define QEI_PHCMP_DIRCMPDIS_MASK
Definition: hpm_qei_regs.h:349
#define QEI_SPDHIS_SPDHIS1
Definition: hpm_qei_regs.h:631
#define QEI_SPDCMP_SPDCMP_SET(x)
Definition: hpm_qei_regs.h:383
#define QEI_PHCMP_DIRCMP_SET(x)
Definition: hpm_qei_regs.h:362
#define QEI_WDGCFG_WDGEN_SET(x)
Definition: hpm_qei_regs.h:216
#define QEI_COUNT_CURRENT
Definition: hpm_qei_regs.h:624
#define QEI_WDGCFG_WDGTO_SET(x)
Definition: hpm_qei_regs.h:226
#define QEI_COUNT_PH_DIR_GET(x)
Definition: hpm_qei_regs.h:529
static void qei_output_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
enable trigger event
Definition: hpm_qei_drv.h:187
static void qei_wdog_disable(QEI_Type *qei_x)
disable qei watchdog
Definition: hpm_qei_drv.h:130
static void qei_wdog_config(QEI_Type *qei_x, uint32_t timeout, bool enable)
config watchdog
Definition: hpm_qei_drv.h:144
static void qei_output_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
disable trigger event
Definition: hpm_qei_drv.h:202
static uint32_t qei_get_count_on_read_event(QEI_Type *qei_x, qei_counter_type_t type)
get read event count value
Definition: hpm_qei_drv.h:450
static void qei_counter_reset_release(QEI_Type *qei_x)
qei counter reset release
Definition: hpm_qei_drv.h:570
enum qei_counter_type qei_counter_type_t
counter type
static uint32_t qei_get_count_on_snap0_event(QEI_Type *qei_x, qei_counter_type_t type)
read the value of each phase snapshot 0 counter
Definition: hpm_qei_drv.h:463
static void qei_phase_cmp_set(QEI_Type *qei_x, uint32_t cmp, bool cmp_z, qei_rotation_dir_cmp_t rotation_dir)
set Phase comparator value
Definition: hpm_qei_drv.h:267
static void qei_load_counter_to_read_registers(QEI_Type *qei_x)
load phcnt, zcnt, spdcnt and tmrcnt into their read registers
Definition: hpm_qei_drv.h:500
static void qei_reset_counter_on_h_assert(QEI_Type *qei_x, uint32_t counter_mask)
reset spdcnt/phcnt/zcnt
Definition: hpm_qei_drv.h:514
static void qei_irq_enable(QEI_Type *qei_x, uint32_t mask)
enable qei irq
Definition: hpm_qei_drv.h:336
static uint32_t qei_get_current_phase_phcnt(QEI_Type *qei_x)
get current phcnt value
Definition: hpm_qei_drv.h:405
qei_z_count_inc_mode
counting mode of Z-phase counter
Definition: hpm_qei_drv.h:31
static uint32_t qei_get_status(QEI_Type *qei_x)
get qei status
Definition: hpm_qei_drv.h:301
static void qei_speed_cmp_set(QEI_Type *qei_x, uint32_t cmp)
set spdcnt position compare value
Definition: hpm_qei_drv.h:254
static void qei_z_cmp_set(QEI_Type *qei_x, uint32_t cmp)
set zcnt postion compare value
Definition: hpm_qei_drv.h:243
static uint32_t qei_get_count_on_snap1_event(QEI_Type *qei_x, qei_counter_type_t type)
read the value of each phase snapshot 1 counter
Definition: hpm_qei_drv.h:476
static void qei_pause_counter_on_pause(QEI_Type *qei_x, uint32_t counter_mask)
pause spdcnt when PAUSE assert
Definition: hpm_qei_drv.h:529
qei_rotation_dir_cmp
motor rotation direction
Definition: hpm_qei_drv.h:40
enum qei_work_mode qei_work_mode_t
qei work mode
static void qei_load_read_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
enable load read trigger event
Definition: hpm_qei_drv.h:217
static void qei_clear_status(QEI_Type *qei_x, uint32_t mask)
clear qei status register
Definition: hpm_qei_drv.h:286
static void qei_dma_request_disable(QEI_Type *qei_x, uint32_t mask)
disable qei dma
Definition: hpm_qei_drv.h:381
static uint32_t qei_get_current_count(QEI_Type *qei_x, qei_counter_type_t type)
get current counter value
Definition: hpm_qei_drv.h:393
qei_speed_his_type
speed history type
Definition: hpm_qei_drv.h:71
static void qei_snap_enable(QEI_Type *qei_x)
load phcnt, zcnt, spdcnt and tmrcnt into their snap registers
Definition: hpm_qei_drv.h:540
static bool qei_get_current_phase_astat(QEI_Type *qei_x)
get current a phase status
Definition: hpm_qei_drv.h:416
static bool qei_get_current_phase_dir(QEI_Type *qei_x)
get current phase dir
Definition: hpm_qei_drv.h:438
qei_work_mode
qei work mode
Definition: hpm_qei_drv.h:61
static bool qei_get_bit_status(QEI_Type *qei_x, uint32_t mask)
get qei bit status
Definition: hpm_qei_drv.h:317
static uint32_t qei_get_speed_history(QEI_Type *qei_x, qei_speed_his_type_t hist_index)
get speed history
Definition: hpm_qei_drv.h:490
static void qei_counter_reset_assert(QEI_Type *qei_x)
reset zcnt, spdcnt and tmrcnt to 0
Definition: hpm_qei_drv.h:560
static bool qei_get_current_phase_bstat(QEI_Type *qei_x)
get current b phase status
Definition: hpm_qei_drv.h:427
enum qei_speed_his_type qei_speed_his_type_t
speed history type
static void qei_set_work_mode(QEI_Type *qei_x, qei_work_mode_t mode)
set work mode
Definition: hpm_qei_drv.h:581
static void qei_wdog_enable(QEI_Type *qei_x)
enable qei watchdog
Definition: hpm_qei_drv.h:120
void qei_config_mode(QEI_Type *qei_x, qei_mode_config_t *config)
config qei mode
Definition: hpm_qei_drv.c:10
void qei_config_pause(QEI_Type *qei_x, qei_pause_config_t *config)
config pause signal
Definition: hpm_qei_drv.c:49
static void qei_dma_request_enable(QEI_Type *qei_x, uint32_t mask)
enable dma request
Definition: hpm_qei_drv.h:366
void qei_config_h_phase(QEI_Type *qei_x, qei_h_phase_config_t *config)
config h phase signal
Definition: hpm_qei_drv.c:19
static void qei_snap_disable(QEI_Type *qei_x)
disable snap
Definition: hpm_qei_drv.h:550
enum qei_rotation_dir_cmp qei_rotation_dir_cmp_t
motor rotation direction
static void qei_phase_set_index(QEI_Type *qei_x, uint32_t phase_index)
set phase index
Definition: hpm_qei_drv.h:172
static void qei_phase_config(QEI_Type *qei_x, uint32_t phase_count, qei_z_count_inc_mode_t mode, bool z_calibrate)
Definition: hpm_qei_drv.h:159
enum qei_z_count_inc_mode qei_z_count_inc_mode_t
counting mode of Z-phase counter
qei_counter_type
counter type
Definition: hpm_qei_drv.h:50
static void qei_irq_disable(QEI_Type *qei_x, uint32_t mask)
disable qei irq
Definition: hpm_qei_drv.h:351
static void qei_load_read_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
disable load read trigger event
Definition: hpm_qei_drv.h:232
@ qei_z_count_inc_on_phase_count_max
Definition: hpm_qei_drv.h:33
@ qei_z_count_inc_on_z_input_assert
Definition: hpm_qei_drv.h:32
@ qei_rotation_dir_cmp_negative
Definition: hpm_qei_drv.h:42
@ qei_rotation_dir_cmp_ignore
Definition: hpm_qei_drv.h:43
@ qei_rotation_dir_cmp_positive
Definition: hpm_qei_drv.h:41
@ qei_speed_his3
Definition: hpm_qei_drv.h:75
@ qei_speed_his0
Definition: hpm_qei_drv.h:72
@ qei_speed_his2
Definition: hpm_qei_drv.h:74
@ qei_speed_his1
Definition: hpm_qei_drv.h:73
@ qei_work_mode_abz
Definition: hpm_qei_drv.h:62
@ qei_work_mode_ud
Definition: hpm_qei_drv.h:64
@ qei_work_mode_pd
Definition: hpm_qei_drv.h:63
@ qei_counter_type_speed
Definition: hpm_qei_drv.h:53
@ qei_counter_type_timer
Definition: hpm_qei_drv.h:54
@ qei_counter_type_phase
Definition: hpm_qei_drv.h:52
@ qei_counter_type_z
Definition: hpm_qei_drv.h:51
Definition: hpm_qei_regs.h:12
__RW uint32_t Z
Definition: hpm_qei_regs.h:26
__R uint32_t SPDHIS[4]
Definition: hpm_qei_regs.h:31
__RW uint32_t TRGOEN
Definition: hpm_qei_regs.h:17
__RW uint32_t PHCFG
Definition: hpm_qei_regs.h:14
__RW uint32_t IRQEN
Definition: hpm_qei_regs.h:24
__RW uint32_t CR
Definition: hpm_qei_regs.h:13
__RW uint32_t READEN
Definition: hpm_qei_regs.h:18
__RW uint32_t PHCMP
Definition: hpm_qei_regs.h:20
__RW uint32_t SR
Definition: hpm_qei_regs.h:23
__RW uint32_t ZCMP
Definition: hpm_qei_regs.h:19
__RW uint32_t SPDCMP
Definition: hpm_qei_regs.h:21
struct QEI_Type::@474 COUNT[4]
__RW uint32_t WDGCFG
Definition: hpm_qei_regs.h:15
__RW uint32_t PHIDX
Definition: hpm_qei_regs.h:16
__RW uint32_t DMAEN
Definition: hpm_qei_regs.h:22
qei H phase config structure
Definition: hpm_qei_drv.h:92
bool h_valid_reset_phcnt
Definition: hpm_qei_drv.h:98
bool h_fall_dir_forward
Definition: hpm_qei_drv.h:93
bool h_valid_reset_zcnt
Definition: hpm_qei_drv.h:99
bool h_fall_dir_reverse
Definition: hpm_qei_drv.h:94
bool h_valid_reset_spdcnt
Definition: hpm_qei_drv.h:97
bool h_rise_dir_forward
Definition: hpm_qei_drv.h:95
bool h_rise_dir_reverse
Definition: hpm_qei_drv.h:96
qei mode config structure
Definition: hpm_qei_drv.h:81
uint32_t phcnt_idx
Definition: hpm_qei_drv.h:86
uint32_t phcnt_max
Definition: hpm_qei_drv.h:84
qei_work_mode_t work_mode
Definition: hpm_qei_drv.h:82
qei pause config structure
Definition: hpm_qei_drv.h:105
bool pause_valid_pause_spdcnt
Definition: hpm_qei_drv.h:106
bool pause_valid_pause_zcnt
Definition: hpm_qei_drv.h:108
bool pause_valid_pause_phcnt
Definition: hpm_qei_drv.h:107