基于STM32滴答时钟的多任务定时器

基于STM32滴答时钟的多任务定时器

此定时器经过测试,已经可以实现定时器创建、配置开始、停止、删除、状态查询及运行功能(此外优先级与时间片等功能还未完善,后面有空余时间会继续完善)。

概述

声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责。

定时器参数及精度说明:

  1. 触发时间范围1~4294967295ms,指示精度±1ms(最高精度可达0.1ms,需自行配置默认1ms);
  2. 定时器数量范围0~32个,上限可根据实际使用情况和内存大小自定义,默认上限32个;
  3. 定时器状态:初始化、运行、停止、删除;
  4. 定时器执行模式:仅执行一次、重复执行;
  5. 定时器执行形式:以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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值