无限扩展定时器 MultiTimer 移植

之前看过几个大佬做的MultiTimer定时器移植到STM32上,可无限扩展定时器任务,简单实用。站在巨人的肩膀上,今天将MultiTimer的移植操作一遍,在此记录记录

项目移植目的:采用正点原子STM32精英开发板,使用STM32 TIM4定时器扩展出两个定时器,配置两个定时器timer1、timer2,timer1循环1s定时,timer2定时一次2s

1 MultiTimer 简介

MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。

MultiTimer是Github一位大佬0xabin的杰作,附上其项目连接:

https://github.com/0x1abin/MultiTimer

2 MultiTimer 移植

2.1 新建工程,并配置TIM3定时器

  • 用正点原子 STM32精英开发板的第8个例程–定时器中断实验 工程做移植,更改TIM3初始化函数参数,自动重装值arr设置为9,时钟预分频数psc设置为7199,即可得到TM3定时器1ms中断
TIM3_Int_Init(9,7199);

2.2 添加MultiTimer源代码

  • 将下载好的multi_timer文件放入工程的HARDWARE文件夹底下

  • 添加multi_timer源文件

  • 添加multi_timer头文件路径

  • 注意:如果在添加MultiTimer源代码后编译,会有如下错误:

    这是因为MultiTimer的源文件中没有NULL的宏定义,故会报错,添加头文件 #include <stddef.h>即可消除错误,stddef .h 头文件定义了各种变量类型和宏,其中包含有NULL的宏定义

2.3 配置MultiTimer定时器

  • 先申请一个定时器管理handle
struct Timer timer1;
  • 初始化定时器对象,注册定时器回调处理函数,设置定时时间(ms),循环定时触发时间
timer_init(struct Timer* handle, void(*timeout_cb)(), uint32_t timeout, uint32_t repeat);

参数说明:

Timer* handle:确定是操作哪一个定时器

void(*timeout_cb)():该定时器的定时回调处理函数

timeout:定时时间

repeat:循环定时时间

  • 启动定时器
timer_start(&timer1);
  • 设置1ms的硬件定时器循环调用 timer_ticks() 以提供时间基准,在定时器3中断服务程序void TIM3_IRQHandler(void)中添加timer_ticks()
//定时器3中断服务程序
void TIM3_IRQHandler(void)                                 //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)    //检查TIM3更新中断发生与否
		{
		   TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		   timer_ticks();     
		}
}
  • 在主循环调用定时器后台处理函数,将主函数中没用到的程序删除,只保留串口和MultiTimer定时器相关,配置两个定时器timer1、timer2,timer1循环1s定时,timer2定时一次2s,修改主函数
 int main(void)
 {		
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	                            //串口初始化为115200
	TIM3_Int_Init(9,7199);                          //定时为1ms  
	 
    printf("multi timer test...\r\n");
	 	 
    timer_init(&timer1, timer1_callback, 1000, 1000); //1s loop
    timer_start(&timer1);	 
	 
    timer_init(&timer2, timer2_callback, 2000, 0);   //2s  delay
    timer_start(&timer2);
    
   	while(1)
	{
		timer_loop();		   
	}	 
}	 
 
  • 配置完成MultiTimer定时器

3 验证MultiTimer定时器

  • 将配置完成的代码烧写进开发板,在串口调试助手查看串口打印信息

由串口打印信息可知,代码运行结果与咱们项目移植的目标一致,timer1循环1s定时,timer2定时一次2s

好文分享:

  • STM32笔记–芯片电子签名
  • C语言程序设计–hex文件解析
  • 物联网–MQTT协议(八):构建UNSUBSCRIBE、UNSUBACK报文

笔者水平有限,若有错误地方欢迎批评指正,若本文对您有所帮助,转发、分享也是笔者坚持的动力;关注微信公众号,后台回复 MultiTimer 获取MultiTimer源码及移植工程

关注南风过境蜻蜓飞,开启物联网、嵌入式学习之旅

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用和引用中的内容,CH582开发板中使用的定时器是TIM2,并且推荐使用systick定时器来进行精确的延时。所以,CH582的定时器延时函数的使用步骤如下: 1. 配置定时器和延时函数:首先需要配置定时器(可以是基本定时器,也可以是TIM2)和串口的配置,同时还需要配置延时函数(推荐使用systick定时器)来实现精确的延时功能。 2. 编写程序:在程序中定义两个IO口,将其连接到Trig引脚上,用于触发定时器。然后,通过调用定时器延时函数,设置需要延时的时间,然后执行延时操作。 需要注意的是,具体的定时器延时函数的编写可能会因为不同的开发板和开发环境而有所不同。因此,在使用定时器延时函数之前,建议查阅开发板的相关文档和资料,以了解具体的函数接口和使用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [CH582使用MultiTimer软件定时器](https://blog.csdn.net/gg1658608470/article/details/128054432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [STM32单片机 关于超声波模块的学习(1)](https://download.csdn.net/download/weixin_38590520/14032857)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值