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

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




    Fist day
  • 相关阅读:
    第三十七节:系统证书管理和gRPC基于数字证书的认证和授权
    第三十六节:gRPC身份认证和授权(JWT模式 和 集成IDS4)
    第三十五节:gRPC拦截器、版本控制、安全性、日志集成
    第三十四节:.Proto文件剖析、gRPC的四种传输模式(一元和流式)和常用配置
    第三十三节:.Net Core下的gRPC详细介绍
    IIS7通过AppCmd.exe管理IIS
    MySql新增列的时候判断是否存在
    PowerDesigner从Excel导入表
    Java中Base64.encodeBase64URLSafe在C#的实现
    【产品方法论】字节跳动
  • 原文地址:https://www.cnblogs.com/NULL-ROOT/p/10486338.html
Copyright © 2020-2023  润新知