1 /**************************************************************************//**
2  * @file     eqei.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 
62 }
63 
64 /**
65   * @brief      Enable EQEI interrupt
66   * @param[in]  eqei         The pointer of the specified EQEI module.
67   * @param[in]  u32IntSel   Interrupt type selection.
68   *                         - \ref EQEI_CTL_DIRIEN_Msk   : Direction change interrupt
69   *                         - \ref EQEI_CTL_OVUNIEN_Msk  : Counter overflow or underflow interrupt
70   *                         - \ref EQEI_CTL_CMPIEN_Msk   : Compare-match interrupt
71   *                         - \ref EQEI_CTL_IDXIEN_Msk   : Index detected interrupt
72   * @return     None
73   * @details    This function enable EQEI specified interrupt.
74   */
EQEI_EnableInt(EQEI_T * eqei,uint32_t u32IntSel)75 void EQEI_EnableInt(EQEI_T* eqei, uint32_t u32IntSel)
76 {
77     /* Enable EQEI specified interrupt */
78     EQEI_ENABLE_INT(eqei, u32IntSel);
79 
80     /* Enable NVIC EQEI IRQ */
81     if(eqei == (EQEI_T*)EQEI0)
82     {
83         NVIC_EnableIRQ(EQEI0_IRQn);
84     }
85     else if(eqei == (EQEI_T*)EQEI1)
86     {
87         NVIC_EnableIRQ(EQEI1_IRQn);
88     }
89 
90 }
91 
92 /**
93   * @brief      Open EQEI in specified mode and enable input
94   * @param[in]  eqei         The pointer of the specified EQEI module.
95   * @param[in]  u32Mode     EQEI counting mode.
96   *                         - \ref EQEI_CTL_X4_FREE_COUNTING_MODE
97   *                         - \ref EQEI_CTL_X2_FREE_COUNTING_MODE
98   *                         - \ref EQEI_CTL_X4_COMPARE_COUNTING_MODE
99   *                         - \ref EQEI_CTL_X2_COMPARE_COUNTING_MODE
100   *                         - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE1
101   *                         - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE2
102   *                         - \ref EQEI_CTL_DIRECTIONAL_COUNTING_MODE
103   * @param[in]  u32Value    The counter maximum value in compare-counting mode.
104   * @return     None
105   * @details    This function set EQEI in specified mode and enable input.
106   */
EQEI_Open(EQEI_T * eqei,uint32_t u32Mode,uint32_t u32Value)107 void EQEI_Open(EQEI_T* eqei, uint32_t u32Mode, uint32_t u32Value)
108 {
109     /* Set EQEI function configuration */
110     /* Set EQEI counting mode */
111     /* Enable IDX, QEA and QEB input to EQEI controller */
112     eqei->CTL = (eqei->CTL & (~EQEI_CTL_MODE_Msk)) | ((u32Mode) | EQEI_CTL_CHAEN_Msk | EQEI_CTL_CHBEN_Msk | EQEI_CTL_IDXEN_Msk);
113 
114     /* Set EQEI maximum count value in in compare-counting mode */
115     eqei->CNTMAX = u32Value;
116 }
117 
118 /**
119   * @brief      Start EQEI function
120   * @param[in]  eqei     The pointer of the specified EQEI module.
121   * @return     None
122   * @details    This function enable EQEI function and start EQEI counting.
123   */
EQEI_Start(EQEI_T * eqei)124 void EQEI_Start(EQEI_T* eqei)
125 {
126     /* Enable EQEI controller function */
127     eqei->CTL |= EQEI_CTL_EQEIEN_Msk;
128 }
129 
130 /**
131   * @brief      Stop EQEI function
132   * @param[in]  eqei     The pointer of the specified EQEI module.
133   * @return     None
134   * @details    This function disable EQEI function and stop EQEI counting.
135   */
EQEI_Stop(EQEI_T * eqei)136 void EQEI_Stop(EQEI_T* eqei)
137 {
138     /* Disable EQEI controller function */
139     eqei->CTL &= (~EQEI_CTL_EQEIEN_Msk);
140 }
141 
142 
143 /*@}*/ /* end of group EQEI_EXPORTED_FUNCTIONS */
144 
145 /*@}*/ /* end of group EQEI_Driver */
146 
147 /*@}*/ /* end of group Standard_Driver */
148 
149 /*** (C) COPYRIGHT 2021 Nuvoton Technology Corp. ***/
150