基于STM32滴答时钟的多任务定时器
基于STM32滴答时钟的多任务定时器
此定时器经过测试,已经可以实现定时器创建、配置开始、停止、删除、状态查询及运行功能(此外优先级与时间片等功能还未完善,后面有空余时间会继续完善)。
概述
声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责。
定时器参数及精度说明:
- 触发时间范围1~4294967295ms,指示精度±1ms(最高精度可达0.1ms,需自行配置默认1ms);
- 定时器数量范围0~32个,上限可根据实际使用情况和内存大小自定义,默认上限32个;
- 定时器状态:初始化、运行、停止、删除;
- 定时器执行模式:仅执行一次、重复执行;
- 定时器执行形式:以CallBack形式执行(可自定义传参)。
API说明
/*定时器初始化*/
extern TIMER_ENUM SystemTimerInit(void);
/*定时器创建*/
extern TIMER_ENUM SystemTimerCreat(u8 id,u8 priority,timer_handler p_handle);
/*定时器开始*/
extern TIMER_ENUM SystemTimerStart(u8 id,TIMER_MODE mode,u32 time,void *p);
/*定时器停止*/
extern TIMER_ENUM SystemTimerStop(u8 id);
/*定时器删除*/
extern TIMER_ENUM SystemTimerDelete(u8 id);
/*定时器状态查询*/
extern TIMER_RUN_STATE SystemGetTimerState(u8 id);
/*定时器运行函数 提供给主循环调用*/
extern TIMER_ENUM SystemTimerRun(void);
滴答时钟初始化并创建循环链表
TIMER_ENUM SystemTimerInit(void)
{
SystemInit();
/* Setup SysTick Timer for xx ms interrupts */
/* 100->10ms, 1000->1ms, 400->2.5ms, 10000->0.1ms */
if (SysTick_Config(SystemCoreClock / CLOCKS_PER_SEC))
{
/* Capture error */
return FAIL;
}
if(TimerLinkC == NULL)
{
LINK_NODE new_node;
new_node.id = 0xFF;
new_node.callBack = NULL;
TimerLinkC = creat_circular_node(new_node);
if(TimerLinkC == NULL)
{
return FAIL;
}
}
return SUCCEED;
}
滴答时钟初始化: "CLOCKS_PER_SEC"参数在Timer.h中配置,主要用于定时器时间精度和触发周期。
创建循环链表:"TimerLinkC"为定时器存储链表
参数说明:
入参:无
返回:成功/失败/等待
Timer创建
TIMER_ENUM SystemTimerCreat(u8 id,u8 priority,timer_handler p_handle)
{
if(id >= MAX_TIMER)
{
return FAIL;
}
return insert_circular_node(TimerLinkC,id,TIMER_INIT,p_handle);
}
参数说明:
入参:"id"定时器编号不能重复和定时器最大上限 "priority"暂时没用 "p_handle"APP层注册的CallBack,定时器配置完成后提供给定时器调用执行。
返回:成功/失败/等待
Timer开始
TIMER_ENUM SystemTimerStart(u8 id,TIMER_MODE mode,u32 time,void *p)
{
if(id >= MAX_TIMER)
{
return FAIL;
}
return update_circular_list(TimerLinkC,id,mode,time,TIMER_RUNNING,p);
}
参数说明:
入参:"id"定时器编号不能重复和定时器最大上限 "mode"定时器工作模式 "time"定时器触发事件 "p"执行CallBack的入参,可以为NULL也可以自定义数据类型。
返回:成功/失败/等待
Timer停止
TIMER_ENUM SystemTimerStop(u8 id)
{
if(id >= MAX_TIMER)
{
return FAIL;
}
return update_circular_list(TimerLinkC,id,APP_TIMER_MODE_MAX,0,TIMER_STOP,NULL);
}
参数说明:
入参:"id"定时器编号不能重复和定时器最大上限
返回:成功/失败/等待
Timer删除
TIMER_ENUM SystemTimerDelete(u8 id)
{
if(id >= MAX_TIMER)
{
return FAIL;
}
return delete_circular_list(TimerLinkC,id);
}
参数说明:
入参:"id"定时器编号不能重复和定时器最大上限
返回:成功/失败/等待
Timer状态查询
TIMER_RUN_STATE SystemGetTimerState(u8 id)
{
if(id >= MAX_TIMER)
{
return TIMER_ERR;
}
return seek_circular_list(TimerLinkC,id);
}
参数说明:
入参:"id"定时器编号不能重复和定时器最大上限
返回:定时器状态
Timer运行
TIMER_ENUM SystemTimerRun(void)
{
display_circular_list(TimerLinkC);
return SUCCEED;
}
参数说明:
入参:无
返回:运行状态
Demo测试
#include "SoftwareTimer.h"
typedef enum
{
Test1 = 3,
Test2 = 4,
Test3 = 5,
Test4 = 6,
Test5 = 7,
Test6 = 8,
Test7 = 9,
Test8 = 10,
Test9 = 11,
}TimerDef;
u32 TimerBuf[9][50];
void Tset1Function(void *p)
{
static u32 Test1Time;
static u8 Test1Count;
TimerBuf[0][Test1Count ++] = g_Systemtime - Test1Time;
Test1Time = g_Systemtime;
if(Test1Count > 49)
{
Test1Count = 0;
}
}
void Tset2Function(void *p)
{
static u32 Test2Time;
static u8 Test2Count;
TimerBuf[1][Test2Count ++] = g_Systemtime - Test2Time;
Test2Time = g_Systemtime;
if(Test2Count > 49)
{
Test2Count = 0;
}
}
void Tset3Function(void *p)
{
static u32 Test3Time;
static u8 Test3Count;
TimerBuf[2][Test3Count ++] = g_Systemtime - Test3Time;
Test3Time = g_Systemtime;
if(Test3Count > 49)
{
Test3Count = 0;
}
}
void Tset4Function(void *p)
{
static u32 Test4Time;
static u8 Test4Count;
TimerBuf[3][Test4Count ++] = g_Systemtime - Test4Time;
Test4Time = g_Systemtime;
if(Test4Count > 49)
{
Test4Count = 0;
}
}
void Tset5Function(void *p)
{
static u32 Test5Time;
static u8 Test5Count;
TimerBuf[4][Test5Count ++] = g_Systemtime - Test5Time;
Test5Time = g_Systemtime;
if(Test5Count > 49)
{
Test5Count = 0;
}
}
void Tset6Function(void *p)
{
static u32 Test6Time;
static u8 Test6Count;
TimerBuf[5][Test6Count ++] = g_Systemtime - Test6Time;
Test6Time = g_Systemtime;
if(Test6Count > 49)
{
Test6Count = 0;
}
}
void Tset7Function(void *p)
{
static u32 Test7Time;
static u8 Test7Count;
TimerBuf[6][Test7Count ++] = g_Systemtime - Test7Time;
Test7Time = g_Systemtime;
if(Test7Count > 49)
{
Test7Count = 0;
}
}
void Tset8Function(void *p)
{
static u32 Test8Time;
static u8 Test8Count;
TimerBuf[7][Test8Count ++] = g_Systemtime - Test8Time;
Test8Time = g_Systemtime;
if(Test8Count > 49)
{
Test8Count = 0;
}
}
void Tset9Function(void *p)
{
static u32 Test9Time;
static u8 Test9Count;
TimerBuf[8][Test9Count ++] = g_Systemtime - Test9Time;
Test9Time = g_Systemtime;
if(Test9Count > 49)
{
Test9Count = 0;
}
}
void AppTimerTest(void)
{
SystemTimerCreat(Test1,0,Tset1Function);
SystemTimerCreat(Test2,0,Tset2Function);
SystemTimerCreat(Test3,0,Tset3Function);
SystemTimerCreat(Test4,0,Tset4Function);
SystemTimerCreat(Test5,0,Tset5Function);
SystemTimerCreat(Test6,0,Tset6Function);
SystemTimerCreat(Test7,0,Tset7Function);
SystemTimerCreat(Test8,0,Tset8Function);
SystemTimerCreat(Test9,0,Tset9Function);
SystemTimerStart(Test1,APP_TIMER_MODE_REPEATED,10,0);
SystemTimerStart(Test2,APP_TIMER_MODE_REPEATED,200,0);
SystemTimerStart(Test3,APP_TIMER_MODE_REPEATED,30,0);
SystemTimerStart(Test4,APP_TIMER_MODE_REPEATED,400,0);
SystemTimerStart(Test5,APP_TIMER_MODE_REPEATED,50,0);
SystemTimerStart(Test6,APP_TIMER_MODE_REPEATED,600,0);
SystemTimerStart(Test7,APP_TIMER_MODE_REPEATED,70,0);
SystemTimerStart(Test8,APP_TIMER_MODE_REPEATED,800,0);
SystemTimerStart(Test9,APP_TIMER_MODE_REPEATED,90,0);
}
int main()
{
SystemTimerInit();
AppTimerTest();
while(1)
{
SystemTimerRun();
}
}
说明
本想自己做一个属于自己的任务调度与事件处理,但是平时工作太忙这只是一个雏形,后续还会逐步完善的。现目前就只是一个封装好的简易定时器。
再次声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责。
下载链接:https://download.csdn.net/download/qq_39763227/16757181