之前看过几个大佬做的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源码及移植工程