1 /**************************************************************************//**
2 * @file qei.c
3 * @version V3.00
4 * @brief Enhanced Quadrature Encoder Interface (EQEI) driver source file
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 * @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
8 *****************************************************************************/
9 #include "NuMicro.h"
10
11
12 /** @addtogroup Standard_Driver Standard Driver
13 @{
14 */
15
16 /** @addtogroup EQEI_Driver EQEI Driver
17 @{
18 */
19
20 /** @addtogroup EQEI_EXPORTED_FUNCTIONS EQEI Exported Functions
21 @{
22 */
23
24 /**
25 * @brief Close EQEI function
26 * @param[in] eqei The pointer of the specified EQEI module.
27 * @return None
28 * @details This function reset EQEI configuration and stop EQEI counting.
29 */
EQEI_Close(EQEI_T * eqei)30 void EQEI_Close(EQEI_T* eqei)
31 {
32 /* Reset EQEI configuration */
33 eqei->CTL = (uint32_t)0;
34 }
35
36 /**
37 * @brief Disable EQEI interrupt
38 * @param[in] eqei The pointer of the specified EQEI module.
39 * @param[in] u32IntSel Interrupt type selection.
40 * - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt
41 * - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt
42 * - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt
43 * - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt
44 * @return None
45 * @details This function disable EQEI specified interrupt.
46 */
EQEI_DisableInt(EQEI_T * eqei,uint32_t u32IntSel)47 void EQEI_DisableInt(EQEI_T* eqei, uint32_t u32IntSel)
48 {
49 /* Disable EQEI specified interrupt */
50 EQEI_DISABLE_INT(eqei, u32IntSel);
51
52 /* Disable NVIC EQEI IRQ */
53 if(eqei ==(EQEI_T*)EQEI0)
54 {
55 NVIC_DisableIRQ((IRQn_Type)EQEI0_IRQn);
56 }
57 else if(eqei ==(EQEI_T*)EQEI1)
58 {
59 NVIC_DisableIRQ((IRQn_Type)EQEI1_IRQn);
60 }
61 else if(eqei ==(EQEI_T*)EQEI2)
62 {
63 NVIC_DisableIRQ((IRQn_Type)EQEI2_IRQn);
64 }
65 else
66 {
67 NVIC_DisableIRQ((IRQn_Type)EQEI3_IRQn);
68 }
69 }
70
71 /**
72 * @brief Enable EQEI interrupt
73 * @param[in] eqei The pointer of the specified EQEI module.
74 * @param[in] u32IntSel Interrupt type selection.
75 * - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt
76 * - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt
77 * - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt
78 * - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt
79 * @return None
80 * @details This function enable EQEI specified interrupt.
81 */
EQEI_EnableInt(EQEI_T * eqei,uint32_t u32IntSel)82 void EQEI_EnableInt(EQEI_T* eqei, uint32_t u32IntSel)
83 {
84 /* Enable EQEI specified interrupt */
85 EQEI_ENABLE_INT(eqei, u32IntSel);
86
87 /* Enable NVIC EQEI IRQ */
88 if(eqei == (EQEI_T*)EQEI0)
89 {
90 NVIC_EnableIRQ(EQEI0_IRQn);
91 }
92 else if(eqei == (EQEI_T*)EQEI1)
93 {
94 NVIC_EnableIRQ(EQEI1_IRQn);
95 }
96 else if(eqei == (EQEI_T*)EQEI2)
97 {
98 NVIC_EnableIRQ(EQEI2_IRQn);
99 }
100 else
101 {
102 NVIC_EnableIRQ(EQEI3_IRQn);
103 }
104 }
105
106 /**
107 * @brief Open EQEI in specified mode and enable input
108 * @param[in] eqei The pointer of the specified EQEI module.
109 * @param[in] u32Mode EQEI counting mode.
110 * - \ref EQEI_CTL_X4_FREE_COUNTING_MODE
111 * - \ref EQEI_CTL_X2_FREE_COUNTING_MODE
112 * - \ref EQEI_CTL_X4_COMPARE_COUNTING_MODE
113 * - \ref EQEI_CTL_X2_COMPARE_COUNTING_MODE
114 * - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE1
115 * - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE2
116 * - \ref EQEI_CTL_DIRECTIONAL_COUNTING_MODE
117 * @param[in] u32Value The counter maximum value in compare-counting mode.
118 * @return None
119 * @details This function set EQEI in specified mode and enable input.
120 */
EQEI_Open(EQEI_T * eqei,uint32_t u32Mode,uint32_t u32Value)121 void EQEI_Open(EQEI_T* eqei, uint32_t u32Mode, uint32_t u32Value)
122 {
123 /* Set EQEI function configuration */
124 /* Set EQEI counting mode */
125 /* Enable IDX, QEA and QEB input to EQEI controller */
126 eqei->CTL = (eqei->CTL & (~EQEI_CTL_MODE_Msk)) | ((u32Mode) | EQEI_CTL_CHAEN_Msk | EQEI_CTL_CHBEN_Msk | EQEI_CTL_IDXEN_Msk);
127
128 /* Set EQEI maximum count value in in compare-counting mode */
129 eqei->CNTMAX = u32Value;
130 }
131
132 /**
133 * @brief Start EQEI function
134 * @param[in] eqei The pointer of the specified EQEI module.
135 * @return None
136 * @details This function enable EQEI function and start EQEI counting.
137 */
EQEI_Start(EQEI_T * eqei)138 void EQEI_Start(EQEI_T* eqei)
139 {
140 /* Enable EQEI controller function */
141 eqei->CTL |= EQEI_CTL_QEIEN_Msk;
142 }
143
144 /**
145 * @brief Stop EQEI function
146 * @param[in] eqei The pointer of the specified EQEI module.
147 * @return None
148 * @details This function disable EQEI function and stop EQEI counting.
149 */
EQEI_Stop(EQEI_T * eqei)150 void EQEI_Stop(EQEI_T* eqei)
151 {
152 /* Disable EQEI controller function */
153 eqei->CTL &= (~EQEI_CTL_QEIEN_Msk);
154 }
155
156
157 /*@}*/ /* end of group EQEI_EXPORTED_FUNCTIONS */
158
159 /*@}*/ /* end of group EQEI_Driver */
160
161 /*@}*/ /* end of group Standard_Driver */
162
163 /*** (C) COPYRIGHT 2021 Nuvoton Technology Corp. ***/
164