打印
[demo程序]

NV32F100x 库文件adc.c中文注释

[复制链接]
831|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jp_chen|  楼主 | 2017-7-26 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************************
* [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]();
    }
}
















相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

113

帖子

0

粉丝