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

📄 timer.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 5 页
字号:
          *  调用内部函数,初始化捕获引脚
          */ 
         return (__timerCapGpioInit(GpTimerStruInfoData[uiID],uiParam[CntN],NULL));
    #else 
         return (uint32)(OPERATE_SUCCESS);  
    #endif

}                         

/*********************************************************************************************************
** Function name:    timerGetCount
** Descriptions:     获取定时器对外部计数值
**
** Input parameters: uiID  --部件设备号。0-Time0;1-Time1;2-Time2;3-Time3
**                   pRsv  --保留指针参数,可输入NULL.
** Returned value:   OPERATE_FAIL    -- 操作失败
**                   OPERATE_SUCCESS -- 操作成功
** Using example :   count = timerGetCount( 0, NULL ); 其中,count为一个uint32整型, 保存timerGetCount返回值
** Notice:           设备操作失败的原因是输入不正确的定时器号或参数      
*********************************************************************************************************/
uint32    timerGetCount (uint32 uiID, void *pRsv)

{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    if (uiID >= __TIMER_MAX_NUM) {                                      /*  检查参数是否有效            */
        return (uint32)(OPERATE_FAIL);
    }
    
	pRsv = pRsv ;                                                       /*  防止编译器警告              */

    /*
     *  初始化结构体信息,以防止没有先进行计数功能初始化,结构体信息为空.
     */
    __timerInit(uiID,pRsv); 
    
    uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;             /*  必须在内部初始化后才赋地址值*/
    puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase; 

    return (puiBaseAddr[__B_TIMER_TC << uiOffsetBase]);                 /*  返回计数器中计数值          */
}    
             

/*********************************************************************************************************
** Function name:      timerPWMInit
** Descriptions:       定时器定时功能初始化
** Input parameters:   uiID  --部件设备号 :0-Time0;1-Time1;2-Time2;3-Time3
**                     pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                     关键字 :PWMn:PWM输出通道
                       关键字 :MATn_Value:PWM匹配寄存器值
                       关键字 :PR_data:预分频寄存器值     
                       关键字 :PWM_Cyc:周期值,以微秒为单位,输入范围为1us~100000000us
                               
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
**
** Using example :     char pcArg[] = "MATn_Value=50 PWM_Cyc=100";
**                     timerPWMInit( 0, pcArg, NULL );    表示用定时器0,且周期100us,占空比为50us
** Notice:             设备操作失败的原因是输入不正确的定时器号,PWM采用MR3作为周期控制寄存器,PWMn作为占空比控  

                     制寄存器
**                     本API函数的参数是在FPCLK=11059200Hz的频率下设置的
*********************************************************************************************************/
uint32    timerPWMInit (uint32 uiID,
                         char  *pcArg,
                         void  *pRsv)
{
             uint32  uiValue;
             uint32  uiCyc;
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;

    static   uint32  uiParam[4]={0, -1,0,-1};
    
    if ((uiID >= __TIMER_MAX_NUM) | (pcArg == NULL)) {                  /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}  
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
           
    ImpCmd(Tab_timerPWM, pcArg, uiParam);                                   /*  解析字符串参数              */
    
    /*
     *   检查输入字符参数的有效性
     */
    if (uiParam[MATn_Value] >uiParam[PWM_Cyc] ) {                                        
        return (uint32)(OPERATE_FAIL);
    } 
    if ((uiParam[MATn_Value] == 0)|(uiParam[PWM_Cyc] == 0)) {                                        
        return (uint32)(OPERATE_FAIL);
    }
    if (uiParam[MATn_Value] > 100000000) {                                  
       uiParam[MATn_Value] = 100000000;
    }
    if (uiParam[PWM_Cyc] > 100000000) {                                  
       uiParam[PWM_Cyc] = 100000000;
    }
    if(uiParam[PWMn] > 2){
    return (uint32)(OPERATE_FAIL);
    }  
    /*
     *  初始化器件结构体
     */   
    __timerInit(uiID,pRsv); 
    
    IRQDisable();                                                       /*  关IRQ中断                   */

    GpTimerStruInfoData[uiID]->uiTimerFun[__TIEMR_PWM] = 1;            /*  标志使用了PWM功能          */  
    uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase;
    
    IRQEnable();                                                        /*  开IRQ中断                   */

    /*
     *  设置PWM功能
     */
    
    puiBaseAddr[__B_TIMER_TC     << uiOffsetBase] = 0x00;                 /*  TC = 0;定时器计数器清0      */
    puiBaseAddr[__B_TIMER_PR     << uiOffsetBase] = uiParam[PR_data];      /*  设置PR分频系数,默认为0      */
    puiBaseAddr[__B_TIMER_PWMCON << uiOffsetBase] = 1<<uiParam[PWMn];               /*  设置PWM输出通道      */           

                                                         
    puiBaseAddr[__B_TIMER_MCR  << uiOffsetBase] = 0x0400;               /*  设置MR3匹配后复位TC         */       

   
    
   uiValue = (uint32)(((Fpclk / 1000000) * uiParam[MATn_Value]) / (uiParam[PR_data] + 1));
                                                                        /*  占空比    */
   uiCyc = (uint32)(((Fpclk / 1000000) * uiParam[PWM_Cyc]) / (uiParam[PR_data] + 1));
                                                              
                                                                        /*  周期值    */
    puiBaseAddr[(__B_TIMER_MR0 + uiParam[PWMn])  << uiOffsetBase] = uiValue;  /*  设置时间定时以秒为单位      */ 
    puiBaseAddr[__B_TIMER_MR3  << uiOffsetBase] = uiCyc;               /*  设置时间定时以秒为单位      */        

                                              
    
     #if __TIMER_MAT_GPIO > 0
    
	    /*
	     *  调用匹配引脚设置内部函数
	     */
        return (__timeMatGpioInit (GpTimerStruInfoData[uiID], uiParam[PWMn],NULL));
    #else
        return (uint32)(OPERATE_SUCCESS);
    #endif
}
/*********************************************************************************************************
** Function name:           timer0Isr
** Descriptions:            库函数默认的中断服务函数,进行timer0中断处理,该函数挂接了钩子函数可处理用户任务
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
** Notice:                  在调用中断服务函数之前,必须先有相关功能设置的初始化操作!
*********************************************************************************************************/
void timer0Isr (void)
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    uiOffsetBase = GpTimerStruInfoData[TIME_0]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[TIME_0]->puiAddrBase;
   
    time0Hook();                                                        /*  调用钩子函数                */
    *(uint32*)(puiBaseAddr + (__B_TIMER_IR << uiOffsetBase))= 0xFF;     /*  清除定时器中断标志          */
	VICVectAddr = 0x00;                                                 /*  通知内核中断处理结束        */
}
/*********************************************************************************************************
** Function name:           timer1Isr
** Descriptions:            库函数默认的中断服务函数,进行timer1中断处理,该函数挂接了钩子函数可处理用户任务
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
** Notice:                  在调用中断服务函数之前,必须先有相关功能设置的初始化操作!
*********************************************************************************************************/
void timer1Isr (void)
{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    uiOffsetBase = GpTimerStruInfoData[TIME_1]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[TIME_1]->puiAddrBase;
   
    time1Hook();                                                        /*  调用钩子函数                */
    *(uint32*)(puiBaseAddr + (__B_TIMER_IR << uiOffsetBase))= 0xFF;     /*  清除定时器中断标志          */
	VICVectAddr = 0x00;                                                 /*  通知内核中断处理结束        */
}
/*********************************************************************************************************
** Function name:           timer2Isr
** Descriptions:            库函数默认的中断服务函数,进行timer0中断处理,该函数挂接了钩子函数可处理用户任务
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
** Notice:                  在调用中断服务函数之前,必须先有相关功能设置的初始化操作!
*********************************************************************************************************/
void timer2Isr (void)
{
   
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    uiOffsetBase = GpTimerStruInfoData[TIME_2]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[TIME_2]->puiAddrBase;
   
    time2Hook();                                                        /*  调用钩子函数                */
    *(uint16*)(puiBaseAddr + (__B_TIMER_IR << uiOffsetBase))= 0xFF;     /*  清除定时器中断标志          */
	VICVectAddr = 0x00;                                                 /*  通知内核中断处理结束        */
	
}


/*********************************************************************************************************
** Function name:           timer3Irq
** Descriptions:            库函数默认的中断服务函数,进行timer1中断处理,该函数挂接了钩子函数可处理用户任务
** Input parameters:        NONE
** Output parameters:       NONE
** Returned value:          NONE
** Notice:                  在调用中断服务函数之前,必须先有相关功能设置的初始化操作!
*********************************************************************************************************/
void timer3Isr (void)
{
    static uint32 i;
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    uiOffsetBase = GpTimerStruInfoData[TIME_3]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[TIME_3]->puiAddrBase;
 
   *(uint16*)(puiBaseAddr + (__B_TIMER_IR << uiOffsetBase))= 0xFF;     /*  清除定时器中断标志          */
   if(++i==50){
    time3Hook();                                                        /*  调用钩子函数                */
    }else if(i>=100){
     time3Hook();                                                        /*  调用钩子函数                */
     i=0;
    }
	VICV

⌨️ 快捷键说明

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