/** ****************************************************************************** * @file xl_adc.c * @author kirk ,xu.wang * @version 4.5.2 * @date Fri Mar 26 17:29:12 2021 * @brief This file provide function about ICS firmware program ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ /* Includes ---------------------------------------------------------------*/ #include "xl_adc.h" /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @defgroup ADC ADC Module * @brief ADC Driver Modules Library * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup ADC_Private_Functions * @{ */ /** * @brief ADCxÍâÉè¼Ä´æÆ÷»Ö¸´Ä¬ÈÏÖµ * @param ADCx:ÉèÖÃADCÍâÉè. * @retval None */ void ADC_DeInit(ADC_Type* ADCx) { /* Deinitializes to default reset values */ ADCx->CR = 0x00000000; ADC_SetChannel(ADCx,ADC_CHANNEL_DISABLE); } /** * @brief ADC³õʼ»¯ * @param ADCx:ÉèÖÃADCÍâÉè * @param ADC_InitStruct:ADC³õʼ»¯ÅäÖýṹÌå * @retval None */ void ADC_Init(ADC_Type* ADCx, const ADC_InitTypeDef* ADC_InitStruct) { /*---------------------------- ADCx CR Configuration -----------------*/ /* Clear MODE¡¢REFSEL¡¢CLKSEL¡¢DIV ¡¢LPE and LSTE bits */ ADCx->CR &= ~(ADC_CR_MODE_MASK | ADC_CR_REFSEL_MASK | ADC_CR_CLKSEL_MASK | \ ADC_CR_ADIV_MASK | ADC_CR_LSTE_MASK | ADC_CR_LPE_MASK); /* Configures MODE¡¢REFSEL¡¢CLKSEL¡¢DIV ¡¢LPE and LSTE bits */ ADCx->CR |= ((ADC_InitStruct->ADC_Mode & ADC_CR_MODE_MASK) | \ ((ADC_InitStruct->ADC_ReferVoltage << ADC_CR_REFSEL_SHIFT) & ADC_CR_REFSEL_MASK)| \ ((ADC_InitStruct->ADC_ClockSource << ADC_CR_CLKSEL_SHIFT) & ADC_CR_CLKSEL_MASK)| \ (ADC_CR_ECOBD_MASK)|\ ((ADC_InitStruct->ADC_ClkDivide << ADC_CR_ADIV_SHIFT) & ADC_CR_ADIV_MASK)); if(ADC_InitStruct->ADC_LongTimeConvert == ENABLE) { ADCx->CR |= ADC_CR_LSTE_MASK; } if(ADC_InitStruct->ADC_LowPowerConvert == ENABLE) { ADCx->CR |= ADC_CR_LPE_MASK; } } /** * @brief ADC FIFOÅäÖüĴæÆ÷ * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_FIFOStruct:ADC FIFOÅäÖòÎÊý½á¹¹Ìå * @retval None */ void ADC_FIFOConfig(ADC_Type* ADCx, const ADC_FIFOTypeDef* ADC_FIFOStruct) { /*---------------------------- ADCx CR Configuration -----------------*/ /* Clear FSE¡¢FDEP bits */ ADCx->CR &= ~(ADC_CR_FDEP_MASK | ADC_CR_FSE_MASK); /* Configures FSE¡¢FDEP bits */ ADCx->CR |= ((ADC_FIFOStruct->ADC_FIFOLevel << ADC_CR_FDEP_SHIFT) & ADC_CR_FDEP_MASK); if(ADC_FIFOStruct->ADC_ChannelScan == ENABLE) { ADCx->CR |= ADC_CR_FSE_MASK; } } /** * @brief ADC Compare¹¦ÄÜÅäÖú¯Êý * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_CompareStruct:ADC CompareÅäÖòÎÊý½á¹¹Ìå * @retval None */ void ADC_CompareConfig(ADC_Type* ADCx, const ADC_CompareTypeDef* ADC_CompareStruct) { /*---------------------------- ADCx CR Configuration -----------------*/ /* Clear CFE¡¢CFRE¡¢CFGRE and CFSEL bits */ ADCx->CR &= ~(ADC_CR_CFRE_MASK | ADC_CR_CFGRE_MASK | ADC_CR_CFE_MASK | ADC_CR_CFSEL_MASK | ADC_CR_COSBEN_MASK); /* Configures CFE¡¢CFRE¡¢CFGRE and CFSEL bits */ ADCx->CR |= (((ADC_CompareStruct->ADC_CompareMode << ADC_CR_CFRE_SHIFT) & ADC_CR_CFRE_MASK) | \ ((ADC_CompareStruct->ADC_CompareOut << ADC_CR_CFGRE_SHIFT) & ADC_CR_CFGRE_MASK)| \ ((ADC_CompareStruct->ADC_FIFOCompareOut << ADC_CR_CFSEL_SHIFT) & ADC_CR_CFSEL_MASK)); if(ADC_CompareStruct->ADC_AutoCompare == ENABLE) { ADCx->CR |= ADC_CR_CFE_MASK; } if(ADC_CompareStruct->ADC_CompareResultSwitch == ENABLE) { ADCx->CR |= ADC_CR_COSBEN_MASK; } /* Set the compare value */ ADCx->CVR &= ~ADC_CVR_CVH_MASK; ADCx->CVR |= ((ADC_CompareStruct->ADC_CompareValueHigh<CVR &= ~ADC_CVR_CVL_MASK; ADCx->CVR |= (ADC_CompareStruct->ADC_CompareValueLow & ADC_CVR_CVL_MASK); } /** * @brief ADCʹÄܺ¯Êý * @param ADCx:ÉèÖÃADCÍâÉè. * @param State: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_EnableCmd(ADC_Type* ADCx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the selected ADC peripheral */ ADCx->EHTMR |= ADC_EHTMR_EN_MASK; } else { /* Disable the selected ADC peripheral */ ADCx->EHTMR &= ~ADC_EHTMR_EN_MASK; } } /** * @brief ADCÓ²¼þ´¥·¢Ê¹Äܺ¯Êý * @param ADCx:ÉèÖÃADCÍâÉè. * @param State: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_HardwareTriggrMaskCmd(ADC_Type* ADCx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the hardware trigger mask function */ ADCx->EHTMR |= ADC_EHTMR_HTRGM_MASK; } else { /* Disable the hardware trigger mask function */ ADCx->EHTMR &= ~ADC_EHTMR_HTRGM_MASK; } } /** * @brief ADC´¥·¢Ä£Ê½Ñ¡Ôñ * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_Triggermode: Èí¼þ»òÓ²¼þ´¥·¢. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_SOFTWARE_TRIGGER: Èí¼þ´¥·¢ * @arg ADC_HARDWARE_TRIGGER: Ó²¼þ´¥·¢ */ void ADC_SetTriggerMode(ADC_Type* ADCx, uint8_t ADC_Triggermode) { /* software trigger mode */ if(ADC_Triggermode==ADC_SOFTWARE_TRIGGER) { ADCx->CR &=~ADC_CR_TRGSEL_MASK; } else { /* hardware trigger mode */ ADCx->CR |= ADC_CR_TRGSEL_MASK; } } /** * @brief ADCÒ첽ʱÖÓÑ¡Ôñλ * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_ADACKmode: Õý³£ADACKÖµ»òÕß1.5±¶Õý³£ADACKÖµ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_ADACK_NORMAL: Õý³£ADACK * @arg ADC_ADACK_TIMES1P5: 1.5±¶µÄADACK */ void ADC_ADACKSelect(ADC_Type* ADCx, uint8_t ADC_ADACKmode) { /* select the normal ADACK */ if(ADC_ADACKmode==ADC_ADACK_NORMAL) { ADCx->CR &=~ADC_CR_ADACKS_MASK; } else { /* select 1.5 times normal ADACK */ ADCx->CR |= ADC_CR_ADACKS_MASK; } } /** * @brief ADCת»»Ä£Ê½Ñ¡Ôñ£¬µ¥´Îת»»»¹ÊÇÒ첽ת»» * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_ConventionMode: Ò»´Î»òÕßÁ¬Ðø. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_CONVENTION_ONCE: µ¥´Îת»» * @arg ADC_CONVENTION_CONTINUOUS: Á¬Ðø×ª»» */ void ADC_SetConventionMode(ADC_Type* ADCx, uint8_t ADC_ConventionMode) { /*!< convert once */ if(ADC_ConventionMode==ADC_CONVENTION_ONCE) { ADCx->CR &=~ADC_CR_CCE_MASK; } else { /*!< convert continuous */ ADCx->CR |= ADC_CR_CCE_MASK; } } /** * @brief ADCͨµÀÉèÖà * @param ADCx:ÉèÖÃADCÍâÉè. * @param Channel:Ö¸ÏòÔ¼¶¨Í¨µÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_CHANNEL_AD0: * @arg ADC_CHANNEL_AD1: * @arg ADC_CHANNEL_AD2: * @arg ADC_CHANNEL_AD3: * @arg ADC_CHANNEL_AD4: * @arg ADC_CHANNEL_AD5: * @arg ADC_CHANNEL_AD6: * @arg ADC_CHANNEL_AD7: * @arg ADC_CHANNEL_AD8: * @arg ADC_CHANNEL_AD9: * @arg ADC_CHANNEL_AD10: * @arg ADC_CHANNEL_AD11: * @arg ADC_CHANNEL_AD12: * @arg ADC_CHANNEL_AD13: * @arg ADC_CHANNEL_AD14: * @arg ADC_CHANNEL_AD15: * @arg ADC_CHANNEL_AD16: * @arg ADC_CHANNEL_AD17: * @arg ADC_CHANNEL_AD18: * @arg ADC_CHANNEL_AD19: * @arg ADC_CHANNEL_AD20: * @arg ADC_CHANNEL_AD21: * @arg ADC_CHANNEL_TEMPSENSOR: * @arg ADC_CHANNEL_BANDGAP: * @arg ADC_CHANNEL_AD22: * @arg ADC_CHANNEL_AD23: * @arg ADC_CHANNEL_VSS: * @arg ADC_CHANNEL_VREFH: * @arg ADC_CHANNEL_VREFL: * @arg ADC_CHANNEL_DISABLE: */ void ADC_SetChannel(ADC_Type* ADCx, uint8_t channelno) { /* set channel */ ADCx->CSR =((uint32_t)channelno & ADC_CSR_ADCH_MASK); } /** * @brief ÊÇ·ñÆôÓÃADCÍâÉèÖжÏ. * @param ADCx:ÉèÖÃADCÍâÉè. * @param State: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_InterruptEn(ADC_Type* ADCx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the interrupt function */ ADCx->CR |= ADC_CR_AIE_MASK; } else { /* Disable the interrupt function */ ADCx->CR &= ~ADC_CR_AIE_MASK; } } /** * @brief ÊÇ·ñÆôÓÃADCÍâÉèDMA·¢Éä״̬. * @param ADCx:ÉèÖÃADCÍâÉè. * @param State: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_DMATxEn(ADC_Type* ADCx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the DMA transmit function */ ADCx->CR |= ADC_CR_DMATXEN_MASK; } else { /* Disable the DMA transmit function */ ADCx->CR &= ~ADC_CR_DMATXEN_MASK; } } /** * @brief ÊÇ·ñÆôÓÃADCÍâÉèDMA½ÓÊÕ״̬. * @param ADCx:ÉèÖÃADCÍâÉè. * @param State: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_DMARxEn(ADC_Type* ADCx, FunctionalState NewState) { if (NewState != DISABLE) { /* Enable the DMA receive function */ ADCx->CR |= ADC_CR_DMARXEN_MASK; } else { /* Disable the DMA receive function */ ADCx->CR &= ~ADC_CR_DMARXEN_MASK; } } /** * @brief ·µ»Ø×îºóµÄADCx½á¹ûÊý¾Ý. * @param ADCx:ÉèÖÃADCÍâÉè. * @param NewState:Ñ¡ÔñÊÇ·ñ״̬. * @retval ·µ»ØÊý¾Ý½á¹û. */ uint16_t ADC_GetConversionValue(const ADC_Type* ADCx) { /* Return the selected ADC conversion value */ return (uint16_t)(ADCx->RDR & ADC_RDR_DATA_MASK); } /** * @brief ·µ»Ø×îºóµÄADCx½á¹ûÊý¾Ý. * @param ADCx:ÉèÖÃADCÍâÉè. * @param NewState:Ñ¡ÔñÊÇ·ñ״̬. * @retval ·µ»ØFIFOÖеÄÊý¾ÝÖµ. */ uint16_t ADC_GetFIFOValueCounter(const ADC_Type* ADCx) { /* Return FIFO conversion value number*/ return (uint16_t) (ADCx->SR & ADC_SR_RFCNT_MASK); } /** * @brief ¼ì²âADC±êÖ¾ÊÇ·ñÉèÖÃ. * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_FLAG: ¼ì²âÌØ¶¨±êÖ¾. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_FLAG_DATAFIFO_FULL: FIFOÊý¾ÝÂú±êÖ¾. * @arg ADC_FLAG_DATAFIFO_EMPTY:FIFOÊý¾Ý¿Õ±êÖ¾. * @arg ADC_FLAG_CONV_FINISH: ½áÊø±êÖ¾. * @arg ADC_FLAG_CONV_BUSY: ·±Ã¦±êÖ¾. * @arg ADC_FLAG_ChannelFIFO_FULL: Channel FIFOÊý¾ÝÂú±êÖ¾. * @arg ADC_FLAG_ChannelFIFO_EMPTY: Channel FIFOÊý¾Ý¿Õ±êÖ¾. * @retval ·µ»ØADC_FLAG 0ÖØÆô 1ÖÃÊý. */ FlagStatus ADC_GetFlagStatus(const ADC_Type* ADCx, uint16_t ADC_FLAG) { FlagStatus bitstatus = RESET; /* Check the status of the specified ADC flag */ if ((ADCx->SR & ADC_FLAG) == ADC_FLAG) { /* ADC_FLAG is set */ bitstatus = SET; } else { /* ADC_FLAG is reset */ bitstatus = RESET; } /* Return the ADC_FLAG status */ return bitstatus; } /** * @brief ¼ì²âADC±êÖ¾ÊÇ·ñÉèÖÃ. * @param ADCx:ÉèÖÃADCÍâÉè. * @param ADC_COMPARE_FLAG: ±È½Ï¹¦ÄÜ״̬. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_CHANNEL0_COMPARE_EXCEPTION: ͨµÀ0±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL1_COMPARE_EXCEPTION: ͨµÀ1±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL2_COMPARE_EXCEPTION: ͨµÀ2±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL3_COMPARE_EXCEPTION: ͨµÀ3±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL4_COMPARE_EXCEPTION: ͨµÀ4±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL5_COMPARE_EXCEPTION: ͨµÀ5±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL6_COMPARE_EXCEPTION: ͨµÀ6±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNEL7_COMPARE_EXCEPTION: ͨµÀ7±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_CHANNELALL_COMPARE_EXCEPTION: ËùÓÐͨµÀ±È½Ï½á¹ûÒì³£±êÖ¾. * @arg ADC_COMPARE_CFSEL_FLAG: Êä³ö½á¹ûÑ¡Ôñ·½Ê½±êÖ¾. * @arg ADC_COMPARE_CFGRE_FLAG: ´óÓÚÑ¡Ôñ±êÖ¾. * @arg ADC_COMPARE_CFRE_FLAG: ±È½Ï·½Ê½Ñ¡Ôñ±êÖ¾. * @arg ADC_COMPARE_CFE_FLAG: ×Ô¶¯±È½Ï¹¦ÄÜʹÄܱêÖ¾. * @retval ·µ»ØADC_COMPARE_FLAG 0ÇåÁã 1ÖÃλ. */ FlagStatus ADC_GetCompareFlagStatus(const ADC_Type* ADCx, uint16_t ADC_COMPARE_FLAG) { FlagStatus bitstatus = RESET; /* Check the status of the specified ADC flag */ if ((ADCx->CFR & ADC_COMPARE_FLAG) == ADC_COMPARE_FLAG) { /* ADC_FLAG is set */ bitstatus = SET; } else { /* ADC_FLAG is reset */ bitstatus = RESET; } /* Return the ADC_FLAG status */ return bitstatus; } /** * @brief ÊÇ·ñ¹Ø¶Ï¶ÔӦͨµÀÒý½ÅÊý×Ö¹¦ÄÜ. * @param ADCx:ÉèÖÃADCÍâÉè. * @param Channel:Ö¸ÏòÔ¼¶¨Í¨µÀ. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ADC_CHANNEL_AD0: * @arg ADC_CHANNEL_AD1: * @arg ADC_CHANNEL_AD2: * @arg ADC_CHANNEL_AD3: * @arg ADC_CHANNEL_AD4: * @arg ADC_CHANNEL_AD5: * @arg ADC_CHANNEL_AD6: * @arg ADC_CHANNEL_AD7: * @arg ADC_CHANNEL_AD8: * @arg ADC_CHANNEL_AD9: * @arg ADC_CHANNEL_AD10: * @arg ADC_CHANNEL_AD11: * @arg ADC_CHANNEL_AD12: * @arg ADC_CHANNEL_AD13: * @arg ADC_CHANNEL_AD14: * @arg ADC_CHANNEL_AD15: * @arg ADC_CHANNEL_AD16: * @arg ADC_CHANNEL_AD17: * @arg ADC_CHANNEL_AD18: * @arg ADC_CHANNEL_AD19: * @arg ADC_CHANNEL_AD20: * @arg ADC_CHANNEL_AD21: * @arg ADC_CHANNEL_TEMPSENSOR: * @arg ADC_CHANNEL_BANDGAP: * @arg ADC_CHANNEL_AD22: * @arg ADC_CHANNEL_AD23: * @arg ADC_CHANNEL_VSS: * @arg ADC_CHANNEL_VREFH: * @arg ADC_CHANNEL_VREFL: * @arg ADC_CHANNEL_DISABLE: * @param NewState: ADCxʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg ENABLE: ADCxʹÄÜ * @arg DISABLE: ADCxʧÄÜ */ void ADC_DisableChannelDigFuc(ADC_Type* ADCx, uint8_t channelno, FunctionalState NewState) { if(NewState == ENABLE) { ADCx->APCTL |= ((uint32_t)1u << channelno); } else { ADCx->APCTL &= ~((uint32_t)1u << channelno); } } /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */