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

  • 基于STM32滴答时钟的多任务定时器
    • 概述
      • 声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责。
    • API说明
    • 滴答时钟初始化并创建循环链表
    • Timer创建
    • Timer开始
    • Timer停止
    • Timer删除
    • Timer状态查询
    • Timer运行
    • Demo测试
    • 说明
      • 再次声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责。

基于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

基于STM32滴答时钟的多任务定时器相关推荐

  1. STM32滴答时钟[直接用寄存器]

    生活中,我们通过看表来知道当前时间,知道我们在这个点应该做什么事情,那么芯片呢,就通过各种定时器来记录时间,滴答时钟就是定时器的一种,它可以用来做操作系统的节拍(心跳),可以用来计时,可以用来做闹钟, ...

  2. stm32成长记之滴答时钟

    SysTick具体操作可参照: http://www.st.com/content/ccc/resource/technical/document/programming_manual/5b/ca/8 ...

  3. 4、系统滴答时钟SysTick

    写在开篇前: 首先要明确的第一点:学习知识我们都会到网上查询各种资料,但是由于网上资料大多不全 面,我们对于这些资料需要加以自身的理解并对其有所取舍,所以建议网上查来的资料只做引导. 参考作用,最终确 ...

  4. freeRTOS滴答时钟相关源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营[第2期]7 ...

  5. hal库选择滴答时钟函数_stm32h7“理解hal库框架”

    1.按照初始化流程调用的hal库文件 完成初始化工作需要调用到的hal库文件,如下表 序号功能调用hal库文件 1Module Selection(模块选择) Oscillator Values ad ...

  6. stm32f4xx-systick系统滴答时钟

    文章目录 一.系统滴答时钟 1.简介 注意: 2.工作原理(向下计数,向上计数) 3.频率的概念 二.库函数 四.延时函数 1.系统定时器的用途 2.官方示例 3.寄存器 4.毫秒级延时函数 5.微秒 ...

  7. STM32CbueMX之利用滴答时钟delay us

    参考<PM0214: STM32 Cortex®-M4 MCUs and MPUs programming manual.pdf>(STM32 Cortex_-M4内核参考手册.pdf)的 ...

  8. 基于STM32的DS1302时钟芯片驱动

    基于STM32的DS1302时钟芯片驱动 /****************************************************************************** ...

  9. 基于STM32的电子时钟设计

    基于STM32的电子时钟设计 1.设计目的 2.设计具体要求 3.proteus仿真图 4.程序代码 1.设计目的 (1)掌握使用KEIL MDK5进行软件开发的具体流程: (2)掌握硬件电路的设计方 ...

最新文章

  1. Kmeans、Kmeans++和KNN算法比较
  2. 天才基本法_强推|高人气合集狙击蝴蝶天才基本法春日玛格丽特难哄
  3. Ubuntu 16.04卸载一些不必要的预装软件
  4. [SCOI2012] 喵星球上的点名
  5. windows 2003 远程桌面无法使用剪贴板共享纯文本的解决方法(亲测可用)
  6. c语言飞机订票系统作用,C语言飞机订票系统方案
  7. 电商产品设计:后台商品管理设计
  8. 多项式函数的极值点与拐点判别及个数公式
  9. welearn考试切屏会有显示吗_welearn班级测试答案
  10. ECShop 替换手机版购物首页(2)
  11. ios微信公众号或浏览器滚动露底漏网址闪动无法固定
  12. NVIDIA NCCL 源码学习(四)- 建图过程
  13. js阿拉伯数字转中文数字
  14. Android 调用系统裁剪,适配11和12及手机
  15. javaweb——>个人博客项目
  16. 大道至简(读后感)第二章 是懒人造就了方法
  17. 万维网之父Tim Berners-Lee 获得2016年度图灵奖
  18. 小型企业网站服务器推荐,十款数据库服务器大推荐中小企业篇
  19. [Android] 单独编译生成boot.img时mkbootfs: No such file or directory解决方法
  20. E : 子串循环问题 (Ver. I)

热门文章

  1. 七 Jenkins创建任务实现自动化运维部署
  2. Dicom RTSS ROI Physical PropertiesSequence (3006,00B0)的定义和使用
  3. tomcat服务器配置文件虚拟路径,tomcat中如何配置虚拟路径
  4. 微分销功能设计_分销模式新玩法功能业务逻辑_OctShop
  5. ScaleGestureDetector官方代码有坑,缩放图片会不停抖动解决方法
  6. access 英文是什么意思_MOS2019和MOS2016有什么区别?MOS2019难考吗?如何选择微软办公软件考试版本?...
  7. Window 10常用快捷键
  8. linux 触摸屏测试源码_Linux和android下测试键盘和触摸屏
  9. 无限纷争如何找到以前的服务器,无限纷争-死神觉醒新手入门攻略
  10. OA系统之:全流程驱动的会议管理