📄 lpc_timer.c
字号:
switch(DevNum) {
case TIMER0:
*pExternalMatchValue = Timer0Config.ExtAction[MRNum];
*pAction = Timer0Config.MatchCH[MRNum].Action;
break;
case TIMER1:
*pExternalMatchValue = Timer1Config.ExtAction[MRNum];
*pAction = Timer1Config.MatchCH[MRNum].Action;
break;
default:
return 1;
}
return 0;
}
/*************************************************************************
* 说明:TIMER_GetTimerCapture函数,获得指定定时器的捕获响应信息。
* 参数:LPC_TimerChanel_t DevNum,
* unsigned int CRNum,
* unsigned int * pCaptureValue
* 返回值:int
* 0:成功
* 非0:错误号
*************************************************************************/
int TIMER_GetTimerCapture(LPC_TimerChanel_t DevNum, unsigned int CRNum,
unsigned int * pCaptureValue) {
switch(DevNum) {
case TIMER0:
if (CRNum >= CPCH_MAXNUM-1)
return 1;
*pCaptureValue = Timer0Config.CaptureCH[CRNum].CPValue;
break;
case TIMER1:
if (CRNum >= CPCH_MAXNUM)
return 1;
*pCaptureValue = Timer1Config.CaptureCH[CRNum].CPValue;
break;
default:
return 1;
}
return 0;
}
/******************************************************************************
* 说明:TIMER_SetCaptureAction函数,设置指定定时器的捕获响应触发类型及其他信息
* 参数:LPC_TimerChanel_t DevNum -- 设备号
* unsigned char CPCHNum -- 捕获通道号
* unsigned char TriggerType -- 上升沿 | 下降沿
* bool EnableInt -- 是否产生中断
* void (* Fnpr)(void *) -- 中断函数指针
* void * FnprArg -- 相对参数
* 返回值:int
* 0:成功
* 非0:错误号
*************************************************************************/
int TIMER_SetCaptureAction (LPC_TimerChanel_t DevNum,
unsigned char CPCHNum,
unsigned char TriggerType,
bool EnableInt,
void (* Fnpr)(void *),
void * FnprArg )
{
if (TriggerType > TimerCPTrigger_Rising+TimerCPTrigger_Falling) // 检测有效参数
return 1;
switch (DevNum) {
case TIMER0:
if (CPCHNum > CPCH_MAXNUM-2) // timer0 没有捕获通道3
return 1;
Timer0Config.CaptureCH[CPCHNum].Enable = true;
Timer0Config.CaptureCH[CPCHNum].TriggerType = TriggerType;
T0CCR &= ~(7 << (3*CPCHNum)); // 清除捕获作用
switch (CPCHNum) { // 分配捕获模块引脚
case CH0:
if (TriggerType == 0)
PINSEL0_bit.P0_2 = 0;
else
PINSEL0_bit.P0_2 = 0x2;
break;
case CH1:
if (TriggerType == 0)
PINSEL0_bit.P0_4 = 0;
else
PINSEL0_bit.P0_4 = 0x2;
break;
case CH2:
if (TriggerType == 0)
PINSEL0_bit.P0_6 = 0;
else
PINSEL0_bit.P0_6 = 0x2;
break;
}
if (TriggerType & TimerCPTrigger_Rising) // 设置上升沿捕获
T0CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
if (TriggerType & TimerCPTrigger_Falling) // 设置下降沿捕获
T0CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
if (EnableInt && TriggerType) { // 设置捕获中断
Timer0Config.CaptureCH[CPCHNum].EnableInt = true;
Timer0Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
Timer0Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
T0CCR |= 0x4 << (3*CPCHNum);
}
else {
Timer0Config.CaptureCH[CPCHNum].EnableInt = false;
Timer0Config.CaptureCH[CPCHNum].Fnpr = NULL;
Timer0Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
}
return 0;
case TIMER1:
if (CPCHNum > CPCH_MAXNUM-1)
return 1;
Timer1Config.CaptureCH[CPCHNum].Enable = true;
Timer1Config.CaptureCH[CPCHNum].TriggerType = TriggerType;
T1CCR &= ~(7 << (3*CPCHNum)); // 清除捕获作用
switch (CPCHNum) { // 分配捕获模块引脚
case CH0:
if (TriggerType == 0)
PINSEL0_bit.P0_10 = 0;
else
PINSEL0_bit.P0_10 = 0x2;
break;
case CH1:
if (TriggerType)
PINSEL0_bit.P0_11 = 0x2;
break;
case CH2:
if (TriggerType == 0)
PINSEL1_bit.P0_17 = 0;
else
PINSEL1_bit.P0_17 = 0x2;
break;
case CH3:
if (TriggerType == 0)
PINSEL1_bit.P0_18 = 0;
else
PINSEL1_bit.P0_18 = 0x2;
break;
}
if (TriggerType & TimerCPTrigger_Rising) // 设置上升沿捕获
T1CCR |= TimerCPTrigger_Rising << (3*CPCHNum);
if (TriggerType & TimerCPTrigger_Falling) // 设置下降沿捕获
T1CCR |= TimerCPTrigger_Falling << (3*CPCHNum);
if (EnableInt && TriggerType) { // 设置捕获中断
Timer1Config.CaptureCH[CPCHNum].EnableInt = true;
Timer1Config.CaptureCH[CPCHNum].Fnpr = Fnpr;
Timer1Config.CaptureCH[CPCHNum].FnprArg = FnprArg;
T1CCR |= 0x4 << (3*CPCHNum);
}
else {
Timer1Config.CaptureCH[CPCHNum].EnableInt = false;
Timer1Config.CaptureCH[CPCHNum].Fnpr = NULL;
Timer1Config.CaptureCH[CPCHNum].FnprArg = (void *)0;
}
return 0;
}
return 1;
}
/*************************************************************************
* 说明:TIMER_GetREGValue_CR函数,获得 CR 寄存器的值。
* 参数:LPC_TimerChanel_t DevNum
* int CRNum
* 返回值:unsigned long
*************************************************************************/
unsigned long TIMER_GetREGValue_CR(LPC_TimerChanel_t DevNum, int CRNum) {
switch (DevNum) {
case TIMER0:
switch (CRNum) {
case CPCH0:
return T0CR0;
case CPCH1:
return T0CR1;
case CPCH2:
return T0CR2;
case CPCH3:
return T0CR3;
}
case TIMER1:
switch (CRNum) {
case CPCH0:
return T1CR0;
case CPCH1:
return T1CR1;
case CPCH2:
return T1CR2;
case CPCH3:
return T1CR3;
}
}
return (unsigned int)-1;
}
/*************************************************************************
* 说明:TIMER_GetREGValue_TC函数,获得 TC 寄存器的值
* 参数:LPC_TimerChanel_t DevNum
* 返回值:unsigned long
*************************************************************************/
unsigned long TIMER_GetREGValue_TC(LPC_TimerChanel_t DevNum) {
switch (DevNum) {
case TIMER0:
return T0TC;
case TIMER1:
return T1TC;
}
return (unsigned int)-1;
}
/*************************************************************************
* 说明:TIMER_CheckIntSrc函数,获得定时器中断类型。
* 参数:LPC_TimerChanel_t DevNum
* 返回值:unsigned long
*************************************************************************/
unsigned long TIMER_CheckIntType(LPC_TimerChanel_t DevNum) {
switch (DevNum) {
case TIMER0:
return (T0IR & 0xFF);
case TIMER1:
return (T1IR & 0xFF);
default:
return (unsigned long)-1;
}
}
/*************************************************************************
* 说明:RTC_ClearInt函数,清除定时器中断。
* 参数:LPC_TimerChanel_t DevNum
* int IntType
* 返回值:unsigned long
* 0:成功
* 1:失败
*************************************************************************/
unsigned long TIMER_ClearInt(LPC_TimerChanel_t DevNum, int IntType) {
if (IntType<1 || IntType>0xFF)
return 1;
switch (DevNum) {
case TIMER0:
T0IR = (IntType & 0xFF);
break;
case TIMER1:
T1IR = (IntType & 0xFF);
break;
default:
return 1;
}
return 0;
}
/*************************************************************************
* 说明:TIMER0中断函数
* 参数:无
* 返回值:无
*************************************************************************/
void TIMER0_ISR () {
int IntStatus;
IntStatus = TIMER_CheckIntType(TIMER0);
TIMER_ClearInt(TIMER0, IntStatus);
if (IntStatus & TIMERMR0Int) { // 匹配寄存器中断
(Timer0Config.MatchCH[0].Fnpr)((void *)Timer0Config.MatchCH[0].FnprArg);
}
if (IntStatus & TIMERMR1Int) {
(Timer0Config.MatchCH[1].Fnpr)((void *)Timer0Config.MatchCH[1].FnprArg);
}
if (IntStatus & TIMERMR2Int) {
(Timer0Config.MatchCH[2].Fnpr)((void *)Timer0Config.MatchCH[2].FnprArg);
}
if (IntStatus & TIMERMR3Int) {
(Timer0Config.MatchCH[3].Fnpr)((void *)Timer0Config.MatchCH[3].FnprArg);
}
if (IntStatus & TIMERCR0Int) { // 捕获寄存器中断
Timer0Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH0);
(Timer0Config.CaptureCH[0].Fnpr)((void *)Timer0Config.CaptureCH[0].FnprArg);
}
if (IntStatus & TIMERCR1Int) {
Timer0Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH1);
(Timer0Config.CaptureCH[1].Fnpr)((void *)Timer0Config.CaptureCH[1].FnprArg);
}
if (IntStatus & TIMERCR2Int) {
Timer0Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH2);
(Timer0Config.CaptureCH[2].Fnpr)((void *)Timer0Config.CaptureCH[2].FnprArg);
}
if (IntStatus & TIMERCR3Int) {
Timer0Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER0, CPCH3);
(Timer0Config.CaptureCH[3].Fnpr)((void *)Timer0Config.CaptureCH[3].FnprArg);
}
VICVectAddr = 0; // 清除VIC中断
}
/*************************************************************************
* 说明:TIMER1中断函数
* 参数:无
* 返回值:无
*************************************************************************/
void TIMER1_ISR () {
int IntStatus;
IntStatus = TIMER_CheckIntType(TIMER1);
TIMER_ClearInt(TIMER1, IntStatus);
if (IntStatus & TIMERMR0Int) { // 匹配寄存器中断
(Timer1Config.MatchCH[0].Fnpr)((void *)Timer1Config.MatchCH[0].FnprArg);
}
if (IntStatus & TIMERMR1Int) {
(Timer1Config.MatchCH[1].Fnpr)((void *)Timer1Config.MatchCH[1].FnprArg);
}
if (IntStatus & TIMERMR2Int) {
(Timer1Config.MatchCH[2].Fnpr)((void *)Timer1Config.MatchCH[2].FnprArg);
}
if (IntStatus & TIMERMR3Int) {
(Timer1Config.MatchCH[3].Fnpr)((void *)Timer1Config.MatchCH[3].FnprArg);
}
if (IntStatus & TIMERCR0Int) { // 捕获寄存器中断
Timer1Config.CaptureCH[0].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH0);
(Timer1Config.CaptureCH[0].Fnpr)((void *)Timer1Config.CaptureCH[0].FnprArg);
}
if (IntStatus & TIMERCR1Int) {
Timer1Config.CaptureCH[1].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH1);
(Timer1Config.CaptureCH[1].Fnpr)((void *)Timer1Config.CaptureCH[1].FnprArg);
}
if (IntStatus & TIMERCR2Int) {
Timer1Config.CaptureCH[2].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH2);
(Timer1Config.CaptureCH[2].Fnpr)((void *)Timer1Config.CaptureCH[2].FnprArg);
}
if (IntStatus & TIMERCR3Int) {
Timer1Config.CaptureCH[3].CPValue = TIMER_GetREGValue_CR(TIMER1, CPCH3);
(Timer1Config.CaptureCH[3].Fnpr)((void *)Timer1Config.CaptureCH[3].FnprArg);
}
VICVectAddr = 0; // 清除 VIC 中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -