SYD定时器系统使用说明指导
一、涉及的相关文件注意事项
1.1、文件名:timer.h、timer_handler.h、timer_handler.c、main.c、Syd8801.lib
1.2、说明:
(1)Syd8801.lib:定时器系统算法库
(2)timer.h:相关宏、变量、函数接口声明
(3)timer_handler.h、timer_handler.c:用户定时器事件注册、变量定义、响应函数等
(4)main.c:定时器系统初始化、定时器事件响应
1.3、注意事项
(1)SYD定时器系统使用的定时器1。如果使用SYD定时器系统则用户不能再使用定时器1,定时器0和定时器2开放。
二、涉及相关的宏定义、变量、函数接口声明
在timer.h文件内有如下相关宏、变量、函数声明。
2.1宏定义说明
//定时器使能状态
#define EVT_ENABLE_MODE ((uint8_t) 0x01)
//定时器关闭状态
#define EVT_DISABLE_MODE ((uint8_t) 0x00)
//最大定时器事件数
#define EVT_MAX_NUM ((uint8_t) 0x1F)
//当前定时器事件数
#define EVT_NUM ((uint8_t) 0x06)
//每一个定时器唯一的标识ID
#define EVT_8MS ((uint32_t)0x00000002)
#define EVT_20MS ((uint32_t)0x00000004)
#define EVT_180MS ((uint32_t)0x00000010)
#define EVT_200MS ((uint32_t)0x00000020)
#define EVT_800MS ((uint32_t)0x00000080)
#define EVT_1S ((uint32_t)0x00000040)
2.2 相关变量说明
(1)、定时器事件标志结构体
struct Array_Node{
uint32_t evt_id;
};
(2)、每个定时器事件相关结构体
struct SYD_sysTimer {
struct Array_Node Evt_Array_Node;
void (Timer_Evt_Handle)(void);//voidÊǺ¯ÊýÊý×éÔªËØ·µ»ØÀàÐÍ£¬ÊÇÊý×é²ÎÊýÀàÐÍ
uint32_t Evt_Array_Iterval;
uint8_t Evt_Array_On_Off_Mode;
uint32_t Evt_Array_Trigger_Loop;
uint32_t Evt_Loop_Start_Point;
};
(3)、系统定时器事件结构体变量数组
struct SYD_sysTimer syd_sysTimer[EVT_NUM] = {0};
其中(1)(2)在timer.h文件中声明,用户不能进行修改。(3)在timer_handler.c中定义,用户根据系统当前的定时器事件数进行相应的改变数组的大小,如果使用EVT_NUM,则改变宏的大小即可。
2.3相关函数接口说明
void SYD_Timer_Init(uint8_t event_num, struct SYD_sysTimer p_sysTimer[]);
功能:初始化定时器系统参数
形参:event_num:当前定时器事件总数;p_sysTimer[]:系统定时器事件变量数组
返回值:无
void Timer_Evt_Init(void);
功能:用户定时器事件初始化
形参:无
返回值:无
void Timer_Evt_Start(uint32_t evt_id_para);
功能:开启定时器事件
形参:evt_id_para:定时器事件ID
返回值:无
void Timer_Evt_Stop(uint32_t evt_id_para);
功能:停止定时器事件
形参:evt_id_para:定时器事件ID
返回值:无
void Timer_Evt_Clr(uint32_t evt_id_para);
功能:清除定时器事件
形参:evt_id_para:定时器事件ID
返回值:无
uint8_t Timer_Get_State(uint32_t evt_id_para);
功能:获取定时器事件状态
形参:evt_id_para:定时器事件ID
返回值:0:定时器已停止;1定时器已使能
void Timer_Evt_Creat(uint32_t evt_id_para,uint32_t evt_interval_para,void *evt_handle_para, uint8_t evt_mode_para);
功能:注册一个定时器事件
形参:evt_id_para:定时器事件ID; evt_interval_para:定时器周期; evt_handle_para:定时器句柄函数; evt_mode_para:定时器使能标志
返回值:无
三、添加/删除一个定时器事件
3.1 添加一个定时器事件(如添加一个100ms定时器)
(1)、在timer.h文件增加定时器事件ID宏
#define EVT_100MS ((uint32_t) 0x00000008)
这个宏只能占一个位,且不能和其他定时器事件ID的位重复
(2)、在timer.h文件修改当前定时器事件ID数的宏
#define EVT_NUM ((uint8_t) 0x07)
原先有6个定时器事件,现在增加一个,变为7个
(3)、在timer_handler.c添加一个触发定时器句柄函数,可参看里面的其他定时器
#ifdef EVT_100MS
void Timer_Evt_100ms(void)
{
TIMER_EVT|=EVT_100MS;
}
#endif
(4)、在timer_handler.c的Timer_Evt_List函数内,注册100ms定时器事件,生成触发事件
#ifdef EVT_100MS
Timer_Evt_Creat(EVT_100MS,100,Timer_Evt_100ms,EVT_DISABLE_MODE);
#endif
(5)、在timer_handler.c中定义100ms事件响应函数。如果定时器事件来临,这个函数会在main函数的while(1)中定时器事件轮询中调用。
void Timer_Evt_Handle_100ms(void)
{
//用户具体实现的功能代码
}
(6)、在main函数中调用相关函数初始化定时器系统。
SYD_Timer_Init(EVT_NUM, syd_sysTimer);// 初始化定时器系统参数
Timer_Evt_List(); // 定时器事件注册
Timer_Evt_Init(); //用户定时器事件初始化
这三个函数必须依次调用,顺序不能改变
(7)、在main函数while(1)的定时器标志查询if(TIMER_EVT)中调用100ms事件响应函数
#ifdef EVT_100MS
if(TIMER_EVT&EVT_100MS)
{
Timer_Evt_Handle_100ms();
Timer_Evt_Clr(EVT_100MS);
}
#endif
先判断定时器事件是否为100ms事件,接着调用在timer_handler.c中定义100ms事件响应函数Timer_Evt_Handle_100ms(),最后调用Timer_Evt_Clr(EVT_100MS)清除事件标志,表示事件处理完毕。等待下一次事件触发。
(8)、开启定时器事件
在完成了以上步骤,定期器只是被注册到定时器系统中,并没有启动。用户需要在开启定时器的地方调用void Timer_Evt_Start(uint32_t evt_id_para)函数,并传入对应的事件ID号。例如启动100ms定时器。
Timer_Evt_Start(EVT_100MS);
(9)、停止定时器事件
一旦定时器启动了,就会一直在跑。如果用户想停止定时器事件,则需要调用void Timer_Evt_Stop(uint32_t evt_id_para)函数,并传入对应的事件ID号。如启动100ms定时器。
Timer_Evt_Stop (EVT_100MS);
3.2 删除一个定时器事件(如删除一个100ms定时器)
根据“2.1添加一个定时器事件”,只需要把100ms定时器事件ID的宏注释掉,相应启动和停止的定时器函数注释掉即可。
(1)、注释事件ID宏
//#define EVT_100MS ((uint32_t) 0x00000008)
(2)、注释启动/停止函数
//Timer_Evt_Start(EVT_100MS);
//Timer_Evt_Stop (EVT_100MS);