STM32定时器

timer.h

/**************************** 文件说明 ********************************
        @文件名:timer.h
        @文件类型:库文件
        @模块功能描述:定义和声明了一些关于定时器相关的数据类型和方法
        @作者:丁立鑫
        @时间:3/3/2019 7:11:59 PM 
        @版本:TimerV1.0
*************************************************************/
#ifndef _TIMER
#define _TIMER
/*************************** 包含头文件 *********************************/
#ifndef _STDBOOL
    #include<stdbool.h>
#endif
/**************************** 宏定义 ********************************/
#define TIMER0_DELAY 3000
#define TIMER1_DELAY 2000
#define TIMER2_DELAY 2000
#define TIMER3_DELAY 2000
#define TIMER4_DELAY 2000
/**************************** 结构体定义 ********************************/
typedef struct{
    bool flag;
    unsigned long delay;
    char des[250];
    
}Timer;
/**************************** 变量定义 ********************************/
extern Timer timer[];

/**************************** 方法声明 ********************************/
/*
    @方法名:timerHandler
    @brief
        对定时器的开关进行判断,当定时器时间溢出时开启定时器的开关
        补充:这里的定时器是递减型的
    @param:
        1. timerP 表示传入的定时器数组名
        2. timerNum 表示定时器数组的元素个数
    @retval 
        void
    @date
        3/3/2019 7:30:38 PM 
*/
void timerFlagHandler();

/*
    @brief
        对定时器的计时值进行递减操作
    @param 
        timer_change   计时值每次递减的值
**/
void timerDec(unsigned int timer_change);

/************************************************************/
#endif

 

timer.c

#include"timer.h"

/*
  说明:只将需要使用的定时器的flag置为false
*/ Timer timer[]
= { {false,TIMER0_DELAY,"计数器0"}, {true,TIMER1_DELAY,"计数器1"}, {true,TIMER2_DELAY,"计数器2"}, {true,TIMER3_DELAY,"计数器3"}, {true,TIMER4_DELAY,"计数器4"} }; static int timerNum = sizeof(timer) / sizeof(Timer);//求timer数组的元素个数 /* @brief 对定时器的开关进行判断,当定时器时间溢出时开启定时器的开关 补充:这里的定时器是递减型的 @param: 1. timerP 表示传入的定时器数组名 2. timerNum 表示定时器数组的元素个数 @retval void @date 3/3/2019 7:30:38 PM */ void timerFlagHandler() { int i; for(i=0;i<timerNum;i++){ timer[i].flag = timer[i].delay <= 0?true:false;

}
} void timerDec(unsigned int timer_change) { int i_loop; for (i_loop = 0; i_loop < timerNum; i_loop++) { if (timer[i_loop].delay > 0) {//当falg为false时,计数值开始递减 timer[i_loop].delay -= timer_change; } } }

 说明:

  这样做的效果是:定时器每隔一段时间会触发一次,特点是如下图所示:


他会存在首次触发之前也会延时一段时间,那么当我们不需要这段时间的时候应该怎么做呢?

以timer[0]为例:

第一步:将TIMER0_DELAY设置为0
第二步:将判断语句
if(timer[0].flag){

  timer[0].flag = false;
  tiemr[0].delay = TIMER0_DELAY;    
}

改成:

if(timer[0].flag){

  timer[0].flag = false;
  tiemr[0].delay = 你想延时的时间(如:1000);    
}
 
 

 

建议:

  在判断定时器开关的时候可以直接这样判断:

   

if(timer[0].delay <= 0){
  //...    
}
而不要:
if(timer[0].flag){
  //...    
}

这样做的好处就是定时器中不必再写方法timerFlagWork();

这样可以减小定时器的负担




 

转载于:https://www.cnblogs.com/NULL-ROOT/p/10486338.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值