⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
**
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
**
** Using example :     char *pcArg = "Chn=1 ADCClk=100000"; adcInit(0,pcArg,NULL);
** Notice:             设备操作失败的原因是输入不正确的设备号.
**                     本API函数的参数是在FPCLK=11059200Hz的频率下设置的
**********************************************************************************************************/
uint32    adcInit (uint32 uiID,
                   char  *pcArg,
                   void  *pRsv)

{
    static   uint32  uiParam[7]={1,0,0,0,1,1,1};
    
    if ((uiID >= __ADC_MAX_NUM) | (pcArg == NULL)) {                    /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
           
    ImpCmd(Tab_ADC, pcArg, uiParam);                                    /*  解析字符串参数              */
    
    /*
     *   过滤输入字符参数
     */
    if ((uiParam[Chn] > 0xFF) || (uiParam[Chn] == 0)){
        uiParam[Chn] &= 0x01;                                           /*  默认输入通道号为0,即值等于1 */  
    }
    if (uiParam[ADCClk] > 4500000) {
        uiParam[ADCClk] = 4500000;    
    }
    if (uiParam[Burst] > 0x01) {
        uiParam[Burst] = 0x00;    
    } 
    if (uiParam[Precision] > 10 || uiParam[Precision] < 3) {
        uiParam[Precision] = 10;    
    }
    if (uiParam[PowerDown] > 0x01) {
        uiParam[PowerDown] = 0x01;    
    }
    if (uiParam[Start] > 0x07) {
        uiParam[Start] = 0x01;    
    }
    if (uiParam[Edge] > 0x01) {
        uiParam[Edge] = 0x01;    
    }    

    /*
     *  初始化结构体,给设备套上一层参数壳.
     */    
    return (__adcInit(uiID,uiParam,NULL));

}

/*********************************************************************************************************
** Function name:	   adcSetMode
**
** Descriptions:	   参数设置函数,解释用户的字符串命令,并对ADC进行设置及设置中断
** input parameters:   uiID  --部件设备号 :0-ADC0;1-ADC1
**                     pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                             关键字:  Chn:      可选择范围从 1~8;
**                                      ADCClk:   <= 4.5MHZ,输入范围:0~4500000;
**                                      Burst :   0 -软件控制模式,1 -硬件控制模式
**                                      Precision:可输入范围:3~10
**                                      PowerDown:可选择:0 -掉电模式, 1 -ADC处于正常工作模式
**                                      Start:    启动控制选择. 根据手册数据,可选择范围:0~7 
**                                      Edge:     启动触发信号的边沿选择. 0 -下降沿, 1 -上升沿转换.
**
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
**
** Using example :     char *pcArg = "Chn=1 ADCClk=100000"; adcSetMode(0,pcArg,NULL);
** Notice:             1.设备操作失败的原因是输入不正确的设备号.
**                     2.本API函数的参数是在FPCLK=11059200Hz的频率下设置的
**                     3.不允许在ADC工作忙状态下对ADC进行模式设置,否则直接返回错误.
*********************************************************************************************************/
uint32    adcSetMode (uint32 uiID,
                      char  *pcArg,
                      void  *pRsv)
{

    static   uint32  uiParam[7]={1,0,0,0,1,1,1};
    
    if ((uiID >= __ADC_MAX_NUM) | (pcArg == NULL)) {                    /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
           
    if (__GpADCInfoData[uiID]->uiAdcState == ADC_BUSY) {                /*  如此时ADC正忙,处理中断,返回 */
        return (uint32)(OPERATE_FAIL);
    }
    
    ImpCmd(Tab_ADC, pcArg, uiParam);                                    /*  解析字符串参数              */
    
    /*
     *   检查输入字符参数有效性
     */
    if ((uiParam[Chn]       > 0xFF)    ||
        (uiParam[ADCClk]    > 4500000) ||   
        (uiParam[Burst]     > 0x01)    ||
        (uiParam[Precision] > 10)      || 
        (uiParam[Precision] < 3)       ||
        (uiParam[PowerDown] > 0x01)    ||
        (uiParam[Start]     > 0x07)    ||
        (uiParam[Edge]      > 0x01)) {
     
        return (uint32)(OPERATE_FAIL);        
    }
        
    /*
     *  初始化结构体,给设备套上一层参数壳.
     */  
    if (uiParam[Chn] == 0) {                                            /*  如果通道号设为0,强制为0x01  */
        uiParam[Chn] = 0x01;
    }  
    return (__adcInit(uiID,uiParam,NULL));
}

/*********************************************************************************************************
** Function name:	        adcGetState
**
** Descriptions:            ADC状态获取函数
** Input parameters:        uiID          设备号,例如0表示使用ADC0
**                          uiParmCmd     要读取的参数类型,具体参见ADC.h宏定义
**                          pRsv          保留指针参数,可输入NULL.
**
** Returned value:          获取状态失败:     OPERATE_FAIL.    失败的原因:参数错误.
**                          获取状态成功:     根据不同命令获得的值意义不一样
**                            uiParamCmd = ADC_GET_START,       返回ADC_STOP,ADC_START;
**                            uiParamCmd = ADC_GET_STARTMODE,   返回ADC_BURST,ADC_SOFE;
**                            uiParamCmd = ADC_GET_USECHN,      返回通道号数组名;
**                            uiParamCmd = ADC_GET_DONECHN,     返回已完成转换的通道号数组名;
**                            uiParamCmd = ADC_GET_STATE,       返回ADC_BUSY,ADC_IDLE,ADC_ERR.
*********************************************************************************************************/
uint32    adcGetState (uint32  uiID,
                       uint32  uiParamCmd,
                       char   *pRsv)
{
    
    if (uiID >= __ADC_MAX_NUM) {                                        /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}    
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
	
    switch (uiParamCmd) {
    case ADC_GET_START:                                                 /*  启动状态                    */
        return ((__GpADCInfoData[uiID]->uiStart != FALSE) ? ADC_START : ADC_STOP); 
        break;
                                
    case ADC_GET_STARTMODE:                                             /*  转换模式                    */
        return ((__GpADCInfoData[uiID]->uiBurst == TRUE) ? ADC_BURST : ADC_SOFE);
        break;
                                 
    case ADC_GET_USECHN:  
        return (uint32)(__GpADCInfoData[uiID]->ucUseChn);               /*  已使用通道                  */ 
        break;
        
    case ADC_GET_DONECHN:
        return (uint32)(__GpADCInfoData[uiID]->ucDoneFlg);              /*  已转换结束通道              */
        break;
        
    case ADC_GET_STATE:
        return (__GpADCInfoData[uiID]->uiAdcState);                     /*  ADC当前状态                 */
        break;
        
    default:
        { return (uint32)(OPERATE_FAIL);}                               /*  返回输入参数错误            */
    }
}

/*********************************************************************************************************
** Function name:	   adcStart
**
** Descriptions:	   启动ADC
** input parameters:   uiID      --部件设备号:0-ADC0
**                     pRsv      --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
** Notice :            启动之前,必须先进行ADC初始化.
*********************************************************************************************************/
uint32    adcStart (uint32 uiID, void *pRsv)

{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;

    if (uiID >= __ADC_MAX_NUM) {                                        /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
   
   	IRQDisable();                                                       /*  关IRQ中断                   */
    uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
    puiBaseAddr  = __GpADCInfoData[uiID]->puiAddrBase;

    if (__GpADCInfoData[uiID]->uiBurst == TRUE) {                       /*  硬件控制模式                */
        puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (0x01 << 16);      /*  Burst= 1,立即开始循环扫描   */
        puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] &= (~(0x07 << 24));   /*  Start= 0,Burst时此位不起作用*/
    } else {
        puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (__GpADCInfoData[uiID]->uiStart << 24); 
                                                                        /*  软件控制模式,则更新Start位  */
    }

    IRQEnable();                                                        /*  开IRQ中断                   */
    return (uint32)(OPERATE_SUCCESS); 

}

/*********************************************************************************************************
** Function name:	   adcStop
**
** Descriptions:	   停止ADC
** input parameters:   uiID      --部件设备号:0-ADC0
**                    
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
*********************************************************************************************************/
uint32    adcStop (uint32 uiID)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -