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();

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




 

posted @ 2019-03-06 21:44  NULL_ROOT  阅读(246)  评论(0编辑  收藏  举报