- /******************************************************************************
- * [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]();
- }
- }
|