首页 > 其他分享 >【stm32】软件定时器

【stm32】软件定时器

时间:2024-08-05 15:58:01浏览次数:8  
标签:定时器 soft bsp unsigned timer stm32 TIMER 软件 SOFT

【stm32】软件定时器


文章目录

为什么

为什么会想着搞个软件定时器呢?

之前的esp8266模块的通信,用的延时阻塞去实现的,对主程序影响挺大的。想着改改,不想上freertos啥的操作系统,就想着之前看4G模块厂家提供有的4G模块使用例程有用到软件延时去实验通信,随即就有了仿写的想法。

软件定时器

本人理解,其实是对定时器+状态机的一个封装,不阻塞的情况下,实现延时的效果。参考解释可见参考链接,代码实现也几乎全部参考此链接。

相关代码

bsp_soft_timer.h

/**
 * author:临木木
 * 适用于stm32裸机的软件定时器
 * 主程序启用前运行bsp_soft_timer_init()函数初始化软件定时器
 * bsp_soft_timer_start()函数开启你所需要的软件定时器,bsp_soft_timer_stop()函数停止,注意SOFT_TIMER_NUM
 * bsp_soft_timer_update()函数用于更新软件定时器状态,建议放置在主循环内
 * bsp_soft_timer_state_get()函数可用于获取软件定时器现所处的运行状态
 * 如无需调用回调函数,可选择设置调用函数为soft_timer_nop_callback()函数来实现
 */
#ifndef __BSP_SOFT_TIMER_H__
#define __BSP_SOFT_TIMER_H__


#define SOFT_TIMER_NUM		3		/* 最大 255 */

typedef enum SOFT_TIMER_STATE
{
    SOFT_TIMER_STOPPED = 0,  		/* 停止 */
    SOFT_TIMER_RUNNING = 1, 	 	/* 运行 */
    SOFT_TIMER_TIMEOUT = 2   		/* 超时 */
} SOFT_TIMER_STATE;					/* 软件定时器状态 */

typedef enum SOFT_TIMER_MODE
{
    SOFT_TIMER_MODE_ONE_SHOT = 0,   /* 单次模式 */
    SOFT_TIMER_MODE_PERIODIC = 1,	/* 周期模式 */
} SOFT_TIMER_MODE;					/* 运行模式 */	

typedef void (*soft_timer_callback)(void *argv, unsigned short int argc);


void bsp_soft_timer_init
	(
	void
	);
	
void bsp_soft_timer_start
	(
	unsigned char 		id,
	unsigned char		mode,
	unsigned int		delay,
	soft_timer_callback	callback,		
	void 				*argv,			
	unsigned short int	argc		
	);
	
void bsp_soft_timer_stop
	(
	unsigned char id
	);
	
void bsp_soft_timer_update
	(
	void
	);
	
unsigned char bsp_soft_timer_state_get
	(
	unsigned char id
	);
	
void bsp_soft_timer_nop_callback
	(
	void 				*argv, 
	unsigned short int 	argc
	);


#endif

bsp_soft_timer.c

#include "./soft_timer/bsp_soft_timer.h"

#include <stdio.h>
#include "main.h"


typedef struct stru_soft_timer
{
    unsigned char 		state; 			/* 状态 */
    unsigned char		mode;       	/* 模式 */
	unsigned int 		delay;			/* 定时时间 */
	unsigned int 		end_tick;		/* 到期时间 */
	soft_timer_callback	callback;		/* 回调函数指针 */
	void 				*argv; 			/* 回调函数参数指针 */
	unsigned short int	argc;			/* 回调函数参数个数 */
} stru_soft_timer_t;


static stru_soft_timer_t timer[SOFT_TIMER_NUM];


/* bsp_soft_timer_init:初始化软件定时器 */
void bsp_soft_timer_init
	(
	void
	)
{
	for (int i = 0; i < SOFT_TIMER_NUM; i++)
	{
		timer[i].state 		= SOFT_TIMER_STOPPED;
		timer[i].mode  		= SOFT_TIMER_MODE_ONE_SHOT;
		timer[i].delay		= 0;
		timer[i].end_tick 	= 0;
		timer[i].callback 	= NULL;
		timer[i].argv		= NULL;
		timer[i].argc		= 0;
	}
}

/* bsp_soft_timer_start:开启软件定时器 
 * id			启用的软件定时器编号
 * mode			运行模式
 * delay		定时时间
 * callback		回调函数
 * argv			参数
 * arvc 		参数个数 */
void bsp_soft_timer_start
	(
	unsigned char 		id,
	unsigned char		mode,
	unsigned int		delay,
	soft_timer_callback	callback,		
	void 				*argv,			
	unsigned short int	argc		
	)
{
	assert_param(id < SOFT_TIMER_NUM);
	assert_param(mode == SOFT_TIMER_MODE_ONE_SHOT || mode == SOFT_TIMER_MODE_PERIODIC);
	
	timer[id].state 	= SOFT_TIMER_RUNNING;
	timer[id].mode  	= mode;
	timer[id].delay		= delay;
	timer[id].end_tick 	= HAL_GetTick() + delay;
	timer[id].callback 	= callback;
	timer[id].argv		= argv;
	timer[id].argc		= argc;
}

/* bsp_soft_timer_update:停止软件定时器 
 * id		停止的软件定时器编号 */
void bsp_soft_timer_stop
	(
	unsigned char id
	)
{
	assert_param(id < SOFT_TIMER_NUM);
	
	timer[id].state = SOFT_TIMER_STOPPED;
}
		
/* bsp_soft_timer_update:软件定时器状态更新 */
void bsp_soft_timer_update
	(
	void
	)
{
	for (int i = 0; i < SOFT_TIMER_NUM; i++)
	{
		switch (timer[i].state)
		{
			/* 停止状态 */
			case SOFT_TIMER_STOPPED:
				break;
			
			/* 运行状态 */
			case SOFT_TIMER_RUNNING:
				if (timer[i].end_tick <= HAL_GetTick())
				{
					timer[i].state = SOFT_TIMER_TIMEOUT;
					timer[i].callback(timer[i].argv, timer[i].argc);	/* 调用回调函数 */
				}
				break;
			
			/* 超时状态 */
			case SOFT_TIMER_TIMEOUT:
				if (timer[i].mode == SOFT_TIMER_MODE_ONE_SHOT)
				{
					timer[i].state = SOFT_TIMER_STOPPED;
				}
				else if (timer[i].mode == SOFT_TIMER_MODE_PERIODIC)
				{
					timer[i].state = SOFT_TIMER_RUNNING;
					timer[i].end_tick = HAL_GetTick() + timer[i].delay;
				}
				break;
				
			default:
				break;
		}
		
	}
}

/* bsp_soft_timer_update:获取软件定时器状态
 * id		获取软件定时器编号 */
unsigned char bsp_soft_timer_state_get
	(
	unsigned char id
	)
{
	return timer[id].state;
}

/* soft_timer_nop_callback:空回调函数 */
void bsp_soft_timer_nop_callback
	(
	void 				*argv, 
	unsigned short int 	argc
	)
{
	__NOP();
}
使用例程
// 初始化
bsp_soft_timer_init();
bsp_soft_timer_start(0, SOFT_TIMER_MODE_PERIODIC, 500, bsp_soft_timer_nop_callback, NULL, 0);

// 主函数
while (1)
{
    ...
    bsp_soft_timer_update();
	if (bsp_soft_timer_state_get(0) == SOFT_TIMER_TIMEOUT)
	{
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);		// 翻转指示灯
	} 
    ...
}
参考链接

标签:定时器,soft,bsp,unsigned,timer,stm32,TIMER,软件,SOFT
From: https://blog.csdn.net/m0_63954303/article/details/140929310

相关文章

  • 易捷OA协同办公软件 ShowPic 任意文件读取漏洞复现
    0x01产品简介易捷OA协同办公软件是在“让管理更简单”和“实时协同”的理念的指导下,”本着“简约、实时、快捷、省钱”的产品定位,结合数千家客户的管理实践和当前最先进的IT技术开发出来的全新一代协同产品,在云计算、全文检索、手机应用、企业即时通讯等多方面取得突破性创新......
  • Parallels Desktop19.3.0虚拟机软件可以让你在Mac上同时运行Windows、Linux等多个系统
    ParallelsDesktop19,一个虚拟机软件,可以让你在Mac上同时运行Windows、Linux等多个系统。听起来是不是很厉害?但其实它还有更多隐藏的小技巧等着你去发现。如果你还在因为Mac和Windows之间的不兼容而苦恼,那么ParallelsDesktop19就是你的救星。它可以帮助你轻松地在Mac上运行Win......
  • STM32学习记录(一):STM32概述
    STM32F10x系统结构图STM32F10x的系统结构图如下[1]:框图中名词解释,按A~Z的顺序排列:AHB(AdvancedHighperformanceBus):先进高性能总线APB(AdvancedPeripheralBus):先进外设总线ADC(Analog-to-DigitalConverter):模拟/数字转换器BKP(Backupregisters):备份寄存器CAN(Cont......
  • 面向-Windows-程序员的-C---软件互操作教程-全-
    面向Windows程序员的C++软件互操作教程(全)原文:C++SoftwareInteroperabilityforWindowsProgrammers协议:CCBY-NC-SA4.0一、准备介绍本章介绍了软件互操作性项目。我们先简要了解一下先决条件。接下来是项目概述。最后,我们描述了项目的主要组成部分以及它们是如何组......
  • AnyGo for Mac(虚拟定位软件)永久破解下载 兼容最新系统
    AnyGoforMac是一款专为Mac用户设计的虚拟定位软件,它允许用户轻松模拟地理位置,改变设备在地图上的显示位置。这款软件以其简洁的操作界面和强大的功能而著称,用户只需简单几步即可实现虚拟定位,无需复杂的设置。AnyGo支持多种应用场景,无论是游戏定位、社交软件位置模拟还是其他需......
  • 可以剪辑音频的软件有哪些?看完你就知道
    音乐和声音是生活中不可或缺的调味剂,它们能够激发情感,传递信息,甚至改变我们的心情。然而,要想制作出完美的旋律或声音效果,往往需要对音频进行精细的剪辑和调整。想象一下,如果你能够轻松地剪辑出自己的声音,或是将多段音乐无缝拼接,那将是多么美妙的体验。今天,就让我们一起来认......
  • 音频转换工具有哪些好用?五款可以转换音频格式的软件分享
    在数字时代,音频文件的转换已成为我们日常生活中的一项基本技能。无论是为了适应不同的播放设备,还是为了优化存储空间,音频格式转换都显得尤为重要。但市场上的转换工具往往伴随着高昂的费用,让许多人望而却步。那有什么不仅易于使用,而且功能全面,能够满足我们对音频转换的各种需......
  • PlayCover Mac电脑全屏运行ios应用软件 for Mac免费下载
    PlayCover是一款功能强大的软件,主要用于在Mac平台上运行iOS应用程序和Android应用程序(取决于具体版本)。对于iOS应用,PlayCover通过模拟iOS环境,让用户能够在Mac上直接运行iPhone和iPad应用,无需虚拟机或双重启动,支持多点触控、传感器模拟等特性,提供舒适的使用体验。对于Android应用,P......
  • 视频笔记软件JumpVideo技术解析一:Electron案例-调用VLC播放器
              大家好,我是TheGodOfKing,是最强考研学习神器,免费视频笔记应用JumpVideo,可以快速添加截图时间戳,支持所有笔记软件,学习效率MAX!的开发者之一,分享技术的目的是想找到更多志同道合的人,如果有大学生加入,我们还允许他把项目作为毕设(只有一个名额哟)群(689978959),那么今......
  • 软件工程专业导论大作业-关于华为自主研发的新编程语言基本原理其应用场景分析
    摘 要在2024年6月21日的华为开发者大会上,华为宣布了其自主研发的全新编程语言——“仓颉”。这一语言的推出旨在为其“升腾”AI芯片和云原生应用开发提供强大支持,并且有助于构建全球技术生态系统。“仓颉”编程语言特别设计以应对华为“升腾”AI芯片的需求,并且专注于硬件和......