📄 time.c
字号:
/******************************************************************************************
** 文件名称: Time.c
** 文件描述: LPC2103 定时器操作软件包。
******************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** 函数名称: uint8 T0CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
** 功能描述: 定时器0捕获模式初始化
** 输 入: CAP_MODE 捕获方式,按位操作方式。
** bit0:1--CAP上跳沿捕获
** bit1:1--CAP下降沿捕获
** CAPn 捕获通道选择,0~2
** Int_En 中断使能
** 0:发生捕获事件时,不产生中断
** 1:发生捕获事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:函数中已经包含了引脚设置。
********************************************************************************************************/
uint8 T0CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
{
if(CAP_MODE>3) return(0); //参数不合理,直接返回
if(CAPn>3) return(0);
if(Int_En>1) return(0);
switch(CAPn) //设置相关引脚
{
case 0: //CAP0.0--P0.2
PINSEL0 = PINSEL0 & (~(3<<4)) | (2<<4);
break;
case 1: //CAP0.1--P0.4
PINSEL0 = PINSEL0 & (~(3<<8)) | (2<<8);
break;
case 2: //CAP0.2--P0.6
PINSEL0 = PINSEL0 & (~(3<<12)) | (2<<12);
break;
default:
break;
}
T0TCR = 0x03; //在设置之前,先将定时器复位
T0IR = T0IR|(1<<(CAPn+4)); //清除中断标志位
//设置捕获控制寄存器,不会影响其它位
T0CCR = (T0CCR&(~(3<<(CAPn*3))))|(CAP_MODE<<(CAPn*3))|(Int_En<<(CAPn*3+2));
// 相关位清零 捕获方式位 中断位
T0TCR = 0x01; //启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T1CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
** 功能描述: 定时器1捕获模式初始化
** 输 入: CAP_MODE 捕获方式,按位操作方式。
** bit0:1--CAP上跳沿捕获
** bit1:1--CAP下降沿捕获
** CAPn 捕获通道选择,0~3
** Int_En 中断使能
** 0:发生捕获事件时,不产生中断
** 1:发生捕获事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:函数中已经包含了引脚设置。
********************************************************************************************************/
uint8 T1CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
{
if(CAP_MODE>3) return(0); //参数不合理,直接返回
if(CAPn>3) return(0);
if(Int_En>1) return(0);
switch(CAPn) //设置相关引脚
{
case 0: //CAP1.0--P0.10
PINSEL0 = PINSEL0 & (~(3<<20)) | (2<<20);
break;
case 1: //CAP1.1--P0.11
PINSEL0 = PINSEL0 & (~(3<<22)) | (2<<22);
break;
case 2: //CAP1.2--P0.17
PINSEL1 = PINSEL1 & (~(3<<2)) | (2<<2);
break;
case 3: //CAP1.2--P0.18
PINSEL1 = PINSEL1 & (~(3<<4)) | (2<<4);
break;
default:
break;
}
T1TCR = 0x03; //在设置之前,先将定时器复位
T1IR = T1IR|(1<<(CAPn+4)); //清除中断标志位
//设置捕获控制寄存器,不会影响其它位
T1CCR = (T1CCR&(~(3<<(CAPn*3))))|(CAP_MODE<<(CAPn*3))|(Int_En<<(CAPn*3+2));
// 相关位清零 捕获方式位 中断位
T1TCR = 0x01; //启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T2CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
** 功能描述: 定时器1捕获模式初始化
** 输 入: CAP_MODE 捕获方式,按位操作方式。
** bit0:1--CAP上跳沿捕获
** bit1:1--CAP下降沿捕获
** CAPn 捕获通道选择,0~2
** Int_En 中断使能
** 0:发生捕获事件时,不产生中断
** 1:发生捕获事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:函数中已经包含了引脚设置。
********************************************************************************************************/
uint8 T2CAP_Init(uint8 CAP_MODE,uint8 CAPn,uint8 Int_En)
{
if(CAP_MODE>3) return(0); //参数不合理,直接返回
if(CAPn>2) return(0);
if(Int_En>1) return(0);
switch(CAPn) //设置相关引脚
{
case 0: //CAP2.0--P0.27
PINSEL1 = PINSEL1 & (~(3<<22)) | (2<<22);
break;
case 1: //CAP2.1--P0.28
PINSEL1 = PINSEL1 & (~(3<<24)) | (2<<24);
break;
case 2: //CAP2.2--P0.29
PINSEL1 = PINSEL1 & (~(3<<26)) | (2<<26);
break;
default:
break;
}
T2TCR = 0x03; //在设置之前,先将定时器复位
T2IR = T2IR|(1<<(CAPn+4)); //清除中断标志位
//设置捕获控制寄存器,不会影响其它位
T2CCR = (T2CCR&(~(3<<(CAPn*3))))|(CAP_MODE<<(CAPn*3))|(Int_En<<(CAPn*3+2));
// 相关位清零 捕获方式位 中断位
T2TCR = 0x01; //启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T0MAT_Init(uint32 time,uint32 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
** 功能描述: 定时器0匹配模式初始化
** 输 入: time 匹配时间,该值会直接写入到匹配寄存器中
** PR_data 预分频寄存器的值
** T_MODE 匹配控制模式
** 0:匹配时,定时器复位
** 1:匹配时,定时器停止
** EXT_MODE 匹配时,外部输出控制
** 0:不执行任何动作
** 1:外部匹配输出0
** 2:外部匹配输出1
** 3:外部匹配输出翻转
** MATn 匹配通道选择,0~2
** Int_En 中断使能
** 0:发生匹配事件时,不产生中断
** 1:发生匹配事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:使用中,如果匹配时,匹配引脚有动作,那么,程序中已经将相关引脚进行了初始化
********************************************************************************************************/
uint8 T0MAT_Init(uint32 time,uint32 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
{
if(T_MODE>1) return(0); //参数不合理,直接返回
if(EXT_MODE>3) return(0);
if(MATn>3) return(0);
if(Int_En>1) return(0);
if(EXT_MODE) //设置相关引脚
{
switch(MATn)
{
case 0: //设置MAT0.0--P0.3
PINSEL0 = PINSEL0 & (~(3<<6)) | (2<<6);
break;
case 1: //设置MAT0.1--P0.5
PINSEL0 = PINSEL0 & (~(3<<10)) | (2<<10);
break;
case 2: //设置MAT0.2--P0.16
PINSEL1 = PINSEL1 & (~0x03) | 0x02;
break;
default:
break;
}
}
T0TCR = 0x03; //在设置之前,先将定时器复位
T0IR = T0IR|(1<<MATn); //清除中断标志位
T0PR = PR_data; //设置预分频器
*(uint32 *)((&T0MR0)+MATn) = time; //设置匹配寄存器
T0MCR = T0MCR&(~(7<<(MATn*3)))|(1<<(MATn*3+1+T_MODE))|(Int_En<<(MATn*3));
// 相关位清零 定时器匹配控制位 中断位
T0EMR = T0EMR&(~(3<<(MATn*2+4)))|(EXT_MODE<<(MATn*2+4));
T0TCR = 0x01; //重新启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T1MAT_Init(uint32 time,uint32 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
** 功能描述: 定时器1匹配模式初始化
** 输 入: time 匹配时间,该值会直接写入到匹配寄存器中
** PR_data 预分频寄存器的值
** T_MODE 匹配控制模式
** 0:匹配时,定时器复位
** 1:匹配时,定时器停止
** EXT_MODE 匹配时,外部输出控制
** 0:不执行任何动作
** 1:外部匹配输出0
** 2:外部匹配输出1
** 3:外部匹配输出翻转
** MATn 匹配通道选择,0~3
** Int_En 中断使能
** 0:发生匹配事件时,不产生中断
** 1:发生匹配事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:使用中,如果匹配时,匹配引脚有动作,那么,程序中已经将相关引脚进行了初始化
********************************************************************************************************/
uint8 T1MAT_Init(uint32 time,uint32 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
{
if(T_MODE>1) return(0); //参数不合理,直接返回
if(EXT_MODE>3) return(0);
if(MATn>3) return(0);
if(Int_En>1) return(0);
if(EXT_MODE) //设置相关引脚
{
switch(MATn)
{
case 0: //设置MAT1.0--P0.12
PINSEL0 = PINSEL0 & (~(3<<24)) | (2<<24);
break;
case 1: //设置MAT1.1--P0.13
PINSEL0 = PINSEL0 & (~(3<<26)) | (2<<26);
break;
case 2: //设置MAT1.2--P0.19
PINSEL1 = PINSEL1 & (~(3<<6)) | (2<<6);
break;
case 3: //设置MAT1.3--P0.20
PINSEL1 = PINSEL1 & (~(3<<8)) | (2<<8);
break;
default:
break;
}
}
T1TCR = 0x03; //在设置之前,先将定时器复位
T1IR = T1IR|(1<<MATn); //清除中断标志位
T1PR = PR_data; //设置预分频器
*(uint32 *)((&T1MR0)+MATn) = time; //设置匹配寄存器
T1MCR = T1MCR&(~(7<<(MATn*3)))|(1<<(MATn*3+1+T_MODE))|(Int_En<<(MATn*3));
// 相关位清零 定时器匹配控制位 中断位
T1EMR = T1EMR&(~(3<<(MATn*2+4)))|(EXT_MODE<<(MATn*2+4));
T1TCR = 0x01; //启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T2MAT_Init(uint16 time,uint16 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
** 功能描述: 定时器0匹配模式初始化
** 输 入: time 匹配时间,该值会直接写入到匹配寄存器中
** PR_data 预分频寄存器的值
** T_MODE 匹配控制模式
** 0:匹配时,定时器复位
** 1:匹配时,定时器停止
** EXT_MODE 匹配时,外部输出控制
** 0:不执行任何动作
** 1:外部匹配输出0
** 2:外部匹配输出1
** 3:外部匹配输出翻转
** MATn 匹配通道选择,0~2
** Int_En 中断使能
** 0:发生匹配事件时,不产生中断
** 1:发生匹配事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:使用中,如果匹配时,匹配引脚有动作,那么,程序中已经将相关引脚进行了初始化
********************************************************************************************************/
uint8 T2MAT_Init(uint16 time,uint16 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
{
if(T_MODE>1) return(0); //参数不合理,直接返回
if(EXT_MODE>3) return(0);
if(MATn>3) return(0);
if(Int_En>1) return(0);
if(EXT_MODE) //设置相关引脚
{
switch(MATn)
{
case 0: //设置MAT2.0--P0.7
PINSEL0 = PINSEL0 & (~(3<<14)) | (2<<14);
break;
case 1: //设置MAT2.1--P0.8
PINSEL0 = PINSEL0 & (~(3<<16)) | (2<<16);
break;
case 2: //设置MAT2.2--P0.9
PINSEL0 = PINSEL0 & (~(3<<18)) | (2<<18);
break;
default:
break;
}
}
T2TCR = 0x03; //在设置之前,先将定时器复位
T2IR = T2IR|(1<<MATn); //清除中断标志位
T2PR = PR_data; //设置预分频器
*(uint32 *)((&T2MR0)+MATn) = time; //设置匹配寄存器
T2MCR = T2MCR&(~(7<<(MATn*3)))|(1<<(MATn*3+1+T_MODE))|(Int_En<<(MATn*3));
// 相关位清零 定时器匹配控制位 中断位
T2EMR = T2EMR&(~(3<<(MATn*2+4)))|(EXT_MODE<<(MATn*2+4));
T2TCR = 0x01; //重新启动定时器
return(1);
}
/*********************************************************************************************************
** 函数名称: uint8 T3MAT_Init(uint16 time,uint16 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
** 功能描述: 定时器0匹配模式初始化
** 输 入: time 匹配时间,该值会直接写入到匹配寄存器中
** PR_data 预分频寄存器的值
** T_MODE 匹配控制模式
** 0:匹配时,定时器复位
** 1:匹配时,定时器停止
** EXT_MODE 匹配时,外部输出控制
** 0:不执行任何动作
** 1:外部匹配输出0
** 2:外部匹配输出1
** 3:外部匹配输出翻转
** MATn 匹配通道选择,0~3
** Int_En 中断使能
** 0:发生匹配事件时,不产生中断
** 1:发生匹配事件时,产生中断
** 输 出: 0 :初始化失败
** 1 :初始化成功
** 说明:使用中,如果匹配时,匹配引脚有动作,那么,程序中已经将相关引脚进行了初始化
********************************************************************************************************/
uint8 T3MAT_Init(uint16 time,uint16 PR_data,uint8 T_MODE,uint8 EXT_MODE,uint8 MATn,uint8 Int_En)
{
if(T_MODE>1) return(0); //参数不合理,直接返回
if(EXT_MODE>3) return(0);
if(MATn>3) return(0);
if(Int_En>1) return(0);
if(EXT_MODE) //设置相关引脚
{
switch(MATn)
{
case 0: //设置MAT3.0--P0.21
PINSEL1 = PINSEL1 & (~(3<<10)) | (2<<10);
break;
case 1: //设置MAT3.1--P0.0
PINSEL0 = PINSEL0 & (~0x03) | 0x02;
break;
case 2: //设置MAT3.2--P0.1
PINSEL0 = PINSEL0 & (~(3<<2)) | (2<<2);
break;
case 3: //设置MAT3.3--P0.30
PINSEL1 = PINSEL1 & (~(3<<28)) | (2<<28);
break;
default:
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -