请教一个定时器的写法

2019-12-19 18:09发布

现在的搞法
typedef        struct                        //毫秒延时结构体
{
        uint8_t         En;
        uint32_t        Cnt;                       
}DelayMs_TypeDef;

DelayMs_TypeDef msTimer1;

//初始化定时器
msTimer1.En = 1;
msTimer1.Cnt = 2000;        //2000ms

//计时
if(msTimer1.En==1)
{
        if(--msTimer1.Cnt==0)
        {
                msTimer1.En = 0;
        }
        //这里定时器时间到执行一系列动作
}

这样如果定时器一多,好像就比较繁杂了,初始化和计时又不在同一个地方,求一简单的写法
如:将上诉过程全部封装起来,用一个函数 func1 实现初始化和计时,同时函数参数里面给另外一个函数 func2 的指针 ,func2 函数用来执行定时器时间到之后的动作,并且func2需要传参进去
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
istars2005
2019-12-20 04:00
下面是.h文件
  1. #ifndef __SYSTICK_H
  2. #define __SYSTICK_H

  3. #include "stm32f10x.h"

  4. //--------------------定义区----------------------
  5. union   SysTickTimerFlag        //系统时间标志位
  6. {
  7.     uint16_t Flag;
  8.     struct {
  9. //        uint8_t _10ms   :1;         // 10ms   标志
  10.         uint8_t _20ms   :1;         // 20ms   标志
  11.         uint8_t _50ms   :1;         // 50ms   标志
  12.         uint8_t _100ms  :1;         // 100ms  标志
  13. //        uint8_t _250ms  :1;         // 250ms  标志
  14.         uint8_t _500ms  :1;         // 500ms  标志
  15.         uint8_t _1000ms :1;         // 1000ms 标志
  16.         uint8_t _2000ms :1;         // 2000ms 标志
  17. //        uint8_t _30s    :1;         // 30秒   标志
  18.         uint8_t _60s    :1;         // 60秒   标志
  19.     }bits;
  20. };

  21. //===================对外变量声明===========================
  22. extern volatile union SysTickTimerFlag  SysTick_T;      // 系统时间标志位,(用于查看各个定时时间段的标志位,不允许对变量赋值)

  23. //===================对外函数接口===========================
  24. void SysTick_Init(void);                                // SysTick初始化
  25. s8   TimeCallBackSet(u32 tmset, void (*hook)(void));    // 定时回调,tmset=回调时间(毫秒),  hook= 定时时间到的回调函数
  26. s8   TimeOutSet(vu32 *ptout);                           // 超时变量配置(在用到超时变量时,需要提前调用此函数进行初始化)

  27. #endif
复制代码

一周热门 更多>