📄 timer.c
字号:
* 调用内部函数,初始化捕获引脚
*/
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 + -