/******************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url] providing APIs for configuring ADC module (ADC).
*
*******************************************************************************
*
* provide APIs for configuring ADC module (ADC)
******************************************************************************/
#include "common.h"
#include "adc.h"
/******************************************************************************
* Local function
******************************************************************************/
ADC_CallbackType ADC_Callback[1] = {NULL};
/******************************************************************************
* Local variables
******************************************************************************/
/******************************************************************************
* Local function prototypes
******************************************************************************/
/******************************************************************************
* define ADC APIs
*
*//*! @addtogroup adc_api_list
* @{
*******************************************************************************/
/*****************************************************************************//**
*
* @初始化ADC模块
*
* @输入 pADC 指向ADC模块的基址.
* @输入 pADC 指向ADC配置参数的结构体.
*
* @无返回
*
*****************************************************************************/
void ADC_Init(ADC_Type *pADC, ADC_ConfigTypePtr pADC_Config)
{
if( pADC == ADC)
{
SIM->SCGC |= SIM_SCGC_ADC_MASK;//选通ADC时钟
}
/* 设置ADC模块的时钟源 */
ADC_SelectClock(pADC,pADC_Config->u8ClockSource);
/* 设置时钟分频系数*/
ADC_SelectClockDivide(pADC,pADC_Config->u8ClockDiv);
/* 设置转换模式 */
ADC_SetMode(pADC,pADC_Config->u8Mode);
/* 设置FIFO深度 */
ADC_SetFifoLevel(pADC,pADC_Config->u8FiFoLevel);
/* 设置引脚控制 */
pADC->APCTL1 = pADC_Config->u16PinControl;//引脚控制1寄存器的设置
if( pADC_Config->sSetting.bCompareEn )
{
ADC_CompareEnable(pADC);//ADC比较功能使能
}
if( pADC_Config->sSetting.bCompareGreaterEn )
{
ADC_CompareGreaterFunction(pADC);//输入大于或等于比较电平时,比较触发
}
if( pADC_Config->sSetting.bContinuousEn )
{
ADC_ContinuousConversion(pADC);//使能ADC连续转换
}
if( pADC_Config->sSetting.bCompareAndEn )
{
ADC_CompareFifoAnd(pADC);//比较功能选择,对所有比较触发作“与”运算
}
if( pADC_Config->sSetting.bFiFoScanModeEn )
{
ADC_FifoScanModeEnable(pADC);//FIFO扫描模式使能
}
if( pADC_Config->sSetting.bHardwareTriggerEn )
{
ADC_SetHardwareTrigger(pADC);//选择硬件触发
}
if( pADC_Config->sSetting.bIntEn )
{
ADC_IntEnable(pADC);//转换完成中断使能
NVIC_EnableIRQ( ADC0_IRQn );//开启ADC的IRQ中断
}
if( pADC_Config->sSetting.bLongSampleEn )
{
ADC_SetLongSample(pADC);//配置为长时间采样
}
if( pADC_Config->sSetting.bLowPowerEn )
{
ADC_SetLowPower(pADC);//进行低功耗配置
}
#if !defined(CPU_NV32)
if( pADC_Config->sSetting.bHTRGMEn )
{
ADC_HardwareTriggerMultiple(pADC);
}
else
{
ADC_HardwareTriggerSingle(pADC);
}
if( pADC_Config->sSetting.bHTRGMASKEn )
{
ADC_HardwareTriggerMaskEnable(pADC);
}
else
{
ADC_HardwareTriggerMaskDisable(pADC);
}
if( pADC_Config->sSetting.bHTRGMASKSEL )
{
ADC_HardwareTriggerMaskAuto(pADC);
}
else
{
ADC_HardwareTriggerMaskNonAuto(pADC);
}
#endif
}
/*****************************************************************************//*!
*
* @还原ADC到默认值.
*
* @输入 指向ADC模块的基址.
*
* @无返回.
*
*****************************************************************************/
void ADC_DeInit( ADC_Type *pADC )
{
ADC_SetChannel(pADC,ADC_CHANNEL_DISABLE);
SIM->SCGC &= ~SIM_SCGC_ADC_MASK;
}
/*****************************************************************************//*!
*
* @进行ADC转换,并返回转换结果
*
* @输入 指向ADC模块的基址.
* @输入 选择ADC通道进行转换,并返回转换结果.
*
* @返回ADC转换结果.
*
*****************************************************************************/
unsigned int ADC_PollRead( ADC_Type *pADC, uint8_t u8Channel )
{
ADC_SetChannel(pADC,u8Channel);//进行通道
while( !ADC_IsCOCOFlag(pADC) );//转换完成标志,转换完成则跳出while循环
return ADC_ReadResultReg(pADC);//返回转换结果
}
/*****************************************************************************//*!
*
* @中断回调操作.
*
* @输入 pADC_CallBack 指向ADC回调地址
*
* @无返回.
*
*****************************************************************************/
void ADC_SetCallBack(ADC_CallbackType pADC_CallBack)
{
ADC_Callback[0] = pADC_CallBack;
}
/*****************************************************************************//*!
*
* @设置ADC通道.
*
* @输入 指向ADC模块的基址.
* @输入 ADC通道的选择.
*
* @无返回
*
*****************************************************************************/
void ADC_SetChannel( ADC_Type *pADC, uint8_t u8Channel )
{
uint32_t u32temp;
u32temp = pADC->SC1;
u32temp &= ~ADC_SC1_ADCH_MASK;
pADC->SC1 = u32temp|ADC_SC1_ADCH(u8Channel);
}
/*****************************************************************************//*!
*
* @基准电压源的选择.
*
* @输入 pADC 指向ADC模块的基址.
* @输入 u8Vref adc 参考电压选择.
*
* @无返回
*
*****************************************************************************/
void ADC_VrefSelect( ADC_Type *pADC, uint8_t u8Vref )
{
uint32_t u32Temp;
u32Temp = pADC->SC2;
u32Temp &= ~ADC_SC2_REFSEL_MASK;
pADC->SC2 = u32Temp|ADC_SC2_REFSEL(u8Vref);
}
/*****************************************************************************//*!
*
* @选择时钟分频系数
*
* @输入 指向ADC模块的基址.
* @输入 选择时钟分频.
*
* @无返回
*
*****************************************************************************/
void ADC_SelectClockDivide( ADC_Type *pADC, uint8_t u8Div )
{
uint32_t u32Temp;
u32Temp = pADC->SC3;
u32Temp &= ~ADC_SC3_ADIV_MASK;
pADC->SC3 = u32Temp|ADC_SC3_ADIV(u8Div);
}
/*****************************************************************************//*!
*
* @设置ADC转换模式.
*
* @输入 指向ADC模块的基址.
* @输入 转换模式选择.
*
* @无返回
*
*****************************************************************************/
void ADC_SetMode( ADC_Type *pADC, uint8_t u8Mode )
{
uint32_t u32Temp;
u32Temp = pADC->SC3;
u32Temp &= ~ADC_SC3_MODE_MASK;
pADC->SC3 = u32Temp|ADC_SC3_MODE(u8Mode);
}
/*****************************************************************************//*!
*
* @输入时钟选择.
*
* @输入 指向ADC模块的基址.
* @输入 0x00:总线时钟; 0x01:总线时钟2分频;
* 0x02:备用时钟ALTCLK;0x03:异步时钟ADACK
*
* @无返回
*
*****************************************************************************/
void ADC_SelectClock( ADC_Type *pADC, uint8_t u8Clock )
{
uint32_t u32Temp;
u32Temp = pADC->SC3;
u32Temp &= ~ADC_SC3_ADICLK_MASK;
pADC->SC3 = u32Temp|ADC_SC3_ADICLK(u8Clock);
}
/*****************************************************************************//*!
*
* @设置FIFO深度并进行使能选择
*
* @输入 指向ADC模块的基址.
* @输入 设置选择FIFO深度.
*
* @无返回
*
*****************************************************************************/
void ADC_SetFifoLevel( ADC_Type *pADC, uint8_t u8FifoLevel )
{
uint32_t u32Temp;
u32Temp = pADC->SC4;
u32Temp &= ~ADC_SC4_AFDEP_MASK;
pADC->SC4 = u32Temp|ADC_SC4_AFDEP(u8FifoLevel);
}
/*! @} End of adc_api_list */
/*****************************************************************************//*!
*
* @中断服务程序ISR
*
* @无返回
*
*****************************************************************************/
void ADC_Isr(void)
{
if( ADC_Callback[0] )
{
ADC_Callback[0]();
}
}
|