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