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

📄 timer.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 5 页
字号:
    }
    return (uint32)(OPERATE_SUCCESS);
}

#endif

/*********************************************************************************************************
** Function name:    timerCapInit
** Descriptions:     定时器捕获功能初始化
**
** Input parameters: uiID -- 部件设备号:0-Time0;1-Time1;2-Time2;3-Time3
**                   pcArg-- 字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                           关键字  CapN:   捕获通道选择,0~3分别表示通道0至通道3
**                                   CapMode:捕获控制模式,0表示上升沿捕获,
**                                                         1表示下降沿捕获,
**                                                         2表示上下沿都可以捕获
**                                   CapInt: 中断使能,0表示捕获时不产生中断,1表示捕获时产生中断
**                   pRsv --保留指针参数,可输入NULL.
** Returned value:   OPERATE_FAIL    -- 操作失败
**                   OPERATE_SUCCESS -- 操作成功
** Using example:    char pcArg[] = "CapN=2 CapMode=1 CapInt=0";
**                   timeCapInit( 0, pcArg, NULL );
** Notice:           设备操作失败的原因是输入不正确的定时器号或输入不正确的参数
**********************************************************************************************************/
uint32    timerCapInit (uint32    uiID,
                        char     *pcArg,
                        void     *pRsv)
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    uint32  uiParam[3]={0,1,1};
    
    if ((uiID >= __TIMER_MAX_NUM) | (pcArg == NULL)) {                  /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  防止编译器警告              */
 
    ImpCmd(Tab_CAP, pcArg, uiParam);                                    /*  获取字符参数                */ 
    
    /*
     *  参数过滤处理
     */
    if ((uiParam[CapN]    < 4) &&
        (uiParam[CapMode] < 3) &&
        (uiParam[CapInt]  < 2)) {
        
        /*
         *  初始化器件结构体
         */   
        __timerInit(uiID,pRsv); 
        
        IRQDisable();                                                   /*  关IRQ中断                   */

	    GpTimerStruInfoData[uiID]->uiTimerFun[__TIMER_CAP] = 1;         /*  标志使用了捕获功能          */
        uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;         /*  必须在内部初始化后才赋地址值*/
        puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase; 

        IRQEnable();                                                    /*  开IRQ中断                   */
        
        /*
         *  捕获功能设置
         */
        puiBaseAddr[__B_TIMER_CCR << uiOffsetBase] &= (~(0x07 << uiParam[CapN]));
                                                                        /*  CCR对应通道参数设置位清零   */	
        puiBaseAddr[__B_TIMER_CCR << uiOffsetBase] |= (uiParam[CapInt] << ((uiParam[CapN] * 3) + 2));                                                                
                                                                        /*  选择捕获中断                */
        switch (uiParam[CapMode]) {
        case __TIME_UP:
            puiBaseAddr[__B_TIMER_CCR << uiOffsetBase] |= (0x01 << ((uiParam[CapN] * 3) + 0));
            break;
        case __TIME_DOWN:
            puiBaseAddr[__B_TIMER_CCR << uiOffsetBase] |= (0x01 << ((uiParam[CapN] * 3) + 1));
            break;
        case __TIME_DOUBLE:
            puiBaseAddr[__B_TIMER_CCR << uiOffsetBase] |= (0x03 << ((uiParam[CapN] * 3) + 0));
            break;
        default: 
            return (uint32)(OPERATE_FAIL);                              /*  返回参数错误                */
        }

     } else {
         return (uint32)(OPERATE_FAIL);                                 /*  返回参数错误                */
     }
     #if __TIMER_CAP_GPIO > 0
     
         /*
          *  调用内部函数,初始化捕获引脚
          */ 
          return (__timerCapGpioInit(GpTimerStruInfoData[uiID],uiParam[CapN],NULL));
     #else 
          return (uint32)(OPERATE_SUCCESS);  
     #endif
}                       

/*********************************************************************************************************
** Function name:    timerGetCap
** Descriptions:     获取选定捕获寄存器值
**
** Input parameters: uiID  --部件设备号。0-Time0;1-Time1;2-Time2;3-Time3
**                   pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                           关键字 :CapGetN :0~3分别表示通道CR0至通道CR3
**                   pRsv  --保留指针参数,可输入NULL.
** Returned value:   操作失败 --OPERATE_FAIL 
**                   操作成功 --返回所选择的捕获通道数值.
** Using example :   char pcArg[] = "CapGetN=0";
**                   timerGetCap( 0, pcArg, 0 );
** Notice:           设备操作失败的原因是输入不正确的定时器号或参数
*********************************************************************************************************/
uint32    timerGetCap (uint32  uiID,
                       char   *pcArg,
                       void   *pRsv)
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    uint32  uiParam[1]={0};
    
     if ((uiID >= __TIMER_MAX_NUM) | (pcArg == NULL)) {                 /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  防止编译器警告              */
 
    ImpCmd(Tab_GetCrN, pcArg, uiParam);                                 /*  获取字符参数                */ 
    
    /*
     *  参数过滤处理
     */
    if (uiParam[CapGetN] > 4) {
        return (uint32)(OPERATE_FAIL);
    }  
    
    /*
     *  初始化结构体信息,以防止没有先进行计数功能初始化,结构体信息为空.
     */
    __timerInit(uiID,pRsv); 
    
    uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;             /*  必须在内部初始化后才赋地址值*/
    puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase; 

    switch (uiParam[CapGetN]) {
    case 0:
        return (puiBaseAddr[__B_TIMER_CR0 << uiOffsetBase]);            /*  CR0:返回给调用函数 计数值   */
    case 1:
        return (puiBaseAddr[__B_TIMER_CR1 << uiOffsetBase]);            /*  CR1:返回给调用函数 计数值   */
    case 2:
        return (puiBaseAddr[__B_TIMER_CR2 << uiOffsetBase]);            /*  CR2:返回给调用函数 计数值   */
    case 3:
        return (puiBaseAddr[__B_TIMER_CR3 << uiOffsetBase]);            /*  CR3:返回给调用函数 计数值   */
    default:
        {return (uint32)(OPERATE_FAIL);}
    }
}

/*********************************************************************************************************
** Function name:    timerCountInit( )
** Descriptions:     定时器外部计数功能初始化
**
** Input parameters: uiID  --部件设备号。0-Time0;1-Time1;2-Time2;3-Time3
**                   pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                          关键字 :CntN :计数采样通道选择,0~3分别表示通道0(CAPn.0)至通道3(CAPn.3)
**                                   CntMode :计数控制模式,  0表示CAP输入的上升沿递增计数,
**                                                             1表示CAP输入的下降沿递增计数,
**                                                             2表示CAP输入的上下沿都可以进行计数
**                   pRsv --保留指针参数,可输入NULL.
** Returned value:   OPERATE_FAIL    -- 操作失败
**                   OPERATE_SUCCESS -- 操作成功
** Using example :   char pcArg[] = "CntN=2 CntMode=1";
**                   timerCountInit( 0, pcArg, NULL );
** Notice:           设备操作失败的原因是输入不正确的定时器号
** Modify Date:      2007-10-31 修改程序存在缺陷,没有对捕获功能进行配置,故无法正确配置.现已加上对CCR操作.
*********************************************************************************************************/
uint32    timerCountInit (uint32   uiID,
                          char    *pcArg,
                          void    *pRsv)
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    uint32  uiParam[3]={0,0,1};
    
    if ((uiID >= __TIMER_MAX_NUM) | (pcArg == NULL)) {                  /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  防止编译器警告              */
 
    ImpCmd(Tab_COUNT, pcArg, uiParam);                                  /*  获取字符参数                */ 
    
    /*
     *  参数过滤处理
     */
    if ((uiParam[CntN] > 4) || (uiParam[CntMode] > 3)) {
        return (uint32)(OPERATE_FAIL);
    }
    
    /*
     *  初始化器件结构体
     */   
    __timerInit(uiID,pRsv); 
    
    IRQDisable();                                                       /*  关IRQ中断                   */
    
	GpTimerStruInfoData[uiID]->uiTimerFun[__TIEMR_COUNT] = 1;           /*  标志使用了计数功能          */
    uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;             /*  必须在内部初始化后才赋地址值*/
    puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase; 
    
    IRQEnable();                                                        /*  开IRQ中断                   */
    
    /*
     *  计数功能设置
     */
    puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] &= (~(0x03 << 0)	    /*  将计数控制寄存器 模式位清零 */
                                                |    (0x03 << 2));      /*  将计数控制寄存器 通道位清零 */
    puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] |= (uiParam[CntN] << 2);/*  设置对应的计数输入通道号    */                                                                
         
    puiBaseAddr[__B_TIMER_CCR << uiOffsetBase ] &= (~(0x07 << uiParam[CntN]));
                                                                        /*  CCR对应通道参数设置位清零   */	
    puiBaseAddr[__B_TIMER_CCR << uiOffsetBase ] |= (uiParam[CountInt] << ((uiParam[CntN] * 3) + 2));                                                                
                                                                        /*  选择捕获中断                */
    switch (uiParam[CntMode]) {                                         /*  设置对应计数输入通道采样边沿*/
    case __TIME_UP:
        puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] |= (0x01 << 0);
        puiBaseAddr[__B_TIMER_CCR  << uiOffsetBase] |= (0x01 << ((uiParam[CntN] * 3) + 0));
        break;
    case __TIME_DOWN:
        puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] |= (0x02 << 0);
        puiBaseAddr[__B_TIMER_CCR  << uiOffsetBase] |= (0x01 << ((uiParam[CntN] * 3) + 1));
        break;
    case __TIME_DOUBLE:
        puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] |= (0x03 << 0);
        puiBaseAddr[__B_TIMER_CCR  << uiOffsetBase] |= (0x03 << ((uiParam[CntN] * 3) + 0));
        break;
    default:
        {return (uint32)(OPERATE_FAIL);}                                /*  返回参数错误                */
    
    }

    #if __TIMER_CAP_GPIO > 0
    
         /*

⌨️ 快捷键说明

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