948 lines
27 KiB
C
948 lines
27 KiB
C
/**
|
|
* @file HwA_cmp.h
|
|
* @author Flagchip0126
|
|
* @brief FC7xxx CMP driver type definition and API
|
|
* @version 0.1.0
|
|
* @date 2024-01-15
|
|
*
|
|
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
|
|
*
|
|
* @details
|
|
*/
|
|
/* ********************************************************************************
|
|
* Revision History:
|
|
*
|
|
* Version Date Initials CR# Descriptions
|
|
* --------- ---------- ------------ ---------- ---------------
|
|
* 0.1.0 2024-01-15 Flagchip0126 N/A First version for FC7240
|
|
******************************************************************************** */
|
|
|
|
|
|
#ifndef _HWA_CMP_H_
|
|
#define _HWA_CMP_H_
|
|
|
|
#include "device_header.h"
|
|
|
|
/********* Local typedef ************/
|
|
|
|
/**
|
|
* @brief The CMP complete DMA callback function prototype
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @brief The instance index of the CMP mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_MOD_DISABLE = 0U, /*!< CMP function mode is disable */
|
|
CMP_MOD_CONTINUOUS = 1U, /*!< CMP function mode is continuous */
|
|
CMP_MOD_SAMPLE_NONFILTER_EXTCLK = 2U, /*!< CMP function mode is sampled,non-filtered mode 1*/
|
|
CMP_MOD_SAMPLE_NONFILTER_INTCLK = 3U, /*!< CMP function mode is sampled,non-filtered mode 2*/
|
|
CMP_MOD_SAMPLE_FILTER_EXTCLK = 4U, /*!< CMP function mode is sampled,filtered mode 1*/
|
|
CMP_MOD_SAMPLE_FILTER_INTCLK = 5U, /*!< CMP function mode is sampled,filtered mode 2*/
|
|
CMP_MOD_WINDOW = 6U, /*!< CMP function mode is windowed mode */
|
|
CMP_MOD_WINDOW_RESAMPLE = 7U, /*!< CMP function mode is windowed,re-sampled mode */
|
|
CMP_MOD_WINDOW_FILTER = 8U, /*!< CMP function mode is windowed,filtered mode */
|
|
CMP_MOD_CHANNEL_SCAN = 9U /*!< CMP channel scan mode */
|
|
} CMP_ModSelType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP peripheral
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_INSTANCE_0 = 0U, /*!< CMP instance 0 is selected */
|
|
CMP_INSTANCE_1 = 1U /*!< CMP instance 1 is selected */
|
|
} CMP_InstanceType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP DAC enable select
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_DACENABLE_DCR = 0U, /*!< CMP Dac is enabled by DCR[DAC_EN] */
|
|
CMP_DACENABLE_CCR0 = 1U /*!< CMP Dac is enabled by CCR0[EN] */
|
|
} CMP_DacEnableSrcType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP output invert
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_NON_INVERT = 0U, /*!< CMP output do not Invert*/
|
|
CMP_INVERT = 1U /*!< CMP output Invert */
|
|
} CMP_InvertType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP output select
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_FILTEROUT = 0U, /*!< CMP filter output */
|
|
CMP_UNFILTEROUT = 1U /*!< CMP Unfilter output */
|
|
} CMP_OutSelectType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP window level
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_HOLD = 0U, /*!< CMP output hold when window close */
|
|
CMP_USERDEF = 1U /*!< CMP output userdefine when window close */
|
|
} CMP_OutWinLevelType;
|
|
|
|
/**
|
|
* @brief The instance index of the window output under userdefine CMP window level
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_OUTWIN_0 = 0U, /*!< CMP window output is 0 */
|
|
CMP_OUTWIN_1 = 1U /*!< CMP window output is 1 */
|
|
} CMP_OutWinLevel_UserDefType;
|
|
|
|
|
|
/**
|
|
* @brief The instance index of the CMP Event caused window close
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_RISINGEDGE = 0U, /*!< CMP output event RisingEdge causes window close */
|
|
CMP_FALLINGEDGE = 1U, /*!< CMP output event FallingEdge causes window close */
|
|
CMP_BOTHEDGES = 2U, /*!< CMP output event bothEdges causes window close */
|
|
} CMP_EventType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP filter count numbers
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_FILTERCNT_0 = 0U, /*!< CMP filter is bypassed */
|
|
CMP_FILTERCNT_1 = 1U, /*!< CMP filter is 1 consecutive sample */
|
|
CMP_FILTERCNT_2 = 2U, /*!< CMP filter is 2 consecutive sample */
|
|
CMP_FILTERCNT_3 = 3U, /*!< CMP filter is 3 consecutive sample */
|
|
CMP_FILTERCNT_4 = 4U /*!< CMP filter is 4 consecutive sample */
|
|
} CMP_FilterCntType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP hysteresis control
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_HYSTCTRL_0 = 0U, /*!< CMP 0 hysteresis internal */
|
|
CMP_HYSTCTRL_1 = 1U, /*!< CMP 1 hysteresis internal */
|
|
CMP_HYSTCTRL_2 = 2U, /*!< CMP 2 hysteresis internal */
|
|
CMP_HYSTCTRL_3 = 3U /*!< CMP 3 hysteresis internal */
|
|
} CMP_HystCtrlType;
|
|
|
|
/**
|
|
* @brief The fixed CMP port for reference in channel scan mode
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_PORTSEL_MUX_POSITIVE = 0U,
|
|
CMP_PORTSEL_MUX_NEGATIVE = 1U
|
|
} CMP_PortSelType;
|
|
|
|
/**
|
|
* @brief The source of the CMP input
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_INSRCSEL_DAC = 0U, /*!< CMP input source is DAC */
|
|
CMP_INSRCSEL_MUX = 1U /*!< CMP input source is analog 1-8 mux */
|
|
} CMP_INSrcSelType;
|
|
|
|
/**
|
|
* @brief The instance index of the CMP input mux
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_INSEL_MUX_IN0 = 0U, /*!< CMP input mux from IN0(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN1 = 1U, /*!< CMP input mux from IN1(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN2 = 2U, /*!< CMP input mux from IN2(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN3 = 3U, /*!< CMP input mux from IN3(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN4 = 4U, /*!< CMP input mux from IN4(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN5 = 5U, /*!< CMP input mux from IN5(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN6 = 6U, /*!< CMP input mux from IN6(CMP0,CMP1) */
|
|
CMP_INSEL_MUX_IN7 = 7U /*!< CMP input mux from IN7(CMP0,CMP1) */
|
|
} CMP_MuxSelType;
|
|
|
|
/**
|
|
* @brief The instance index of DAC high voltage reference select
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_DACVINREF_H0 = 0U, /*!< CMP DAC high voltage input reference vrefh0 */
|
|
CMP_DACVINREF_H1 = 1U /*!< CMP DAC high voltage input reference vrefh1 */
|
|
} CMP_DacVinRefSelType;
|
|
|
|
/**
|
|
* @brief The instance index of high power mode select
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_LOWSPEEDMOD = 0U, /*!< CMP low speed mode */
|
|
CMP_HIGHSPEEDMOD = 1U /*!< CMP high speed mode */
|
|
} CMP_SpeedModSelType;
|
|
|
|
/**
|
|
* @brief Defines CMP out status
|
|
*/
|
|
typedef enum
|
|
{
|
|
CMP_OUT_FALLING_EDGE = 0U, /*!< CMP out detect falling edge */
|
|
CMP_OUT_RISING_EDGE = 1U, /*!< CMP out detect rising edge */
|
|
CMP_OUT_NONE = 2U /*!< CMP out detect none */
|
|
} CMP_OutStatus;
|
|
|
|
/********* Local inline function ************/
|
|
|
|
/**
|
|
* @brief set CMP enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_Enable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR0;
|
|
pCmp->CCR0 = ((u32RegVal & (~(uint32_t)CMP_CCR0_EN_MASK)) | CMP_CCR0_EN(true));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP disable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_Disable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR0;
|
|
pCmp->CCR0 = ((u32RegVal & (~(uint32_t)CMP_CCR0_EN_MASK)) | CMP_CCR0_EN(false));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP DMA enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_DmaEnable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_DMA_EN_MASK)) | CMP_CCR1_DMA_EN(true));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP DMA disable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_DmaDisable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_DMA_EN_MASK)) | CMP_CCR1_DMA_EN(false));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP mode
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eMod the CMP mode to use
|
|
* @param u8FilterPrd the CMP filter period
|
|
* @param eFilterCnt the CMP filter sample count
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetComparatorMod(CMP_Type *const pCmp, CMP_ModSelType eMod, uint8_t u8FilterPrd, CMP_FilterCntType eFilterCnt)
|
|
{
|
|
switch (eMod)
|
|
{
|
|
case CMP_MOD_DISABLE:
|
|
{
|
|
/* Nothing deal with */
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_CONTINUOUS:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(false) |
|
|
CMP_CCR1_SAMPLE_EN(false);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_SAMPLE_NONFILTER_EXTCLK:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(false) |
|
|
CMP_CCR1_SAMPLE_EN(true) |
|
|
CMP_CCR1_FILT_CNT(0x01);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_SAMPLE_NONFILTER_INTCLK:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(false) |
|
|
CMP_CCR1_SAMPLE_EN(false) |
|
|
CMP_CCR1_FILT_CNT(0x01) |
|
|
CMP_CCR1_FILT_PER(u8FilterPrd);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_SAMPLE_FILTER_EXTCLK:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(false) |
|
|
CMP_CCR1_SAMPLE_EN(true) |
|
|
CMP_CCR1_FILT_CNT(u8FilterPrd);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_SAMPLE_FILTER_INTCLK:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(false) |
|
|
CMP_CCR1_SAMPLE_EN(false) |
|
|
CMP_CCR1_FILT_CNT(eFilterCnt) |
|
|
CMP_CCR1_FILT_PER(u8FilterPrd);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_WINDOW:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(true) |
|
|
CMP_CCR1_SAMPLE_EN(false) |
|
|
CMP_CCR1_FILT_CNT(0x00) |
|
|
CMP_CCR1_FILT_PER(0x00);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_WINDOW_RESAMPLE:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(true) |
|
|
CMP_CCR1_SAMPLE_EN(false) |
|
|
CMP_CCR1_FILT_CNT(0x01) |
|
|
CMP_CCR1_FILT_PER(u8FilterPrd);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_WINDOW_FILTER:
|
|
{
|
|
pCmp->CCR1 |= CMP_CCR1_WIN_EN(true) |
|
|
CMP_CCR1_SAMPLE_EN(false) |
|
|
CMP_CCR1_FILT_CNT(eFilterCnt) |
|
|
CMP_CCR1_FILT_PER(u8FilterPrd);
|
|
}
|
|
break;
|
|
|
|
case CMP_MOD_CHANNEL_SCAN:
|
|
{
|
|
pCmp->CSCR0 |= CMP_CSCR0_CS_EN(true) ;
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief STOP mode enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEnStopMod(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR0;
|
|
pCmp->CCR0 = ((u32RegVal & (~(uint32_t)CMP_CCR0_STOP_EN_MASK)) | CMP_CCR0_STOP_EN(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief set DAC enable selection
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType Dac enable source
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetDacEnableSrc(CMP_Type *const pCmp, CMP_DacEnableSrcType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR0;
|
|
pCmp->CCR0 = ((u32RegVal & (~(uint32_t)CMP_CCR0_DACEN_SEL_MASK)) | CMP_CCR0_DACEN_SEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CPM output invert
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CPM output invert type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCmpOutInvert(CMP_Type *const pCmp, CMP_InvertType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_CMPOUT_INV_MASK)) | CMP_CCR1_CMPOUT_INV(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CPM output filter/unfilter selection
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CPM output filter/unfilter type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCmpOutSel(CMP_Type *const pCmp, CMP_OutSelectType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_CMPOUT_SEL_MASK)) | CMP_CCR1_CMPOUT_SEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set comparator output pin enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEnCmpOutPack(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_CMPOUT_PEN_MASK)) | CMP_CCR1_CMPOUT_PEN(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMPOUT_WIN level, when window is closed
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMPOUT_WIN level type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCmpOutWinLevel(CMP_Type *const pCmp, CMP_OutWinLevelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_CMPOUT_WIN_OWEN_MASK)) | CMP_CCR1_CMPOUT_WIN_OWEN(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMPOUT_WIN level in user-define mode, when window is closed
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType user-define CMPOUT_WIN level type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCmpOutWin(CMP_Type *const pCmp, CMP_OutWinLevel_UserDefType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_CMPOUT_WIN_OW_MASK)) | CMP_CCR1_CMPOUT_WIN_OW(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set invert the WINDOW/SAMPLE signal enable or not
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEnWinSampleInvert(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_WIN_INV_MASK)) | CMP_CCR1_WIN_INV(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief WINDOW signal can or not be closed by CMPO event when window mode
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEnEventCloseWin(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_WIN_CLS_MASK)) | CMP_CCR1_WIN_CLS(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief set which CMPO event causes window close
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMPO event type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEventCloseWin(CMP_Type *const pCmp, CMP_EventType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR1;
|
|
pCmp->CCR1 = ((u32RegVal & (~(uint32_t)CMP_CCR1_EVT_SEL_MASK)) | CMP_CCR1_EVT_SEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP power mode select
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eMod CMP power mode
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetSpeedMod(CMP_Type *const pCmp, CMP_SpeedModSelType eMod)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_HPMD_MASK)) | CMP_CCR2_HPMD(eMod));
|
|
}
|
|
|
|
/**
|
|
* @brief set Comparator hard block hysteresis control
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP hysteresis control type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetHystCtrl(CMP_Type *const pCmp, CMP_HystCtrlType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_HYSTCTR_MASK)) | CMP_CCR2_HYSTCTR(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set Comparator analog confifuration transition bypass
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param Enable The status for Comparator analog confifuration transition bypass
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetAnalogConfTransByp(CMP_Type *const pCmp, bool Enable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR3;
|
|
pCmp->CCR3 = ((u32RegVal & (~(uint32_t)CMP_CCR3_DAC_TRANS_BYP_MASK)) | CMP_CCR3_DAC_TRANS_BYP(Enable));
|
|
}
|
|
|
|
/**
|
|
* @brief set Comparator hard block hysteresis control
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param Count Comparator analog confifuration transition bypass count
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetAnalogConfTransBypCnt(CMP_Type *const pCmp, uint16_t Count)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR3;
|
|
Count = Count & 0x3ff;
|
|
pCmp->CCR3 = ((u32RegVal & (~(uint32_t)CMP_CCR3_DAC_RDY_CNT_MASK)) | CMP_CCR3_DAC_RDY_CNT(Count));
|
|
}
|
|
|
|
/**
|
|
* @brief set which input is selected for the positive mux
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP positive mux type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetPSelMux(CMP_Type *const pCmp, CMP_MuxSelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_PSEL_MASK)) | CMP_CCR2_PSEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set which input is selected for the negative mux
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP negative mux type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetNSelMux(CMP_Type *const pCmp, CMP_MuxSelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_MSEL_MASK)) | CMP_CCR2_MSEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set the input to the positive port of the comparator
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP positive input source type(analog mux,dac)
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetINPSel(CMP_Type *const pCmp, CMP_INSrcSelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_INPSEL_MASK)) | CMP_CCR2_INPSEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set the input to the negative port of the comparator
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP negative input source type(analog mux,dac)
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetINNSel(CMP_Type *const pCmp, CMP_INSrcSelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CCR2;
|
|
pCmp->CCR2 = ((u32RegVal & (~(uint32_t)CMP_CCR2_INMSEL_MASK)) | CMP_CCR2_INMSEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP DAC enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetEnDac(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->DCR;
|
|
pCmp->DCR = ((u32RegVal & (~(uint32_t)CMP_DCR_DAC_EN_MASK)) | CMP_DCR_DAC_EN(bEnable));
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief set DAC reference voltage source
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eType CMP reference voltage source type
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetVinRefSel(CMP_Type *const pCmp, CMP_DacVinRefSelType eType)
|
|
{
|
|
uint32_t u32RegVal = pCmp->DCR;
|
|
pCmp->DCR = ((u32RegVal & (~(uint32_t)CMP_DCR_VRSEL_MASK)) | CMP_DCR_VRSEL(eType));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP Dac output
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param u8Data the Dac data
|
|
* @note output = (VinRef / 256) * (u8Data + 1)
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetDacData(CMP_Type *const pCmp, uint8_t u8Data)
|
|
{
|
|
uint32_t u32RegVal = pCmp->DCR;
|
|
pCmp->DCR = ((u32RegVal & (~(uint32_t)CMP_DCR_DAC_DATA_MASK)) | CMP_DCR_DAC_DATA(u8Data));
|
|
}
|
|
|
|
/**
|
|
* @brief set comparator rising interrupt enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetIntEn_Rising(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
pCmp->IER = ((u32RegVal & (~(uint32_t)CMP_IER_CFR_IE_MASK)) | CMP_IER_CFR_IE(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief get comparator rising interrupt enable status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return comparator rising interrupt status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntEn_Rising(CMP_Type *const pCmp)
|
|
{
|
|
bool RetStatus = false;
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
|
|
RetStatus = (bool)((((u32RegVal & CMP_IER_CFR_IE_MASK) >> CMP_IER_CFR_IE_SHIFT) != 0U) ? true : false);
|
|
return RetStatus;
|
|
}
|
|
|
|
/**
|
|
* @brief set comparator falling interrupt enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetIntEn_Falling(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
pCmp->IER = ((u32RegVal & (~(uint32_t)CMP_IER_CFF_IE_MASK)) | CMP_IER_CFF_IE(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief get comparator falling interrupt enable status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return comparator falling interrupt status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntEn_Falling(CMP_Type *const pCmp)
|
|
{
|
|
bool bRetStatus = false;
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
|
|
bRetStatus = (bool)((((u32RegVal & CMP_IER_CFF_IE_MASK) >> CMP_IER_CFF_IE_SHIFT) != 0U) ? true : false);
|
|
return bRetStatus;
|
|
}
|
|
|
|
/**
|
|
* @brief set comparator channel scan interrupt enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetIntEn_ChannelScan(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
pCmp->IER = ((u32RegVal & (~(uint32_t)CMP_IER_CSF_IE_MASK)) | CMP_IER_CSF_IE(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief get comparator channel scan interrupt enable status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return comparator channel scan interrupt status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntEn_ChannelScan(CMP_Type *const pCmp)
|
|
{
|
|
bool bRetStatus = false;
|
|
uint32_t u32RegVal = pCmp->IER;
|
|
|
|
bRetStatus = (bool)((((u32RegVal & CMP_IER_CSF_IE_MASK) >> CMP_IER_CSF_IE_SHIFT) != 0U) ? true : false);
|
|
return bRetStatus;
|
|
}
|
|
|
|
/**
|
|
* @brief get CMP output rising edge status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return CMP rising edge status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntFlag_Rising(CMP_Type *const pCmp)
|
|
{
|
|
bool bRetStatus = false;
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
|
|
bRetStatus = (bool)((((u32RegVal & CMP_CSR_CFR_MASK) >> CMP_CSR_CFR_SHIFT) != 0U) ? true : false);
|
|
return bRetStatus;
|
|
}
|
|
|
|
/**
|
|
* @brief get CMP output falling edge status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return CMP falling edge status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntFlag_Falling(CMP_Type *const pCmp)
|
|
{
|
|
bool bRetStatus = false;
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
|
|
bRetStatus = (bool)((((u32RegVal & CMP_CSR_CFF_MASK) >> CMP_CSR_CFF_SHIFT) != 0U) ? true : false);
|
|
return bRetStatus;
|
|
}
|
|
|
|
/**
|
|
* @brief get CMP output channel scan status
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return CMP channel scan status
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetIntFlag_ChannelScan(CMP_Type *const pCmp)
|
|
{
|
|
bool bRetStatus = false;
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
|
|
bRetStatus = (bool)((((u32RegVal & CMP_CSR_CSF_MASK) >> CMP_CSR_CSF_SHIFT) != 0U) ? true : false);
|
|
return bRetStatus;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief clear rising interrupt flag
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_ClearIntFlag_Rising(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
pCmp->CSR = ((u32RegVal & (~(uint32_t)CMP_CSR_CFR_MASK)) | CMP_CSR_CFR(true));
|
|
}
|
|
|
|
/**
|
|
* @brief clear falling interrupt flag
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_ClearIntFlag_Falling(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
pCmp->CSR = ((u32RegVal & (~(uint32_t)CMP_CSR_CFF_MASK)) | CMP_CSR_CFF(true));
|
|
}
|
|
|
|
/**
|
|
* @brief clear channel scan interrupt flag
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_ClearIntFlag_ChannelScan(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
pCmp->CSR = ((u32RegVal & (~(uint32_t)CMP_CSR_CSF_MASK)) | CMP_CSR_CSF(true));
|
|
}
|
|
|
|
/**
|
|
* @brief get CMP filtered output
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return CMP filtered output
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetCmpOut(CMP_Type *const pCmp)
|
|
{
|
|
bool CmpOut;
|
|
uint32_t u32RegVal = pCmp->CSR;
|
|
CmpOut = ((u32RegVal & CMP_CSR_CMPOUT_FILTER_MASK) >> CMP_CSR_CMPOUT_FILTER_SHIFT) ? true : false;
|
|
return CmpOut;
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP and DAC initialization delay modulus
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSInitModulus(CMP_Type *const pCmp, uint8_t u8Modulus)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR0;
|
|
pCmp->CSCR0 = ((u32RegVal & (~(uint32_t)CMP_CSCR0_CS_INITMOD_MASK)) | CMP_CSCR0_CS_INITMOD(u8Modulus));
|
|
}
|
|
|
|
/**
|
|
* @brief set number of clock cycles for sampling
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param u8Nsam the sampling clocks value
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSNumOfSampleClocks(CMP_Type *const pCmp, uint8_t u8Nsam)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR0;
|
|
pCmp->CSCR0 = ((u32RegVal & (~(uint32_t)CMP_CSCR0_CS_NSAM_MASK)) | CMP_CSCR0_CS_NSAM(u8Nsam));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP channel scan enable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_CSEnable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR0;
|
|
pCmp->CSCR0 = ((u32RegVal & (~(uint32_t)CMP_CSCR0_CS_EN_MASK)) | CMP_CSCR0_CS_EN(true));
|
|
}
|
|
|
|
/**
|
|
* @brief set CMP channel scan disable
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_CSDisable(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR0;
|
|
pCmp->CSCR0 = ((u32RegVal & (~(uint32_t)CMP_CSCR0_CS_EN_MASK)) | CMP_CSCR0_CS_EN(false));
|
|
}
|
|
|
|
/**
|
|
* @brief set channel scan fixed channel
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the fixed channel
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSFixedChannel(CMP_Type *const pCmp, CMP_MuxSelType eChannel)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR1;
|
|
pCmp->CSCR1 = ((u32RegVal & (~(uint32_t)CMP_CSCR1_FIXCH_MASK)) | CMP_CSCR1_FIXCH(eChannel));
|
|
}
|
|
|
|
/**
|
|
* @brief set channel scan fixed port
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param ePort the fixed port
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSFixedPort(CMP_Type *const pCmp, CMP_PortSelType ePort)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR1;
|
|
pCmp->CSCR1 = ((u32RegVal & (~(uint32_t)CMP_CSCR1_FIXP_MASK)) | CMP_CSCR1_FIXP(ePort));
|
|
}
|
|
|
|
/**
|
|
* @brief set channel scan channel enabled
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the enabled channel
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSChannelEn(CMP_Type *const pCmp, CMP_MuxSelType eChannel, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCR1;
|
|
pCmp->CSCR1 = ((u32RegVal & (~(uint32_t)(1 << eChannel))) | (((uint32_t)bEnable) << eChannel));
|
|
}
|
|
|
|
/**
|
|
* @brief set channel scan channel enabled
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the enabled channel
|
|
* @param bPresetstate preset state for channel
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSChannelPresetstate(CMP_Type *const pCmp, CMP_MuxSelType eChannel, bool bPresetstate)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCSR;
|
|
pCmp->CSCSR = ((u32RegVal & (~(uint32_t)(1 << eChannel))) | (((uint32_t)bPresetstate) << eChannel));
|
|
}
|
|
|
|
/**
|
|
* @brief get channel scan channel current state
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the channel that want to get state
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetCSChannelsOut(CMP_Type *const pCmp, CMP_MuxSelType eChannel)
|
|
{
|
|
bool OutFlag;
|
|
uint32_t u32RegVal = pCmp->CSCSR;
|
|
OutFlag = (bool)((u32RegVal & ((uint32_t)(1 << eChannel))) >> eChannel);
|
|
|
|
return OutFlag;
|
|
}
|
|
|
|
/**
|
|
* @brief software clear channel scan comparison results
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_ClearCSComparisonResults(CMP_Type *const pCmp)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCSR;
|
|
pCmp->CSCSR = ((u32RegVal & (~(uint32_t)CMP_CSCSR_CS_SWCLR_MASK)) | CMP_CSCSR_CS_SWCLR(true));
|
|
}
|
|
|
|
/**
|
|
* @brief software clear channel scan comparison results
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param bEnable enable/disable flag
|
|
*/
|
|
LOCAL_INLINE void CMP_HWA_SetCSComparisonResultsAutoClearEn(CMP_Type *const pCmp, bool bEnable)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCSR;
|
|
pCmp->CSCSR = ((u32RegVal & (~(uint32_t)CMP_CSCSR_CS_ACLR_MASK)) | CMP_CSCSR_CS_ACLR(bEnable));
|
|
}
|
|
|
|
/**
|
|
* @brief get channel scan comparison reuslt
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the enabled channel
|
|
* @return channel comparison result for a given channel
|
|
*/
|
|
LOCAL_INLINE uint32_t CMP_HWA_GetCSComparisonResult(CMP_Type *const pCmp, CMP_MuxSelType eChannel)
|
|
{
|
|
uint32_t u32RegVal = pCmp->CSCSR;
|
|
u32RegVal = (u32RegVal & (1 << eChannel)) >> eChannel;
|
|
return u32RegVal;
|
|
}
|
|
|
|
/**
|
|
* @brief set channel scan active
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @return status cmp channel whether is active
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetCSActive(CMP_Type *const pCmp)
|
|
{
|
|
bool status;
|
|
uint32_t u32RegVal = pCmp->CSSR;
|
|
status = ((u32RegVal & ((uint32_t)CMP_CSSR_CS_ACTIVE_MASK)) >> CMP_CSSR_CS_ACTIVE_SHIFT) ? true : false;
|
|
return status;
|
|
}
|
|
|
|
/**
|
|
* @brief get channel scan comparison result changed flag
|
|
*
|
|
* @param pCmp the CMP instance to use
|
|
* @param eChannel the channel to get comparison result changed flag
|
|
* @return the comparison result changed flag for a given channel
|
|
*/
|
|
LOCAL_INLINE bool CMP_HWA_GetCSComparisonResultFlag(CMP_Type *const pCmp, CMP_MuxSelType eChannel)
|
|
{
|
|
bool flag;
|
|
uint32_t u32RegVal = pCmp->CSSR;
|
|
flag = ((u32RegVal & (1 << eChannel)) >> eChannel) ? true : false;
|
|
return flag;
|
|
}
|
|
|
|
#endif /* #ifndef _HWA_CMP_H_ */
|