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