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

📄 adc.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 3 页
字号:
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;

    if (uiID >= __ADC_MAX_NUM) {                                        /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	  
   	IRQDisable();                                                       /*  关IRQ中断                   */
    uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
    puiBaseAddr  = __GpADCInfoData[uiID]->puiAddrBase;

    if (__GpADCInfoData[uiID]->uiBurst == TRUE) {                       /*  硬件控制模式                */
        puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] &= (~(0x01 << 16));   /*  Burst = 0,终止重复扫描      */
    } else {
        puiBaseAddr[__B_ADC_ADCR << uiOffsetBase] |= (~(__GpADCInfoData[uiID]->uiStart << 24)); 
                                                                        /*  软件控制模式,则Start位置0   */
    }
    /*
     *  记录状态信息
     */
    __GpADCInfoData[uiID]->uiStart = FALSE;
    IRQEnable();                                                        /*  开IRQ中断                   */
    return (uint32)(OPERATE_SUCCESS); 

}

/*********************************************************************************************************
** Function name:	   adcGetValue
**
** Descriptions:	   读取ADC转换结果
** input parameters:   uiID      --部件设备号:0-ADC0
**                     uiChn     --ADC读取结果通道号
**                     pRsv      --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     读取ADC结果     -- 操作成功
**
** Using example :     
*********************************************************************************************************/
uint32    adcGetValue (uint32 uiID,
                       uint32 uiChn,                    
                       void  *pRsv)

{
             uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    volatile uint32  uiReadAdcData;
    static   uint8   ucRetMsg;
    volatile uint8  *ucDone;   
             uint8   i; 
                  
    /*
     *  检查参数有效性
     */
    if ((uiID >= __ADC_MAX_NUM) ||
        (uiChn > __ADC_CHN_NUM)) {                                      /*  输入通道号值范围为0 ~ 7     */                                      
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
   
    /*
     *  全局参数处理
     */
   	IRQDisable();                                                       /*  关IRQ中断                   */
    uiOffsetBase = __GpADCInfoData[uiID]->uiOffsetBase;
    puiBaseAddr  = __GpADCInfoData[uiID]->puiAddrBase;
   	ucDone       = __GpADCInfoData[uiID]->ucDoneFlg;
    IRQEnable();                                                        /*  开IRQ中断                   */
    
    /*
     *  读取ADC转换结果 中断方式
     */
	if ((ucDone[uiChn] == TRUE) && 
	    ((__GpADCInfoData[uiID]->uiAdcState == ADC_OK) || 
	     (__GpADCInfoData[uiID]->uiAdcState == ADC_PAUSE))) {   
	                                                                    /*  对应通道已转换结束          */
	    for (i = 0; i < __ADC_CHN_NUM; i++) {
	        if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {
		        ucRetMsg &= 0x07;                                       /*  获取所读取的通道号最旧值    */
		        
		        if (ucRetMsg == ucDone[uiChn]) {                        /*  是所要读取的通道号          */
	               if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {               
	                                                                    /*  读取已转换的对应通道值,返回 */
	                                                                                                                      
	                   uiReadAdcData  = ucRetMsg;                       /*  读取10位转换结果的低8位     */
		               
		               if (QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr) == QUEUE_OK) {
		                   uiReadAdcData |= (ucRetMsg << 8);            /*  读取高2位,存入32位变量中    */
		               }
	                   return (uiReadAdcData);
	               }
				} else {                                                /*  丢弃非对应通道后两个字节数据*/
    				QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr); 
    				QueueRead(&ucRetMsg,__GpADCInfoData[uiID]->AdcQueAddr);
				}
			}	
		}		   
	} else {                                                            /*  对应通道正在转换            */
	    return (uint32)(ADC_BUSY); 
	}
    return (uint32)(OPERATE_FAIL); 
}

/*********************************************************************************************************
** Function name:	   __adcIsrSub
**
** Descriptions:	   读取ADC转换结果
** input parameters:   uiID      --部件设备号:0-ADC0
**                     pRsv      --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
**
** Notice:             只对采样结果进行保存,具体处理留给用户处理.
*********************************************************************************************************/
static uint32    __adcIsrSub (uint32 uiID, void *pRsv)

{
           volatile uint32  uiChn;
                    uint32  uiOffsetBase;
           volatile uint32 *puiBaseAddr;
    static volatile uint32  uiAdcData;
           volatile uint8   ucAdcDataH;
           volatile uint8   ucAdcDataL;
                    uint8   ucAdcChnFlg;
                    uint32  uiAdcChn;
                    uint16  usAdcBufNdata;
                    uint16  usAdcBufSize;
                    uint32  uiAdcCtrlState;

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

    uiAdcData    = puiBaseAddr[__B_ADC_ADDR << uiOffsetBase];
    
    /*
     *  记录已转换通道信息
     */
    uiChn = ((uiAdcData >> 24) & 0x07);
    uiChn = ((4 * ((uiChn >> 2) & 0x01)) + (2 * ((uiChn >> 1) & 0x01)) + (1 * ((uiChn >> 0) & 0x01)));
    __GpADCInfoData[uiID]->ucUseChn[uiChn]  = TRUE;
    __GpADCInfoData[uiID]->ucDoneFlg[uiChn] = TRUE;
     
    IRQEnable();                                                        /*  开IRQ中断                   */
    
    /*
     *  读取ADC对应通道转换结果(10位)
     */
    ucAdcDataL = (uint8)((uiAdcData >> 6) & 0xFF);                      /*  读取低8位                   */
    ucAdcDataH = (uint8)((uiAdcData >> 14) & 0x03);                     /*  读取高2位                   */
    __GpADCInfoData[uiID]->uiAdcState = ADC_BUSY;                       /*  ADC工作忙                   */
    uiAdcCtrlState = (__GpADCInfoData[uiID]->uiBurst == TRUE) ? (ADC_BURST) : (ADC_SOFE);
                                                                        /*  记录ADC控制方式状态         */
    
    /*  
     *  AD转换结果处理,数据入队缓冲 
     */ 
    uiAdcChn      = __GpADCInfoData[uiID]->uiChnNum;                    /*  初始化时所记录的通道号个数  */
    usAdcBufNdata = QueueNData(__GpADCInfoData[uiID]->AdcQueAddr);
    usAdcBufSize  = QueueSize (__GpADCInfoData[uiID]->AdcQueAddr);
    
    if ( __GpADCInfoData[uiID]->AdcQueAddr== NULL) {                    /*  检查数据队列是否已创建      */
        return (uint32)(OPERATE_FAIL);
    } 
    if ((uiAdcChn != 0) && (usAdcBufNdata < usAdcBufSize)) {            /*  检查通道号,数据队列是否已满 */
             
	    ucAdcChnFlg = (uint8)(0xA0 | (__GpADCInfoData[uiID]->ucDoneFlg[uiChn] & 0x07));
	    
	    if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcChnFlg)) == QUEUE_OK) {  
		    if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcDataL)) == QUEUE_OK) {              
		        if ((QueueWrite(__GpADCInfoData[uiID]->AdcQueAddr,ucAdcDataH)) == QUEUE_OK) {
		        
		            __GpADCInfoData[uiID]->uiAdcState = ADC_OK;         /*  ADC操作成功                 */
		            __GpADCInfoData[uiID]->uiChnNum--;                  /*  工作通道号减一              */
		            
		            if ((__GpADCInfoData[uiID]->uiChnNum == 0) && (uiAdcCtrlState== ADC_BURST)) {
		                                                                /*  Burst模式下才执行停止       */
		                __GpADCInfoData[uiID]->uiAdcState = ADC_PAUSE;
		                adcStop(uiID);                                  /*  当通道转换完一次循环,停止ADC*/
		            }
		            return (uint32)(OPERATE_SUCCESS); 
		        } 
	        }
	    }
    }
      
    /*
     *  错误处理
     */
    if ((__GpADCInfoData[uiID]->uiChnNum == 0) && (uiAdcCtrlState== ADC_BURST)) {
		                                                                /*  Burst模式下才执行停止       */
		__GpADCInfoData[uiID]->uiAdcState = ADC_PAUSE;
		adcStop(uiID);                                                  /*  当通道转换完一次循环,停止ADC*/
	}
    __GpADCInfoData[uiID]->uiAdcState = (usAdcBufNdata < usAdcBufSize) ? ADC_ERR : ADC_BUF_FULL;                     
    return (uint32)(OPERATE_FAIL);                                      /*  ADC操作失败                 */
}

/*********************************************************************************************************
** Function name:			adc0Isr
** Descriptions:			ADC0中断服务程序
** input parameters:		无
** Returned value:			无
*********************************************************************************************************/
void    adc0Isr (void)
{
	__adcIsrSub(ADC_0,NULL);	                                        /*  调用中断响应函数            */
	adc0Hook();		                                                    /*  调用用户的钩子函数          */
	VICVectAddr = 0x00;                                                 /*  中断处理结束                */
} 


#endif                                                                  /*  ADC_FUN_LIB                 */ 
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/                                     

⌨️ 快捷键说明

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