164 lines
5.1 KiB
C
164 lines
5.1 KiB
C
/**************************************************************************//**
|
|
* @file qei.c
|
|
* @version V3.00
|
|
* @brief Enhanced Quadrature Encoder Interface (EQEI) driver source file
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
* @copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
|
|
*****************************************************************************/
|
|
#include "NuMicro.h"
|
|
|
|
|
|
/** @addtogroup Standard_Driver Standard Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup EQEI_Driver EQEI Driver
|
|
@{
|
|
*/
|
|
|
|
/** @addtogroup EQEI_EXPORTED_FUNCTIONS EQEI Exported Functions
|
|
@{
|
|
*/
|
|
|
|
/**
|
|
* @brief Close EQEI function
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @return None
|
|
* @details This function reset EQEI configuration and stop EQEI counting.
|
|
*/
|
|
void EQEI_Close(EQEI_T *eqei)
|
|
{
|
|
/* Reset EQEI configuration */
|
|
eqei->CTL = (uint32_t)0;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable EQEI interrupt
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @param[in] u32IntSel Interrupt type selection.
|
|
* - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt
|
|
* - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt
|
|
* - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt
|
|
* - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt
|
|
* @return None
|
|
* @details This function disable EQEI specified interrupt.
|
|
*/
|
|
void EQEI_DisableInt(EQEI_T *eqei, uint32_t u32IntSel)
|
|
{
|
|
/* Disable EQEI specified interrupt */
|
|
EQEI_DISABLE_INT(eqei, u32IntSel);
|
|
|
|
/* Disable NVIC EQEI IRQ */
|
|
if (eqei == (EQEI_T *)EQEI0)
|
|
{
|
|
NVIC_DisableIRQ((IRQn_Type)EQEI0_IRQn);
|
|
}
|
|
else if (eqei == (EQEI_T *)EQEI1)
|
|
{
|
|
NVIC_DisableIRQ((IRQn_Type)EQEI1_IRQn);
|
|
}
|
|
else if (eqei == (EQEI_T *)EQEI2)
|
|
{
|
|
NVIC_DisableIRQ((IRQn_Type)EQEI2_IRQn);
|
|
}
|
|
else
|
|
{
|
|
NVIC_DisableIRQ((IRQn_Type)EQEI3_IRQn);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enable EQEI interrupt
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @param[in] u32IntSel Interrupt type selection.
|
|
* - \ref EQEI_CTL_DIRIEN_Msk : Direction change interrupt
|
|
* - \ref EQEI_CTL_OVUNIEN_Msk : Counter overflow or underflow interrupt
|
|
* - \ref EQEI_CTL_CMPIEN_Msk : Compare-match interrupt
|
|
* - \ref EQEI_CTL_IDXIEN_Msk : Index detected interrupt
|
|
* @return None
|
|
* @details This function enable EQEI specified interrupt.
|
|
*/
|
|
void EQEI_EnableInt(EQEI_T *eqei, uint32_t u32IntSel)
|
|
{
|
|
/* Enable EQEI specified interrupt */
|
|
EQEI_ENABLE_INT(eqei, u32IntSel);
|
|
|
|
/* Enable NVIC EQEI IRQ */
|
|
if (eqei == (EQEI_T *)EQEI0)
|
|
{
|
|
NVIC_EnableIRQ(EQEI0_IRQn);
|
|
}
|
|
else if (eqei == (EQEI_T *)EQEI1)
|
|
{
|
|
NVIC_EnableIRQ(EQEI1_IRQn);
|
|
}
|
|
else if (eqei == (EQEI_T *)EQEI2)
|
|
{
|
|
NVIC_EnableIRQ(EQEI2_IRQn);
|
|
}
|
|
else
|
|
{
|
|
NVIC_EnableIRQ(EQEI3_IRQn);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Open EQEI in specified mode and enable input
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @param[in] u32Mode EQEI counting mode.
|
|
* - \ref EQEI_CTL_X4_FREE_COUNTING_MODE
|
|
* - \ref EQEI_CTL_X2_FREE_COUNTING_MODE
|
|
* - \ref EQEI_CTL_X4_COMPARE_COUNTING_MODE
|
|
* - \ref EQEI_CTL_X2_COMPARE_COUNTING_MODE
|
|
* - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE1
|
|
* - \ref EQEI_CTL_PHASE_COUNTING_MODE_TYPE2
|
|
* - \ref EQEI_CTL_DIRECTIONAL_COUNTING_MODE
|
|
* @param[in] u32Value The counter maximum value in compare-counting mode.
|
|
* @return None
|
|
* @details This function set EQEI in specified mode and enable input.
|
|
*/
|
|
void EQEI_Open(EQEI_T *eqei, uint32_t u32Mode, uint32_t u32Value)
|
|
{
|
|
/* Set EQEI function configuration */
|
|
/* Set EQEI counting mode */
|
|
/* Enable IDX, QEA and QEB input to EQEI controller */
|
|
eqei->CTL = (eqei->CTL & (~EQEI_CTL_MODE_Msk)) | ((u32Mode) | EQEI_CTL_CHAEN_Msk | EQEI_CTL_CHBEN_Msk | EQEI_CTL_IDXEN_Msk);
|
|
|
|
/* Set EQEI maximum count value in in compare-counting mode */
|
|
eqei->CNTMAX = u32Value;
|
|
}
|
|
|
|
/**
|
|
* @brief Start EQEI function
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @return None
|
|
* @details This function enable EQEI function and start EQEI counting.
|
|
*/
|
|
void EQEI_Start(EQEI_T *eqei)
|
|
{
|
|
/* Enable EQEI controller function */
|
|
eqei->CTL |= EQEI_CTL_QEIEN_Msk;
|
|
}
|
|
|
|
/**
|
|
* @brief Stop EQEI function
|
|
* @param[in] eqei The pointer of the specified EQEI module.
|
|
* @return None
|
|
* @details This function disable EQEI function and stop EQEI counting.
|
|
*/
|
|
void EQEI_Stop(EQEI_T *eqei)
|
|
{
|
|
/* Disable EQEI controller function */
|
|
eqei->CTL &= (~EQEI_CTL_QEIEN_Msk);
|
|
}
|
|
|
|
|
|
/*@}*/ /* end of group EQEI_EXPORTED_FUNCTIONS */
|
|
|
|
/*@}*/ /* end of group EQEI_Driver */
|
|
|
|
/*@}*/ /* end of group Standard_Driver */
|
|
|
|
/*** (C) COPYRIGHT 2021 Nuvoton Technology Corp. ***/
|