📄 timer.c
字号:
}
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 + -