[stm32]stm32滴答定时器构建多组软件定时器

本文介绍了一种在STM32上实现软件定时器的方法,通过使用回调函数简化了定时任务的处理流程。文章详细阐述了定时器的初始化、注册及中断回调等过程,并提供了主程序框架作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32有很多组定时器,处理一般业务已经足够用了。
但是杀鸡焉用牛刀,对时间精度要求不高的场合可以考虑使用软件定时器,使用方便,快捷。
怎么实现呢?其实并不难,就是使用回调函数即可。

1. 先将使用到的参数用结构体封装一下吧
#define get_time HAL_GetTick()

typedef void (*pfunc)(u8);

enum task_tmr_t{STMR_A=1,STMR_B,STMR_C,STMR_D,STMR_E};

typedef struct STMR_t_{
	u32	start_value;
	u32 overtime_value;
	u8	timer_id;
	u8	busy;
	u8  repeat;
	u8	param;	
}stmr_TypeDef;
2. 将要使用的软件定时器注册一下
pfunc tmr_func;

stmr_TypeDef soft_tmr;

bool stmr_reg(u8 tmr_id, u32 overtime, u8 repeat, pfunc ptmr, u8 param){
	if(false == soft_tmr.busy){
		soft_tmr.timer_id = tmr_id;
		soft_tmr.start_value = get_time;
		soft_tmr.overtime_value = overtime;
		soft_tmr.repeat = repeat;
		soft_tmr.busy = true;
		soft_tmr.param = param;
		tmr_func = ptmr;
		return true;
	}
	return false;
}
3. 回调一下
void stmr_isr(void){
	tmr_func(soft_tmr.param);
	if(soft_tmr.repeat > 0){
		soft_tmr.repeat--;
		soft_tmr.start_value = geit_time;
	}
	else{
		memset(&soft_tmr, 0, sizeof(soft_tmr));
		tmr_func = NULL;
	}
}
4. 要回调的任务函数
void stmr_stop(u8 tmr_id){
	if(true == soft_tmr.busy){
		if((tmr_id == soft_tmr.timer_id) || (tmr_id ==STMR_ALL)){
			memset(&soft_tmr, 0, sizeof(soft_tmr));
			tmr_func = NULL;
		}
	}
}

void STMR_A_task(void){
	printf("task a running\n");
}

void STMR_B_task(void){
	printf("task b ruinning\n");
}

void STMR_C_task(void){
	printf("task c ruinning\n");
}
5. 主程序框架
int main(void){
	BSP_Init();
	stmr_reg( ... );
	while(1){
		...
		if(true == soft_tmr.busy){
			if(get_time - soft_tmr.start_value > soft_tmr.overtime_value)
				stmr_isr();
		}
		...
	}
}

经过测试,软件定时器还是比较稳定的,上面的程序中虽然定义了五个定时器,但是只能分时复用,不能同时进行叠加使用。但是稍加改动就可以进行叠加使用了。只需把pfunc tmr_func;改为pfunc tmr_func[STMR_CNT];再对每一组定时器进行管理即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值