当前位置: 首页 > news >正文

SeanLib系列函数库-MyTimer


查看其它库函数说明,请点击此处跳转到SeanLib主页

1. 本篇内容

本篇讲MyTimer,是一个轻量级的软件定时器/计数器库,基于链表实现,支持动态创建和销毁定时器。适用于嵌入式系统(如 STM32、AVR、ESP32 等平台),可在中断服务程序中调用以实现毫秒级精确定时。
本库依赖链表库 MyList。
主要特性

  1. 支持动态创建/销毁定时器
  2. 支持单次触发或循环触发
  3. 支持有限次数触发(如触发 3 次后自动停止)
  4. 每个定时器可绑定独立的回调函数
  5. 提供暂停、恢复、停止等运行控制
  6. 可作为计数器使用(不依赖系统滴答定时器)
  7. 链表管理,遍历效率高

2. 使用说明

先看头文件,里面定义了一个定时器设备类型,和一个创建定时器的函数,以及一个使定时器时间/计数器增加的函数。头文件内容如下:

#include"MyList.h"#include"SeanLib.h"typedefstruct//定义一个软件定时器,也可以当做计数器使用{unsignedcharRun;//读写,定时器控制,0表示停止,1表示运行unsignedcharTimeOutFlag;//读写,计时时间到标志,1表示时间到unsignedcharBack1;unsignedcharBack2;unsignedintTime;//私有,定时目标时间,单位msunsignedintTick;//私有,实时计数值,单位msunsignedintTrigTimes;//读写,触发次数,0表示始终运行void(*TimeOutFunc)(void);//函数指针,计时时间到时触发该函数void(*Dispose)(void);//函数指针,释放定时器void(*Start)(void);//函数指针,启动或恢复暂停的定时器void(*Pause)(void);//函数指针,暂停定时器void(*Stop)(void);//函数指针,停止定时器}MyTimer_t;/******************************************************************************* * 功 能: 创建一个软定时器,创建之后自动启动 * 参 数: * Time : 定时时间,单位为ms * TimeOut : 函数指针,指定一个定时时间到后触发的函数,不指定就设置为NULL * TrigTimes: 设置该定时器的触发次数,0表示连续触发 * 返回值: 创建成功,返回定时器指针,否则返回空指针NULL *******************************************************************************/MyTimer_t*NewMyTimer(unsignedintTime,void(*TimeOut)(void),unsignedintTrigTimes);/******************************************************************************* * 功 能: 定时器计时函数,每调用一次该函数,所有已开启的定时器时间都会增加 当做定时器使用时,请将该函数放到系统滴答定时中断程序中,计时周期为1ms 当做计数器使用时,请在需要的地方调用该函数 * 参 数: 无 * 返回值: 无 *******************************************************************************/voidMyTimer_Tick(void);

3. 作为定时器的用法

典型用法为定时器,本篇不讲作为计数器的用法,因为要用计数器的话完全可以用一个变量来计数。

3.1 创建定时器

如下代码演示了创建一个定时周期为1s的定时器,用于控制状态灯的闪烁,代码如下:

voidTimer_Init(void){externvoidLED_Flash(void);Tmr_State=NewMyTimer(1000,LED_Flash,0);if(Tmr_State==NULL){Error_Handle(0,"Creat LED Flash Timer failed!");}}MSH_INIT_EXPORT(2,Timer_Init,"Creat Timer");

3.2 编写回调函数

回调函数非必须,当不需要回调函数的时候,创建的时候写NULL即可。
在项目的其它位置编写 LED_Flash 函数:

voidLED_Flash(void){LED_STATE=!LED_STATE;}

该定时器每1000调用一次 LED_Flash 函数,永不停止。

3.3 定时调用MyTimer_Tick

要想使定时器的计时值增加,需要每ms调用一次MyTimer_Tick,使用HAL库的情况下,将 MyTimer_Tick 放入系统滴答定时中断程序中,在项目工程中找到xxx_it.c文件,找到 SysTick_Handler 函数,添加调用 MyTimer_Tick 函数,如下:

voidSysTick_Handler(void){// USER CODE BEGIN SysTick_IRQn 0MyTimer_Tick();//放在此处// USER CODE END SysTick_IRQn 0HAL_IncTick();// USER CODE BEGIN SysTick_IRQn 1// USER CODE END SysTick_IRQn 1}

如果不使用HAL库,你需要创建一个1ms的定时器,在其中断中调用 MyTimer_Tick 函数。
这样程序运行后状态灯就会开始闪烁了。

3.4 其它用法

当不使用回调函数,采用判断 TimeOutFlag 属性的方法时,使用下面语句创建定时器:

voidTimer_Init(void){Timer_500ms=NewMyTimer(500,NULL,0);if(Timer_500ms==NULL){Error_Handle(0,"Creat 500ms Timer failed!");}}MSH_INIT_EXPORT(2,Timer_Init,"Creat 500ms Timer");

应用代码中通过检查 TimeOutFlag 来判断时间有没有到,该标志需要软件清零:

if(Timer_500ms->TimeOutFlag){Timer_500ms->TimeOutFlag=0;LED_STATE=!LED_STATE;//....}

有些时候希望某个操作执行有限次数,比如控制LED亮灭交替3次,可以用有限次数触发的定时器来实现,在创建定时器时设置触发次数为6,因为亮灭一次需要触发两次,代码如下:

voidLED_Flash(void){LED_STATE=!LED_STATE;}voidTimer_Init(void){Tmr_State=NewMyTimer(1000,LED_Flash,6);if(Tmr_State==NULL){Error_Handle(0,"Creat LED Flash Timer failed!");}}MSH_INIT_EXPORT(2,Timer_Init,"Creat Timer");

如此,亮灭3次之后定时器停止,若要再次启动可调用 Start 方法,但需要注意,再次启动后触发次数需要重新设置,若不设置则会连续触发(每秒触发一次)。

4. 特别说明

当使用有限次数触发的定时器时,在停止后(不含暂停)要再次启动前,需要再次设置触发次数,否则会连续触发。

http://www.jsqmd.com/news/673161/

相关文章:

  • 如何在Windows上直接安装安卓应用:APK Installer完整指南
  • OpCore-Simplify:10分钟自动化完成黑苹果配置的智能解决方案
  • 5个核心技术解析:在Windows 10上专业部署Android子系统的完整指南
  • go: Flyweight Pattern
  • Android开发避坑指南:OkHttp3.14+导入时别忘了配置network_security_config.xml
  • 基于KITTI数据集:从LIO-SAM部署到EVO精度评估全流程解析
  • 保姆级教程:用VMware Workstation Pro搭建CFS三层靶场(附宝塔面板配置与网络排错)
  • 【AI面试八股文 Vol.1.1 | 专题6:Checkpoint 机制】Checkpoint机制:状态持久化与断点恢复
  • #官方认证|2026年长三角1大正规通道闸公司排名,上海苏州嘉兴等地骏通智能综合实力遥遥领先 - 十大品牌榜
  • 理性择校:合肥雅思机构排名视角下,哪个更值得优选 - 资讯焦点
  • 【AI大模型】一文读懂预训练语言模型:从原理到应用
  • 强化学习1——初步理解PPO
  • 租天下实业携手卓越前海壹号,0佣金服务赋能湾区企业选址 - 品牌企业推荐师(官方)
  • 训练时train loss和val loss的‘爱恨情仇’:从曲线看懂模型到底在干嘛(附调参实战)
  • 2026年数控折弯机厂家实力推荐:电液/纯电/数控折弯机及模具专业品牌深度解析与选购指南 - 品牌推荐用户报道者
  • 易语言内核驱动读写工具|Drv驱动模块支持进程保护与内存操作(Win7-Win11离线版)
  • 卧室香薰避坑指南:科学选择让深睡不再是难题 - 资讯焦点
  • 重庆地区高压电工证培训机构推荐 - 品牌企业推荐师(官方)
  • 租天下实业携手前海自贸中心,0佣金专业选址赋能湾区企业 - 品牌企业推荐师(官方)
  • 强化学习2——初步理解DPO
  • 构建ClaudeAgent:Worktree+任务隔离
  • 2026 燕郊音乐艺考机构哪家好?5 家热门机构深度对比,三河音乐艺考哪家好 - 品牌企业推荐师(官方)
  • 深圳南山科技核心地标——深圳软件产业基地写字楼全面解析 - 品牌企业推荐师(官方)
  • 如何解决AI对于图片识别大小问题
  • 手把手打造LVGL智能家居控制面板:从密码输入到键盘联动的Text Area全应用
  • kolla-ansible部署openstacl
  • 驾考宝典在线考试系统
  • AI驱动浏览器自动化测试:零脚本实操指南
  • Zotero浏览器插件:终极免费文献管理解决方案的完整指南
  • #官方认证|2026年江浙沪长三角一大正规停车场公司排名,骏通智能综合实力遥遥领先 - 十大品牌榜