/** * @file HwA_adc.h * @author Flagchip0126 * @brief Hardware access layer for ADC * @version 0.1.0 * @date 2024-01-15 * * @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd. * */ /* ******************************************************************************** * Revision History: * * Version Date Initials CR# Descriptions * --------- ---------- ------------ ---------- --------------- * 0.1.0 2024-01-15 Flagchip0126 N/A First version for FC7240 ******************************************************************************** */ #ifndef _HWA_ADC_H_ #define _HWA_ADC_H_ #include "device_header.h" /** * @defgroup HwA_adc * @ingroup fc7xxx_driver_adc * @{ */ /** * @brief Select the ADC Resolution * */ typedef enum { ADC_RESOLUTION_12_BIT = 0U, /*!< 12 bit resolution */ ADC_RESOLUTION_10_BIT = 1U, /*!< 10 bit resolution */ ADC_RESOLUTION_8_BIT = 2U /*!< 8 bit resolution */ } ADC_ResolutionType; /** * @brief Select the ADC result alignment * */ typedef enum { ADC_ALIGN_RIGHT = 0U, /*!< ADC result is aligned in right */ ADC_ALIGN_LEFT = 1U /*!< ADC result is aligned in left */ } ADC_AlignType; /** * @brief Select the ADC trigger mode * * @note This option is only valid in ADC single sequence mode and ADC continuous mode. * In ADC discontinuous mode, the ADC trigger mode is fixed as ADC_TRIGMODE_RISING_EDGE * */ typedef enum { ADC_TRIGMODE_SW = 0U, /*!< ADC is triggered by software */ ADC_TRIGMODE_RISING_EDGE = 1U, /*!< ADC is triggered by hardware trigger on rising edge */ ADC_TRIGMODE_FALLING_EDGE = 2U, /*!< ADC is triggered by hardware trigger on falling edge */ ADC_TRIGMODE_BOTH_EDGE = 3U, /*!< ADC is triggered by hardware trigger on both edges */ ADC_TRIGMODE_HIGH_VOLTAGE = 4U, /*!< ADC is triggered when hardware trigger is high voltage */ ADC_TRIGMODE_LOW_VOLTAGE = 5U /*!< ADC is triggered when hardware trigger is low voltage */ } ADC_TrigModeType; /** * @brief Select the ADC sequence mode * */ typedef enum { ADC_SEQMODE_SINGLE = 0U, /*!< ADC single sequence mode */ ADC_SEQMODE_CONTINUOUS = 1U, /*!< ADC continuous mode */ ADC_SEQMODE_DISCONTINUOUS_0 = 2U, /*!< ADC discontinuous 0 mode */ ADC_SEQMODE_DISCONTINUOUS_1 = 3U /*!< ADC discontinuous 1 mode */ } ADC_SeqModeType; /** * @brief Select the ADC overrun management mode * * To select whether the old data are preserved or overwritten by the new data when ADC * is overrun (The FIFO is full when new convertion result comes) * */ typedef enum { ADC_OVERRUN_MODE_PRESERVE = 0U, /*!< old data are preserved when ADC is overrun */ ADC_OVERRUN_MODE_OVERWRITE = 1U /*!< old data are overwritten when ADC is overrun */ } ADC_OvrModeType; /** * @brief Select the ADC voltage reference source * */ typedef enum { ADC_REF_INTERNAL = 0U, /*!< select the internal voltage reference */ ADC_REF_EXTERNAL = 1U /*!< select the external voltage reference */ } ADC_RefType; /** * @brief Select the priority of Trigger Latch Unit * */ typedef enum { TRG_LATCH_UNIT_PRI_ROUND_ROBIN = 0U, /*!< select the round robin scheduling priority */ TRG_LATCH_UNIT_PRI_FIX = 1U /*!< select the fixed priority(0>1>2>3) */ } ADC_TrgLatchUnitPri; /** * @brief Select the ADC hardware average samples * */ typedef enum { ADC_AVERAGE_4 = 0U, /*!< result average by 4 samples */ ADC_AVERAGE_8 = 1U, /*!< result average by 8 samples */ ADC_AVERAGE_16 = 2U, /*!< result average by 16 samples */ ADC_AVERAGE_32 = 3U /*!< result average by 32 samples */ } ADC_AverageType; /** * @brief Set the ADC clock divider * * @note ADC clock divider is not available in FC4150F512K * */ typedef enum { ADC_CLOCK_DIV_1 = 0U, ADC_CLOCK_DIV_2 = 1U, ADC_CLOCK_DIV_4 = 2U, ADC_CLOCK_DIV_8 = 3U } ADC_ClockDivideType; /** * @brief The trigger source of the ADC instance * * @note In ADC discontinuous 1 mode, the trigger source is from Ptimer * In ADC single and continuous mode, if hardware trigger is enabled, the trigger * source is from TRGSEL * */ typedef enum { ADC_TRIGSRC_PTIMER = 0U, /* Trigger source from PTIMER/TRGSEL with Ptimer */ ADC_TRIGSRC_TRGSEL = 2U, /* Trigger source from TRGSEL */ ADC_TRIGSRC_TRIG_LATCH_UNIT = 3U /* Trigger source from LATCH UNIT */ } ADC_TrigSrcType; /** * @brief Select the channel compare mode * * Select whether the channel compare is enabled on all channels or on the single * selected channel * */ typedef enum { ADC_CMP_CHANNEL_ALL = 0U, /*!< Compare enabled in all channels */ ADC_CMP_CHANNEL_SINGLE = 1U /*!< Compare enabled in the specified channel */ } ADC_CmpChannelType; /** * @brief Check whether the conversion result is in the comparing range * * @param pAdc the base address of the ADC instance * @return true the conversion result is in the comparing range * @return false the conversion result is not in the comparing range */ LOCAL_INLINE bool ADC_HWA_GetCompareFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_ACMP_MASK) >> ADC_INT_STATUS_ACMP_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the compare flag * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearCompareFlag(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_ACMP(1U); } /** * @brief Get the overrrun status of the ADC instance * * @param pAdc the base address of the ADC instance * @return true the ADC is in overrun status * @return false the ADC is not overrun */ LOCAL_INLINE bool ADC_HWA_GetOverRun(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_OVR_MASK) >> ADC_INT_STATUS_OVR_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the overrun flag of the ADC instance * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearOverRun(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_OVR(1U); } /** * @brief Check whether the ADC conversion sequence is finished * * @param pAdc the base address of the ADC instance * @return true the ADC conversion sequence is finished * @return false the ADC conversion sequence is unfinished */ LOCAL_INLINE bool ADC_HWA_GetEndOfSequence(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_EOSEQ_MASK) >> ADC_INT_STATUS_EOSEQ_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the ADC conversion sequence complete flag * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearEndOfSequence(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_EOSEQ(1U); } /** * @brief Check whether the current ADC conversion is finished * * @param pAdc the base address of the ADC instance * @return true the current ADC conversion is finished * @return false the current ADC conversion is unfinished */ LOCAL_INLINE bool ADC_HWA_GetEndOfConversion(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_EOC_MASK) >> ADC_INT_STATUS_EOC_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the ADC single conversion complete flag * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearEndOfConversion(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_EOC(1U); } /** * @brief Check whether the sampling phase of the current ADC conversion is finished * * @param pAdc the base address of the ADC instance * @return true the sampling phase of the ADC conversion is finished * @return false the sampling phase of the ADC conversion is unfinished */ LOCAL_INLINE bool ADC_HWA_GetEndOfSample(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_EOSMP_MASK) >> ADC_INT_STATUS_EOSMP_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the ADC sampling complete flag * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearEndOfSample(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_EOSMP(1U); } /** * @brief Check whether the data quantity in the FIFO is greater than watermark * * @param pAdc the base address of the ADC instance * @return true the ADC FIFO is ready * @return false the ADC FIFO is unready */ LOCAL_INLINE bool ADC_HWA_GetFIFOReady(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_FIFO_RDY_MASK) >> ADC_INT_STATUS_FIFO_RDY_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the FIFO ready flag * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearFIFOReady(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_FIFO_RDY(1U); } /** * @brief Check whether the ADC FIFO is full * * @param pAdc the base address of the ADC instance * @return true the ADC FIFO is full * @return false the ADC FIFO is not full */ LOCAL_INLINE bool ADC_HWA_GetFull(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_FULL_MASK) >> ADC_INT_STATUS_FULL_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Check whether the ADC FIFO is empty * * @param pAdc the base address of the ADC instance * @return true the ADC FIFO is empty * @return false the ADC FIFO is not empty */ LOCAL_INLINE bool ADC_HWA_GetEmpty(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_EMPTY_MASK) >> ADC_INT_STATUS_EMPTY_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Check whether the ADC instance is ready to operate * * @param pAdc the base address of the ADC instance * @return true the ADC instance is ready for a new conversion * @return false the ADC instance is unready */ LOCAL_INLINE bool ADC_HWA_GetReady(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->INT_STATUS; u32TmpVal = (u32TmpVal & ADC_INT_STATUS_ADRDY_MASK) >> ADC_INT_STATUS_ADRDY_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Clear the ready flag of the ADC instance * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearReady(ADC_Type *const pAdc) { pAdc->INT_STATUS = ADC_INT_STATUS_ADRDY(1U); } /** * @brief Get the FIFO Ready interrupt flag * If enabled, ADC interrupt is generated when the FIFO water mark is greater than FWMARK * @param pAdc the base address of the ADC instance * @return true ADC FIFO Ready interrupt is enabled * @return false ADC FIFO Ready interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetFIFOReadyInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_FIFO_RDY_IE_MASK) >> ADC_INT_ENABLE_FIFO_RDY_IE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the FIFO Ready interrupt flag * If enabled, ADC interrupt is generated when the FIFO water mark is greater than FWMARK * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the ADC FIFO Ready interrupt */ LOCAL_INLINE void ADC_HWA_SetFIFOReadyInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_FIFO_RDY_IE_MASK) | ADC_INT_ENABLE_FIFO_RDY_IE(bEnable); } /** * @brief Get the Compare interrupt flag * If enabled, ADC interrupt is generated when the ADC conversion result is not within the compare threshold * @param pAdc the base address of the ADC instance * @return true ADC Compare interrupt is enabled * @return false ADC Compare interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetCompareInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_ACMP_IE_MASK) >> ADC_INT_ENABLE_ACMP_IE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the Compare interrupt flag * If enabled, ADC interrupt is generated when the ADC conversion result is not within the compare threshold * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the ADC Compare interrupt */ LOCAL_INLINE void ADC_HWA_SetCompareInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_ACMP_IE_MASK) | ADC_INT_ENABLE_ACMP_IE(bEnable); } /** * @brief Get the Overrun interrupt flag * If enabled, ADC interrupt is generated when the ADC instance is overrun * @param pAdc the base address of the ADC instance * @return true ADC Overrun interrupt is enabled * @return false ADC Overrun interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetOverrunInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_OVRIE_MASK) >> ADC_INT_ENABLE_OVRIE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the Overrun interrupt flag * If enabled, ADC interrupt is generated when the ADC instance is overrun * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the ADC Overrun interrupt */ LOCAL_INLINE void ADC_HWA_SetOverrunInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_OVRIE_MASK) | ADC_INT_ENABLE_OVRIE(bEnable); } /** * @brief Get the End of Sequence interrupt enable flag * If enabled, ADC interrupt is generated when the ADC sequence conversion is completed * @param pAdc the base address of the ADC instance * @return true ADC End of Sequence interrupt is enabled * @return false ADC End of Sequence interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetEndOfSequenceInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_EOSEQIE_MASK) >> ADC_INT_ENABLE_EOSEQIE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the End of Sequence interrupt enable flag * If enabled, ADC interrupt is generated when the ADC sequence conversion is completed * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the ADC End of Sequence interrupt */ LOCAL_INLINE void ADC_HWA_SetEndOfSequenceInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_EOSEQIE_MASK) | ADC_INT_ENABLE_EOSEQIE(bEnable); } /** * @brief Get the conversion complete interrupt enable flag * If enabled, ADC interrupt is generated when each ADC conversion is completed * @param pAdc the base address of the ADC instance * @return true the ADC End of Conversion interrupt is enabled * @return false the ADC End of Conversion interrupt is disabled */ LOCAL_INLINE bool ADC_HWAGetEndOfConversionInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_EOCIE_MASK) >> ADC_INT_ENABLE_EOCIE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the conversion complete interrupt enable flag * If enabled, ADC interrupt is generated when each ADC conversion is completed * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the conversion complete interrupt */ LOCAL_INLINE void ADC_HWA_SetEndOfConversionInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_EOCIE_MASK) | ADC_INT_ENABLE_EOCIE(bEnable); } /** * @brief Get the sample complete interrupt enable flag * If enabled, ADC interrupt is generated when each ADC conversion finished the sampling phase * @param pAdc the base address of the ADC instance * @return true the sample complete interrupt is enabled * @return false the sample complete interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetEndOfSampleInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_EOSMPIE_MASK) >> ADC_INT_ENABLE_EOSMPIE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the sample complete interrupt enable flag * If enabled, ADC interrupt is generated when each ADC conversion finished the sampling phase * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the sample complete interrupt */ LOCAL_INLINE void ADC_HWA_SetEndOfSampleInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_EOSMPIE_MASK) | ADC_INT_ENABLE_EOSMPIE(bEnable); } /** * @brief Get the ADC ready interrupt enable flag * If enabled, ADC interrupt is generated when the ADC module is ready for conversion * @param pAdc the base address of the ADC instance * @return true the ADC ready interrupt is enabled * @return false the ADC ready interrupt is disabled */ LOCAL_INLINE bool ADC_HWA_GetADCReadyInterruptFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->INT_ENABLE & ADC_INT_ENABLE_ADRDYIE_MASK) >> ADC_INT_ENABLE_ADRDYIE_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the ADC ready interrupt enable flag * If enabled, ADC interrupt is generated when the ADC module is ready for conversion * @param pAdc the base address of the ADC instance * @param bEnable Whether to enable the ADC ready interrupt */ LOCAL_INLINE void ADC_HWA_SetADCReadyInterruptFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->INT_ENABLE = (pAdc->INT_ENABLE & ~ADC_INT_ENABLE_ADRDYIE_MASK) | ADC_INT_ENABLE_ADRDYIE(bEnable); } /** * @brief Get the interrupt enable config * * @param pAdc the base address of the ADC instance * @return uint32_t the interrupt enable config */ LOCAL_INLINE uint32_t ADC_HWA_GetInterruptEnable(const ADC_Type *const pAdc) { return pAdc->INT_ENABLE; } /** * @brief Set the interrupt enable * * @param u32InterruptCfg the interrupt enable config */ LOCAL_INLINE void ADC_HWA_SetInterruptEnable(ADC_Type *const pAdc, uint32_t u32InterruptCfg) { pAdc->INT_ENABLE = u32InterruptCfg; } /** * @brief Reset the ADC hardware * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_Reset(ADC_Type *const pAdc) { pAdc->CONTROL = ADC_CONTROL_ADRST(1U); pAdc->CONTROL = 0U; } /** * @brief Get the enable status of the ADC instance * * @param pAdc the base address of the ADC instance * @return true the ADC instance is enabled * @return false the ADC instance has not been enabled */ LOCAL_INLINE bool ADC_HWA_GetEnable(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CONTROL; u32TmpVal = (u32TmpVal & ADC_CONTROL_ADEN_MASK) >> ADC_CONTROL_ADEN_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Enable the ADC instance * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_Enable(ADC_Type *const pAdc) { pAdc->CONTROL = ADC_CONTROL_ADEN(1U); } /** * @brief Get whether the ADC instance is in disable status * * @param pAdc the base address of the ADC instance * @return true the ADC instance is in disable status * @return false the ADC instance is not in disable status */ LOCAL_INLINE bool ADC_HWA_GetDisable(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CONTROL; u32TmpVal = (u32TmpVal & ADC_CONTROL_ADDIS_MASK) >> ADC_CONTROL_ADDIS_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Disable the ADC instance * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_Disable(ADC_Type *const pAdc) { pAdc->CONTROL = ADC_CONTROL_ADDIS(1U); } /** * @brief Get the conversion start status of the ADC instance * * @param pAdc the base address of the ADC instance * @return true the conversion of the ADC instance is started * @return false the conversion of the ADC instance has not been started */ LOCAL_INLINE bool ADC_HWA_GetStart(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CONTROL; u32TmpVal = (u32TmpVal & ADC_CONTROL_ADSTART_MASK) >> ADC_CONTROL_ADSTART_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Start the ADC conversion * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_Start(ADC_Type *const pAdc) { pAdc->CONTROL = ADC_CONTROL_ADSTART(1U); } /** * @brief Get whether ADC is in stopping status * * @param pAdc the base address of the ADC instance * @return true the ADC instance is stopping * @return false the ADC instance is not in stopping status */ LOCAL_INLINE bool ADC_HWA_GetStop(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CONTROL; u32TmpVal = (u32TmpVal & ADC_CONTROL_ADSTP_MASK) >> ADC_CONTROL_ADSTP_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Stop the ADC conversion * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_Stop(ADC_Type *const pAdc) { pAdc->CONTROL = ADC_CONTROL_ADSTP(1U); } /** * @brief Get the overrun management mode * * @param pAdc the base address of the ADC instance * @return ADC_OVERRUN_MODE_PRESERVE the conversion data is preserved when ADC is overrun * @return ADC_OVERRUN_MODE_OVERWRITE the conversion data is overwritten when ADC is overrun */ LOCAL_INLINE ADC_OvrModeType ADC_HWA_GetOverrunManagementMode(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_OVRMOD_MASK) >> ADC_CFG1_OVRMOD_SHIFT; return (ADC_OvrModeType)u32TmpVal; } /** * @brief Set the overrun management mode * * @param pAdc the base address of the ADC instance * @param eOvrMode the overrun management for the ADC instance */ LOCAL_INLINE void ADC_HWA_SetOverrunManagementMode(ADC_Type *const pAdc, ADC_OvrModeType eOvrMode) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_OVRMOD_MASK) | ADC_CFG1_OVRMOD(eOvrMode); } /** * @brief Get the sequence group mode state * * @param pAdc the base address of the ADC instance * @return the sequence group mode state */ LOCAL_INLINE bool ADC_HWA_GetSeqGpEn(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_SEQGP_EN_MASK) >> ADC_CFG1_SEQ_LEN_SHIFT; return u32TmpVal ? true : false; } /** * @brief Set the sequence group mode state * * @param pAdc the base address of the ADC instance * @param the sequence group mode state */ LOCAL_INLINE void ADC_HWA_SetSeqGpEn(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_SEQGP_EN_MASK) | ADC_CFG1_SEQGP_EN(bEnable); } /** * @brief Get the sequence length of the ADC conversion sequence * * @param pAdc the base address of the ADC instance * @return uint8_t the sequence length of the ADC conversion sequence */ LOCAL_INLINE uint8_t ADC_HWA_GetSequenceLength(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG1; u32TmpVal = (u32TmpVal & ADC_CFG1_SEQ_LEN_MASK) >> ADC_CFG1_SEQ_LEN_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the sequence length of the ADC conversion sequence * * @param pAdc the base address of the ADC instance * @param u8SequenceLength the sequence length of the ADC conversion sequence */ LOCAL_INLINE void ADC_HWA_SetSequenceLength(ADC_Type *const pAdc, uint8_t u8SequenceLength) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_SEQ_LEN_MASK) | ADC_CFG1_SEQ_LEN(u8SequenceLength); } /** * @brief Get the ADC sequence mode * * @param pAdc the base address of the ADC instance * @return ADC_SeqModeType the sequence mode the the ADC instance */ LOCAL_INLINE ADC_SeqModeType ADC_HWA_GetSequenceMode(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG1; u32TmpVal = (u32TmpVal & ADC_CFG1_SEQ_MOD_MASK) >> ADC_CFG1_SEQ_MOD_SHIFT; return (ADC_SeqModeType)u32TmpVal; } /** * @brief Set the ADC sequence mode * * @param pAdc the base address of the ADC instance * @param eSequenceMode the sequence mode the the ADC instance */ LOCAL_INLINE void ADC_HWA_SetSequenceMode(ADC_Type *const pAdc, ADC_SeqModeType eSequenceMode) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_SEQ_MOD_MASK) | ADC_CFG1_SEQ_MOD(eSequenceMode); } /** * @brief Get whether auto disable is enabled * * @note Auto disable mode is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @return true auto disable mode is enabled * @return false auto disable mode is disabled */ LOCAL_INLINE bool ADC_HWA_GetAutoDisableModeEnableFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG1; u32TmpVal = (u32TmpVal & ADC_CFG1_AUTO_DIS_MASK) >> ADC_CFG1_AUTO_DIS_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set whether to enable auto disable mode * * @note Auto disable mode is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @param bEnable whether to enable auto disable mode */ LOCAL_INLINE void ADC_HWA_SetAutoDisableModeEnableFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_AUTO_DIS_MASK) | ADC_CFG1_AUTO_DIS(bEnable); } /** * @brief Get whether the wait conversion mode is enabled * * @param pAdc the base address of the ADC instance * @return true the wait conversion mode is enabled * @return false the wait conversion mode is disabled */ LOCAL_INLINE bool ADC_HWA_GetWaitConversionModeFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_WAIT_MASK) >> ADC_CFG1_WAIT_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set the wait conversion mode * * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the wait conversion mode */ LOCAL_INLINE void ADC_HWA_SetWaitConversionModeFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_WAIT_MASK) | ADC_CFG1_WAIT(bEnable); } /** * @brief Get the trigger source the the ADC instance * * @param pAdc the base address of the ADC instance * @return ADC_TrigSrcType the trigger source of the ADC instance */ LOCAL_INLINE ADC_TrigSrcType ADC_HWA_GetTriggerSource(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG1; u32TmpVal = (u32TmpVal & ADC_CFG1_TRIGSRC_MASK) >> ADC_CFG1_TRIGSRC_SHIFT; return (ADC_TrigSrcType)u32TmpVal; } /** * @brief Set the trigger source the the ADC instance * * @param pAdc the base address of the ADC instance * @param eTriggerSource the trigger source of the ADC instance */ LOCAL_INLINE void ADC_HWA_SetTriggerSource(ADC_Type *const pAdc, ADC_TrigSrcType eTriggerSource) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_TRIGSRC_MASK) | ADC_CFG1_TRIGSRC(eTriggerSource); } /** * @brief Get the trigger mode of the ADC instance * * @param pAdc the base address of the ADC instance * @return ADC_TrigModeType the trigger mode if the ADC instance */ LOCAL_INLINE ADC_TrigModeType ADC_HWA_GetTriggerMode(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG1; u32TmpVal = (u32TmpVal & ADC_CFG1_TRIGMODE_MASK) >> ADC_CFG1_TRIGMODE_SHIFT; return (ADC_TrigModeType)u32TmpVal; } /** * @brief Set the trigger mode of the ADC instance * * @param pAdc the base address of the ADC instance * @param eTriggerMode the trigger mode if the ADC instance */ LOCAL_INLINE void ADC_HWA_SetTriggerMode(ADC_Type *const pAdc, ADC_TrigModeType eTriggerMode) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_TRIGMODE_MASK) | ADC_CFG1_TRIGMODE(eTriggerMode); } /** * @brief Get the data align mode * * @param pAdc the base address of the ADC instance * @return ADC_ALIGN_RIGHT the conversion data is aligned right * @return ADC_ALIGN_LEFT the conversion is aligned left */ LOCAL_INLINE ADC_AlignType ADC_HWA_GetDataAlignment(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_ALIGN_MASK) >> ADC_CFG1_ALIGN_SHIFT; return (ADC_AlignType)u32TmpVal; } /** * @brief Set the data align mode * * @param pAdc the base address of the ADC instance * @param eAlign the data align mode */ LOCAL_INLINE void ADC_HWA_SetDataAlignment(ADC_Type *const pAdc, ADC_AlignType eAlign) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_ALIGN_MASK) | ADC_CFG1_ALIGN(eAlign); } /** * @brief Get the ADC resolution of the ADC instance * * @param pAdc the base address of the ADC instance * @return ADC_ResolutionType the resolution of the ADC instance */ LOCAL_INLINE ADC_ResolutionType ADC_HWA_GetDataResolution(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_RES_MASK) >> ADC_CFG1_RES_SHIFT; return (ADC_ResolutionType)u32TmpVal; } /** * @brief Set the resolution of the ADC instance * * @param pAdc the base address of the ADC instance * @param eResolution the resolution of the ADC instance */ LOCAL_INLINE void ADC_HWA_SetDataResolution(ADC_Type *const pAdc, ADC_ResolutionType eResolution) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_RES_MASK) | ADC_CFG1_RES(eResolution); } /** * @brief Get whether DMA for the ADC instance is enabled * * @param pAdc the base address of the ADC instance * @return true DMA is enabled for the ADC instance * @return false DMA is disabled for the ADC instance */ LOCAL_INLINE bool ADC_HWA_GetDMAEnableFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG1 & ADC_CFG1_DMAEN_MASK) >> ADC_CFG1_DMAEN_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Enable or disable the DMA for the ADC instance * * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the DMA for the ADC instance */ LOCAL_INLINE void ADC_HWA_SetDMAEnableFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG1 = (pAdc->CFG1 & ~ADC_CFG1_DMAEN_MASK) | ADC_CFG1_DMAEN(bEnable); } /** * @brief Get the ADC_CFG1 config * * @param pAdc the base address of the ADC instance * @return uint32_t the ADC_CFG1 config */ LOCAL_INLINE uint32_t ADC_HWA_GetConfig1(const ADC_Type *const pAdc) { return pAdc->CFG1; } /** * @brief Set the ADC_CFG1 config * * @param pAdc the base address of the ADC instance * @param u32Config the ADC_CFG1 config */ LOCAL_INLINE void ADC_HWA_SetConfig1(ADC_Type *const pAdc, uint32_t u32Config) { pAdc->CFG1 = u32Config; } /** * @brief Get the FIFO water mark settings for the ADC instance * * @param pAdc the base address of the ADC instance * @return uint8_t the ADC FIFO water mark setting */ LOCAL_INLINE uint8_t ADC_HWA_GetFIFOWaterMark(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_FWMARK_MASK) >> ADC_CFG2_FWMARK_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the FIFO water mark for the ADC instance * * @param pAdc the base address of the ADC instance * @param u8WaterMark the ADC FIFO water mark setting */ LOCAL_INLINE void ADC_HWA_SetFIFOWaterMark(ADC_Type *const pAdc, uint8_t u8WaterMark) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_FWMARK_MASK) | ADC_CFG2_FWMARK(u8WaterMark); } /** * @brief Get the priority of Trigger Latch * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE uint8_t ADC_HWA_GetTriggerLatchUnitPriority(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_TRG_PRI_MASK) >> ADC_CFG2_TRG_PRI_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the priority of Trigger Latch * * @param pAdc the base address of the ADC instance * @param eTrgLatchUnitPri the priority of Trigger Latch Unit setting */ LOCAL_INLINE void ADC_HWA_SetTriggerLatchUnitPriority(ADC_Type *const pAdc, ADC_TrgLatchUnitPri eTrgLatchUnitPri) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_TRG_CLR_MASK) | ADC_CFG2_TRG_CLR(eTrgLatchUnitPri); } /** * @brief Clear Latch Trigger in Trigger Latch Unit * * @param pAdc the base address of the ADC instance */ LOCAL_INLINE void ADC_HWA_ClearLatchTrigger(ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->CFG2; pAdc->CFG2 = u32TmpVal | ADC_CFG2_TRG_CLR(1); } /** * @brief Get whether hardware average is enabled * * @param pAdc the base address of the ADC instance * @return true hardware average is enabled * @return false hardware average is disabled */ LOCAL_INLINE bool ADC_HWA_GetAverageEnableFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_AVG_EN_MASK) >> ADC_CFG2_AVG_EN_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Enable or disable hardware average for the ADC instance * * @param pAdc the base address of the ADC instance * @param bEnable whether to enable the ADC hardware average */ LOCAL_INLINE void ADC_HWA_SetAverageEnableFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_AVG_EN_MASK) | ADC_CFG2_AVG_EN(bEnable); } /** * @brief Get the hardware average number * * @param pAdc the base address of the ADC instance * @return ADC_AverageType the hardware average number */ LOCAL_INLINE ADC_AverageType ADC_HWA_GetAverageNumber(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_AVG_LEN_MASK) >> ADC_CFG2_AVG_LEN_SHIFT; return (ADC_AverageType)u32TmpVal; } /** * @brief Set the hardware average number * * @param pAdc the base address of the ADC instance * @param eAverageNumber the hardware average number to set */ LOCAL_INLINE void ADC_HWA_SetAverageNumber(ADC_Type *const pAdc, ADC_AverageType eAverageNumber) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_AVG_LEN_MASK) | ADC_CFG2_AVG_LEN(eAverageNumber); } /** * @brief Whether clock gating is acknowledged * * @note This feature is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @return true ADC clock source is off after setting Clock Gating Enable Flag * @return false ADC clock source is on after clearing Clock Gating Enable Flag */ LOCAL_INLINE bool ADC_HWA_GetClockGatingAck(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_CG_ACK_MASK) >> ADC_CFG2_CG_ACK_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Get whether clock gating is enabled * * @note This feature is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @return true Clock gating is enabled, ADC clock is off * @return false Clock gating is disabled, ADC clock is on */ LOCAL_INLINE bool ADC_HWA_GetClockGatingEnableFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_CG_MASK) >> ADC_CFG2_CG_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set whether to enable ADC clock gating * * @note This feature is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @param bEnable whether to enable ADC clock gating */ LOCAL_INLINE void ADC_HWA_SetClockGatingEnableFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_CG_MASK) | ADC_CFG2_CG(bEnable); } /** * @brief Get the voltage reference of the ADC instance * * @param pAdc the base address of the ADC instance * @return ADC_REF_INTERNAL the ADC instance uses internal voltage reference * @return ADC_REF_EXTERNAL the ADC instance uses external voltage reference */ LOCAL_INLINE ADC_RefType ADC_HWA_GetVoltageReference(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_REF_EXT_MASK) >> ADC_CFG2_REF_EXT_SHIFT; return (ADC_RefType)u32TmpVal; } /** * @brief Set the voltage reference of the ADC instance * * @param pAdc the base address of the ADC instance * @param eRefSel the voltage reference of the ADC instance */ LOCAL_INLINE void ADC_HWA_SetVoltageReference(ADC_Type *const pAdc, ADC_RefType eRefSel) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_REF_EXT_MASK) | ADC_CFG2_REF_EXT(eRefSel); } /** * @brief Get the ADC clock divider * * @note This feature is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @return ADC_ClockDivideType the ADC clock divider */ LOCAL_INLINE ADC_ClockDivideType ADC_HWA_GetClockDivider(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_DIV_MASK) >> ADC_CFG2_DIV_SHIFT; return (ADC_ClockDivideType)u32TmpVal; } /** * @brief Set the ADC clock divider * * @note Before configuring DIV, must set CG and wait for CG_ACK=1. * After configuring DIV, must clear CG and wait for CG_ACK=0. * @note This feature is only available in FC4150F2M * * @param pAdc the base address of the ADC instance * @param eDivider the ADC clock divider to set */ LOCAL_INLINE void ADC_HWA_SetClockDivider(ADC_Type *const pAdc, ADC_ClockDivideType eDivider) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_DIV_MASK) | ADC_CFG2_DIV(eDivider); } /** * @brief Get the ADC start up count * * @param pAdc the base address of the ADC instance * @return uint8_t the start count of the ADC instance */ LOCAL_INLINE uint8_t ADC_HWA_GetStartupCnt(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CFG2 & ADC_CFG2_STCNT_MASK) >> ADC_CFG2_STCNT_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the ADC start up count * * @param pAdc the base address of the ADC instance * @param u8StartupCnt the start count of the ADC instance */ LOCAL_INLINE void ADC_HWA_SetStartupCnt(ADC_Type *const pAdc, uint8_t u8StartupCnt) { pAdc->CFG2 = (pAdc->CFG2 & ~ADC_CFG2_STCNT_MASK) | ADC_CFG2_STCNT(u8StartupCnt); } /** * @brief Get the ADC_CFG2 config * * @param pAdc the base address of the ADC instance * @return uint32_t the ADC_CFG2 config */ LOCAL_INLINE uint32_t ADC_HWA_GetConfig2(const ADC_Type *const pAdc) { return pAdc->CFG2; } /** * @brief Set the ADC_CFG2 config * * @param pAdc the base address of the ADC instance * @param u32Config the ADC_CFG2 config */ LOCAL_INLINE void ADC_HWA_SetConfig2(ADC_Type *const pAdc, uint32_t u32Config) { pAdc->CFG2 = u32Config; } /** * @brief Set the ADC_CAL config * * @param pAdc the base address of the ADC instance * @param u32Cal the ADC_CAL config */ LOCAL_INLINE void ADC_HWA_SetCal(ADC_Type *const pAdc, uint32_t u32Cal) { pAdc->CAL = u32Cal; } /** * @brief Get the sample time of the ADC instance * * @param pAdc the base address of the ADC instance * @param u8Selection the sample time index, range 0~3 * @return uint8_t the sample time of the selected index */ LOCAL_INLINE uint8_t ADC_HWA_GetSampleTime(ADC_Type *const pAdc, uint8_t u8Selection) { uint32_t ret; ret = (pAdc->SMPR & (ADC_SMPR_SMP_OPT0_MASK << (8U * u8Selection))) >> (8U * u8Selection); return (uint8_t)ret; } /** * @brief Set the sample time of the ADC instance * * @param pAdc the base address of the ADC instance * @param u8Selection the sample time index, range 0~3 * @param u8SampleTime the sample time of the selected index */ LOCAL_INLINE void ADC_HWA_SetSampleTime(ADC_Type *const pAdc, uint8_t u8Selection, uint8_t u8SampleTime) { DEV_ASSERT(u8Selection < ADC_SAMPLE_TIME_OPTION_CNT); pAdc->SMPR = (pAdc->SMPR & ~(ADC_SMPR_SMP_OPT0_MASK << (8U * u8Selection))) | (ADC_SMPR_SMP_OPT0(u8SampleTime) << (8U * u8Selection)); } /** * @brief Set the ADC hardware compare channel * * @param pAdc the base address of the ADC instance * @param eChannelType whether the hardware compare enabled on single channel or all channels * @param u8ChannalNum if hardware compare is enabled on single channel, this specifies the channel number */ LOCAL_INLINE void ADC_HWA_SetHwCompareChannel(ADC_Type *const pAdc, ADC_CmpChannelType eChannelType, uint8_t u8ChannalNum) { pAdc->CMP_CTRL = (pAdc->CMP_CTRL & (~ADC_CMP_CTRL_ACMPSGL_MASK) & (~ADC_CMP_CTRL_ACMPCH_MASK)) | ADC_CMP_CTRL_ACMPSGL(eChannelType) | ADC_CMP_CTRL_ACMPCH(u8ChannalNum); } /** * @brief Get whether hardware compare is enabled * * @param pAdc the base address of the ADC instance * @return true hardware compare is enabled * @return false hardware compare is disabled */ LOCAL_INLINE bool ADC_HWA_GetHwCompareEnableFlag(const ADC_Type *const pAdc) { uint32_t u32TmpVal = (pAdc->CMP_CTRL & ADC_CMP_CTRL_ACMPEN_MASK) >> ADC_CMP_CTRL_ACMPEN_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set to enable or disable the hardware compare * * @param pAdc the base address of the ADC instance * @param bEnable whether the ADC hardware compare is enabled */ LOCAL_INLINE void ADC_HWA_SetHwCompareEnableFlag(ADC_Type *const pAdc, bool bEnable) { pAdc->CMP_CTRL = (pAdc->CMP_CTRL & ~ADC_CMP_CTRL_ACMPEN_MASK) | ADC_CMP_CTRL_ACMPEN(bEnable); } /** * @brief Set the ADC hardware compare threshold * * @param pAdc the base address of the ADC instance * @param u16LowThres the lower threshold * @param u16HighThres the higher threshold */ LOCAL_INLINE void ADC_HWA_SetHwCompareThreshold(ADC_Type *const pAdc, uint16_t u16LowThres, uint16_t u16HighThres) { pAdc->CMP_TR = ADC_CMP_TR_LT(u16LowThres) | ADC_CMP_TR_HT(u16HighThres); } /** * @brief Get the end of sequence group flag * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group * @param bool the sequence group interrupt flag */ LOCAL_INLINE bool ADC_HWA_GetEndOfSequenceGroupInterruptFlag(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex) { uint32_t u32TmpVal = (pAdc->SGCSR[u8SeqGroupIndex] & ADC_SGCSR_EOSG_MASK) >> ADC_SGCSR_EOSG_SHIFT; return u32TmpVal ? true : false; } /** * @brief Clear the end of sequence group flag * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group */ LOCAL_INLINE void ADC_HWA_ClearEndOfSequenceGroupInterruptFlag(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex) { uint32_t u32TmpVal = pAdc->SGCSR[u8SeqGroupIndex]; pAdc->SGCSR[u8SeqGroupIndex] = (u32TmpVal & ~ADC_SGCSR_EOSG_MASK) | ADC_SGCSR_EOSG(1U); } /** * @brief Set the sequence group end of sequence interrupt enable * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group * @param bEnable the sequence group interrupt enable or disable */ LOCAL_INLINE void ADC_HWA_SetEndOfSequenceGroupInterruptEnable(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex, const bool bEnable) { uint32_t u32TmpVal = pAdc->SGCSR[u8SeqGroupIndex]; pAdc->SGCSR[u8SeqGroupIndex] = (u32TmpVal & ~ADC_SGCSR_EOSGIE_MASK) | ADC_SGCSR_EOSGIE(bEnable); } /** * @brief Get the sequence group start point * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group */ LOCAL_INLINE uint32_t ADC_HWA_GetSeqGroupStartPoint(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex) { return (pAdc->SGCSR[u8SeqGroupIndex] & ~ADC_SGCSR_SG_START_MASK) >> ADC_SGCSR_SG_START_SHIFT; } /** * @brief Get the sequence group end point * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group */ LOCAL_INLINE uint32_t ADC_HWA_GetSeqGroupEndPoint(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex) { return (pAdc->SGCSR[u8SeqGroupIndex] & ~ADC_SGCSR_SG_END_MASK) >> ADC_SGCSR_SG_END_SHIFT; } /** * @brief Set the sequence group start point & end point * * @param pAdc the base address of the ADC instance * @param u8SeqGroupIndex the index of the sequence group * @param u8Start the sequence group start point * @param u8End the sequence group end point */ LOCAL_INLINE void ADC_HWA_SetSeqGroupStartEndPoint(ADC_Type *const pAdc, const uint8_t u8SeqGroupIndex, const uint8_t u8Start, const uint8_t u8End) { uint32_t u32TmpVal = pAdc->SGCSR[u8SeqGroupIndex]; u32TmpVal = (u32TmpVal & ~ADC_SGCSR_SG_END_MASK) | ADC_SGCSR_SG_END(u8End); u32TmpVal = (u32TmpVal & ~ADC_SGCSR_SG_START_MASK) | ADC_SGCSR_SG_START(u8Start); pAdc->SGCSR[u8SeqGroupIndex] = u32TmpVal; } /** * @brief Get the conversion result FIFO data of the ADC instance * * @note only reslut data of ADC single mode and continuous mode will be stored * in FIFO register. * * @param pAdc the base address of the ADC instance * @return uint32_t the ADC conversion result */ LOCAL_INLINE uint32_t ADC_HWA_GetFIFOData(const ADC_Type *const pAdc) { uint32_t u32TmpVal = pAdc->FIFO_DATA; u32TmpVal = (u32TmpVal & ADC_FIFO_DATA_FIFO_DATA_MASK) >> ADC_FIFO_DATA_FIFO_DATA_SHIFT; return (uint32_t)u32TmpVal; } /** * @brief Get the differential mode state of the ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @return bool the state of diff mode for ADC channel */ LOCAL_INLINE bool ADC_HWA_GetChannelDiff(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = (pAdc->SC[u8ChnIdx] & ADC_SC_DIFF_MASK) >> ADC_SC_DIFF_SHIFT; return u32TmpVal ? true : false; } /** * @brief Set the differential mode state of the ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @param bEnable the state of diff mode for ADC channel */ LOCAL_INLINE void ADC_HWA_SetChannelDiff(ADC_Type *const pAdc, const uint8_t u8ChnIdx, const bool bEnable) { pAdc->SC[u8ChnIdx] = (pAdc->SC[u8ChnIdx] & ~ADC_SC_DIFF_MASK) | ADC_SC_DIFF(bEnable); } /** * @brief Get the sample time index of the ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @return uint8_t the sample time index of the ADC channel */ LOCAL_INLINE uint8_t ADC_HWA_GetChannelSampleTimeIndex(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = (pAdc->SC[u8ChnIdx] & ADC_SC_SMPSEL_MASK) >> ADC_SC_SMPSEL_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the sample time index of the ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @param u8SmpSel the sample time index of the ADC channel */ LOCAL_INLINE void ADC_HWA_SetChannelSampleTimeIndex(ADC_Type *const pAdc, const uint8_t u8ChnIdx, uint8_t u8SmpSel) { pAdc->SC[u8ChnIdx] = (pAdc->SC[u8ChnIdx] & ~ADC_SC_SMPSEL_MASK) | ADC_SC_SMPSEL(u8SmpSel); } /** * @brief Get the channel conversion complete status of the ADC instance * * @note this function is used only in ADC discontinuous mode to get the channel complete * status * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @return true the ADC conversion on the selected channel is completed * @return false the ADC conversion on the selected channel is not completed */ LOCAL_INLINE bool ADC_HWA_GetChannelConvertComplete(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = pAdc->SC[u8ChnIdx]; u32TmpVal = (u32TmpVal & ADC_SC_COCO_MASK) >> ADC_SC_COCO_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Check whether interrupt is enabled on the selected ADC channel * * @note this function is used only in ADC discontinuous mode to get the channel interrupt * settings * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @return true interrupt is enabled on the selected channel * @return false interrupt is disabled on the selected channel */ LOCAL_INLINE bool ADC_HWA_GetChannelInterruptEnable(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = pAdc->SC[u8ChnIdx]; u32TmpVal = (u32TmpVal & ADC_SC_AIEN_MASK) >> ADC_SC_AIEN_SHIFT; return (bool)((u32TmpVal != 0U) ? true : false); } /** * @brief Set to enable or disable interrupt on the selected ADC channel * * @note this function is used only in ADC discontinuous mode to get the channel interrupt * settings * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @param bEnable whether to enable interrupt on the selected ADC channel */ LOCAL_INLINE void ADC_HWA_SetChannelInterruptEnable(ADC_Type *const pAdc, const uint8_t u8ChnIdx, bool bEnable) { pAdc->SC[u8ChnIdx] = (pAdc->SC[u8ChnIdx] & ~ADC_SC_AIEN_MASK) | ADC_SC_AIEN(bEnable); } /** * @brief Get the input channel of the selected ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @return uint8_t the hardware input channel */ LOCAL_INLINE uint8_t ADC_HWA_GetChannelInput(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = (pAdc->SC[u8ChnIdx] & ADC_SC_CHS_MASK) >> ADC_SC_CHS_SHIFT; return (uint8_t)u32TmpVal; } /** * @brief Set the input channel to the selected ADC channel * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the channel * @param u8InputChann the hardware input channel */ LOCAL_INLINE void ADC_HWA_SetChannelInput(ADC_Type *const pAdc, const uint8_t u8ChnIdx, uint8_t u8InputChann) { pAdc->SC[u8ChnIdx] = (pAdc->SC[u8ChnIdx] & ~ADC_SC_CHS_MASK) | ADC_SC_CHS(u8InputChann); } /** * @brief Get the conversion result data of the ADC instance * * @note only result data of ADC discontinuous mode will be stored in RESULTn register. * * @param pAdc the base address of the ADC instance * @param u8ChnIdx the index of the ADC channel * @return uint32_t the ADC conversion result */ LOCAL_INLINE uint32_t ADC_HWA_GetChannelData(const ADC_Type *const pAdc, const uint8_t u8ChnIdx) { uint32_t u32TmpVal = pAdc->RESULT[u8ChnIdx]; u32TmpVal = (u32TmpVal & ADC_RESULT_RESULT_MASK) >> ADC_RESULT_RESULT_SHIFT; return (uint32_t)u32TmpVal; } /** @}*/ #endif /* _HWA_ADC_H_ */