/***********************************************Copyright (c)*********************************************
** Guangzou ZLG-MCU Development Co.,LTD.
**
** http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: Timer.c
** Last modified Date: 2007-11-05
** Last Version: 2.0
** Descriptions: 定时器函数实现,采用设备描述符来操作
**
**--------------------------------------------------------------------------------------------------------
** Created by: WangGuoguang
** Created date: 2007-10-31
** Version: 1.0
** Descriptions: 此头文件可在config.h中包含.
**
**--------------------------------------------------------------------------------------------------------
** 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中断 */