📄 drvadc.c
字号:
/*---------------------------------------------------------------------------------------------------------*/
/* */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved. */
/* */
/*---------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------*/
/* Include related headers */
/*---------------------------------------------------------------------------------------------------------*/
#include "NUC1xx.h"
#include "core_cm0.h"
#include "DrvADC.h"
#include "DrvSYS.h"
/*---------------------------------------------------------------------------------------------------------*/
/* Global file scope (static) variables */
/*---------------------------------------------------------------------------------------------------------*/
static DRVADC_ADC_CALLBACK *g_ptADCCallBack;
static DRVADC_ADCMP0_CALLBACK *g_ptADCMP0CallBack;
static DRVADC_ADCMP1_CALLBACK *g_ptADCMP1CallBack;
static uint32_t g_pu32UserData[3];
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_Open */
/* */
/* Parameters: */
/* InputMode [in]: Specify the type of the analog input signal. */
/* It might be single-end (ADC_SINGLE_END) or differential input (ADC_DIFFERENTIAL). */
/* OpMode [in]: Specify the operation mode. */
/* It might be single, burst, single cycle scan or continuous scan mode. */
/* (ADC_SINGLE_OP / ADC_BURST_OP / ADC_SINGLE_CYCLE_OP / ADC_CONTINUOUS_OP) */
/* u8ChannelSelBitwise [in]: Specify the input channels. */
/* For example, "u8ChannelSelBitwise=0x1(00000001b)" means the ADC channel 0 */
/* is enabled; "u8ChannelSelBitwise=0x19(00011001b)" means the ADC channel 0, */
/* 3 and 4 are enabled. */
/* ClockSrc [in]: Specify the clock source of ADC clock. */
/* It could be EXTERNAL_12MHZ / INTERNAL_PLL / INTERNAL_HCLK / INTERNAL_RC22MHZ. */
/* u8AdcDivisor [in]: Determine the ADC clock frequency. It could be 0~255. */
/* ADC clock frequency = ADC clock source frequency / ( u8AdcDivisor + 1 ) */
/* */
/* Returns: */
/* None. */
/* */
/* Description: */
/* Enable the ADC function. Configure the corresponding pins of the specified channels as analog input */
/* pins. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvADC_Open(E_ADC_INPUT_MODE InputMode, E_ADC_OPERATION_MODE OpMode, uint8_t u8ChannelSelBitwise, E_ADC_CLK_SRC ClockSrc, uint8_t u8AdcDivisor)
{
/* reset ADC */
SYS->IPRSTC2.ADC_RST = 1;
SYS->IPRSTC2.ADC_RST = 0;
/* ADC clock source */
SYSCLK->CLKSEL1.ADC_S = ClockSrc;
/* Set ADC divisor */
SYSCLK->CLKDIV.ADC_N = u8AdcDivisor;
/* ADC engine clock enable */
SYSCLK->APBCLK.ADC_EN = 1;
/* ADC enable */
ADC->ADCR.ADEN = 1;
if( InputMode == ADC_SINGLE_END )
ADC->ADCR.DIFFEN = 0; /* single end input */
else
ADC->ADCR.DIFFEN = 1; /* differential input */
if( OpMode == ADC_SINGLE_OP )
ADC->ADCR.ADMD = 0; /* single mode */
else if( OpMode == ADC_SINGLE_CYCLE_OP )
ADC->ADCR.ADMD = 2; /* single-cycle scan mode */
else
ADC->ADCR.ADMD = 3; /* continuous scan mode */
ADC->ADCHER.CHEN = u8ChannelSelBitwise;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_Close */
/* */
/* Parameters: */
/* None. */
/* */
/* Returns: */
/* None. */
/* */
/* Description: */
/* Disable the ADC function, ADC engine clock, ADC compare 0&1 and related interrupts. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvADC_Close(void)
{
ADC->ADCR.ADEN = 0; /* ADC disable */
SYSCLK->APBCLK.ADC_EN = 0; /* ADC engine clock disable */
ADC->ADCR.ADIE = 0; /* Disable ADC interrupt */
NVIC_DisableIRQ(ADC_IRQn);
ADC->ADCMPR[0].CMPEN = 0; /* Disable ADC compare 0 */
ADC->ADCMPR[0].CMPIE = 0; /* Disable ADC compare 0 interrupt */
ADC->ADCMPR[1].CMPEN = 0; /* Disable ADC compare 1 */
ADC->ADCMPR[1].CMPIE = 0; /* Disable ADC compare 1 interrupt */
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_SetADCChannel */
/* */
/* Parameters: */
/* u8ChannelSelBitwise [in]: Specify the analog input channels. */
/* */
/* Returns: */
/* None. */
/* */
/* Description: */
/* Select ADC input channels. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvADC_SetADCChannel(uint8_t u8ChannelSelBitwise)
{
ADC->ADCHER.CHEN = u8ChannelSelBitwise;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_ConfigADCChannel7 */
/* */
/* Parameters: */
/* Ch7Src [in]: Specify the analog input source. */
/* It could be EXTERNAL_INPUT_SIGNAL, INTERNAL_BANDGAP and INTERNAL_TEMPERATURE_SENSOR. */
/* */
/* Returns: */
/* None. */
/* */
/* Description: */
/* Select the input signal source of ADC channel 7. */
/* ADC channel 7 is a multi-function channel. */
/* Its input source could come from a external signal, a internal bandgap voltage or a internal */
/* temperature sensor. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvADC_ConfigADCChannel7(E_ADC_CH7_SRC Ch7Src)
{
ADC->ADCHER.PRESEL = Ch7Src;
if(Ch7Src==INTERNAL_TEMPERATURE_SENSOR)
SYS->TEMPCR.VTEMP_EN = 1; /* Temperature sensor enable */
else
SYS->TEMPCR.VTEMP_EN = 0; /* Temperature sensor disable */
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_SetADCInputMode */
/* */
/* Parameters: */
/* InputMode [in]: Specify the input mode. It could be ADC_SINGLE_END / ADC_DIFFERENTIAL. */
/* */
/* Returns: */
/* None. */
/* */
/* Description: */
/* Set the ADC input mode. */
/*---------------------------------------------------------------------------------------------------------*/
void DrvADC_SetADCInputMode(E_ADC_INPUT_MODE InputMode)
{
if( InputMode == ADC_SINGLE_END )
ADC->ADCR.DIFFEN = 0; /* single end input */
else
ADC->ADCR.DIFFEN = 1; /* differential input */
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvADC_SetADCOperationMode */
/* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -