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

📄 timer.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
📖 第 1 页 / 共 4 页
字号:
/***********************************************Copyright (c)*********************************************
**                                Guangzou ZLG-MCU Development Co.,LTD.
**                                     
**                                       http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			    Timer.c
** Last modified Date:      2007-10-31
** Last Version:		    2.0
** Descriptions:		    定时器函数实现,采用设备描述符来操作
**
**--------------------------------------------------------------------------------------------------------
** Created by:			    WangGuoguang
** Created date:		    2007-10-24
** Version:				    1.0
** Descriptions:		    LPC22xx 系列软件库 定时器功能部件软件包.
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    WangGuoguang 
** Modified Date:		    2007-10-30
** Version:				    1.1
** Descriptions:		    修改库函数的BUG,以及完善功能,降低各个函数间功能配置的耦合性. 
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    WangGuoguang 
** Modified Date:		    2007-10-31
** Version:				    2.0
** Descriptions:		    增加库函数操作的条件判断,以及完善参数过滤. 
**--------------------------------------------------------------------------------------------------------
** Modified by:			    WangGuoguang 
** Modified Date:		    2007-11-05
** Version:				    2.0
** Descriptions:		    增加关中断保护设置处理. 
**
*********************************************************************************************************/

#include "config.h"                                                     /*  系统头文件                  */ 
#include "TimerPrivate.h"                                               /*  软件包内部私有头文件        */              
#include "Timer.h"                                                      /*  软件包内部模块头文件        */

/********************************************************************************************************
   裁剪是否使用此软件包,当 __TIMER_C <=0,从而不编译. 
********************************************************************************************************/

#if TIMER_FUN_LIB > 0 
                                                    
/*********************************************************************************************************
   定义操作TIMER 器件的结构体,有多个器件就需要定义多个结构体
*********************************************************************************************************/

static __TIMER_INFO __Timer0_Data;
static __TIMER_INFO __Timer1_Data;

/*********************************************************************************************************
   下面使用指针数组(结构体指针数组)来保存指向各个定时器(Timer0 ,Timer1 ...)信息结构体的指针,方便对该驱动的扩展
*********************************************************************************************************/

const __PTIMER_INFO     GpTimerStruInfoData[__TIMER_MAX_NUM] = {&__Timer0_Data, &__Timer1_Data};

/*********************************************************************************************************
   下面定义了定时器基地址值,如果有多个定时器(Timer0 ,Timer1 ...)器件可以在该位置添加相应的基地址即可
*********************************************************************************************************/

const uint32    __GuiTimerBaseAddrTab[__TIMER_MAX_NUM] = {TMR0_BASE_ADDR, TMR1_BASE_ADDR };

/*********************************************************************************************************
   下面定义了定时器匹配/捕获功能 管脚功能设置 基地址值宏,只为测试所用.
*********************************************************************************************************/

#if (__TIMER_MAT_GPIO > 0) || (__TIMER_CAP_GPIO > 0)
const uint32    __GuiTPinBaseAddrTab[__TIMER_GPIO_MAX] = {PINSEL_BASE_ADDR};
#endif

/*********************************************************************************************************
** Function name:         __timerInit
**
** Descriptions:          初始化定时器设备结构体,该函数被各个初始化功能函数调用
** Input parameters:      uiID--定时器ID编号
**                        pRsv--保留指针参数,可输入NULL.
** Output parameters:     OPERATE_FAIL    -- 操作失败
** Returned value:        OPERATE_SUCCESS -- 操作成功
**
** Notice:                任一个功能配置部分,必须先调用此函数来初始化器件结构体,从而得到物理地址等信息.   
*********************************************************************************************************/

static uint32    __timerInit (uint32 uiID, void  *pRsv)

{
           uint32 i;
    static uint32 uiMutexID[__TIMER_MAX_NUM] = {FALSE,FALSE};           /*  定义函数重复调用互斥标志    */
                                                                        /*  此处初始化个数,移植时要修改!*/
    
	if (uiID >= __TIMER_MAX_NUM) {                                      /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}    
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
	
	if (uiMutexID[uiID] == FALSE) {
		
		IRQDisable();                                                   /*  关IRQ中断                   */
		
		uiMutexID[uiID] = TRUE;                                         /*  记录已初始化过定时器设备    */
		/*
		 *  初始化器件的结构体信息 
		 */                                                                    
	   	GpTimerStruInfoData[uiID]->uiTimerID = uiID;                            
	   	
	   	for (i = 0; i < 3; i++) {
	   	    GpTimerStruInfoData[uiID]->uiTimerFun[i] = 0;
	   	}
	   	
	   	GpTimerStruInfoData[uiID]->uiTimerInitInfo = TRUE;              /*  标志设备结构体已初始化      */
	   	
	   	/*
	   	 *  获取定时器部件的物理地址
	   	 */
	   	GpTimerStruInfoData[uiID]->uiOffsetBase = __TIMER_OFFSET_BASE;            
	   	GpTimerStruInfoData[uiID]->puiAddrBase  = (uint32*)__GuiTimerBaseAddrTab[uiID];
	   	
	    IRQEnable();                                                    /*  开IRQ中断                   */
    }
   	return (uint32)(OPERATE_SUCCESS);
}   	
   	

/*********************************************************************************************************
** Function name:      timerTimeInit
** Descriptions:       定时器定时功能初始化
** Input parameters:   uiID  --部件设备号 :0-Time0;1-Time1
**			           pcArg --字符串输入指针参数,输入参数格式为:关键字0=值0[空格]关键字1=值1[空格]......
**                             关键字 :TimeOut:定时时间值,以微秒为单位,输入范围为1us~100000000us
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
**
** Using example :     char pcArg[] = "TimeOut=100";
**                     timerTimeInit( 0, pcArg, NULL );    表示用定时器0,且定时100us
** Notice:             设备操作失败的原因是输入不正确的定时器号,定时器定时采用MR0作为匹配寄存器.
**                     本API函数的参数是在FPCLK=11059200Hz的频率下设置的
*********************************************************************************************************/

uint32    timerTimeInit (uint32 uiID,
                         char  *pcArg,
                         void  *pRsv)
{
             uint32  uiTime;
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;

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

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

    /*
     *  设置定时功能
     */
    puiBaseAddr[__B_TIMER_CTCR << uiOffsetBase] = 0x00;                 /*  CTCR = 0;选择定时器模式     */
    puiBaseAddr[__B_TIMER_TC   << uiOffsetBase] = 0x00;                 /*  TC = 0;定时器计数器清0      */
    puiBaseAddr[__B_TIMER_PR   << uiOffsetBase] = uiParam[TimePR];      /*  设置PR分频系数,默认为0      */
                                                                        
    puiBaseAddr[__B_TIMER_MCR  << uiOffsetBase] = 0x03;                 /*  设置MR0匹配后复位TC,并中断 */          
    
    uiTime = (uint32)(((Fpclk / 1000000) * uiParam[TimeOut]) / (uiParam[TimePR] + 1));
                                                                        /*  计算MRx 寄存器的匹配数值    */
    puiBaseAddr[__B_TIMER_MR0  << uiOffsetBase] = uiTime;               /*  设置时间定时以秒为单位      */                                                      
    
    return (uint32)(OPERATE_SUCCESS);

}
   	
/*********************************************************************************************************
** Function name:      timerStart
** Descriptions:       启动定时器
** Input parameters:   uiID  --部件设备号 :0-Time0;1-Time1		          
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
*********************************************************************************************************/
 
uint32    timerStart (uint32 uiID, void  *pRsv)

{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    if (uiID >= __TIMER_MAX_NUM) {                                      /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}    
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
    /*
     *  在开启定时器之前,确保已进行初始化操作,否则返回错误.
     */
    if (GpTimerStruInfoData[uiID]->uiTimerInitInfo == FALSE) {
         return (uint32)(OPERATE_FAIL);
    }
    
	uiOffsetBase = GpTimerStruInfoData[uiID]->uiOffsetBase;
    puiBaseAddr  = GpTimerStruInfoData[uiID]->puiAddrBase;
    
    puiBaseAddr[__B_TIMER_TCR  << uiOffsetBase] = 0x02;                 /* TCR= 2;复位定时器必须如此操作*/
    puiBaseAddr[__B_TIMER_TCR  << uiOffsetBase] = 0x01;                 /* TCR= 1;启动定时器            */ 
 
    return (uint32)(OPERATE_SUCCESS);
}

/*********************************************************************************************************
** Function name:      timerStop
** Descriptions:       停止定时器
** Input parameters:   uiID  --部件设备号 :0-Time0;1-Time1		          
**                     pRsv  --保留指针参数,可输入NULL.
** Output parameters:  OPERATE_FAIL    -- 操作失败
** Returned value:     OPERATE_SUCCESS -- 操作成功
*********************************************************************************************************/

uint32    timerStop (uint32 uiID, void  *pRsv)

{
    volatile uint32  uiOffsetBase;
    volatile uint32 *puiBaseAddr;
    
    if (uiID >= __TIMER_MAX_NUM) {                                      /*  检查参数有效性              */
	    return (uint32)(OPERATE_FAIL);
	}    
	
	pRsv = pRsv ;                                                       /*  为了防止编译器警告          */
    /*
     *  在停止定时器之前,确保定时器已进行工作,否则返回错误.

⌨️ 快捷键说明

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