Timer定时器驱动(状态机、非阻塞延时)

timer.c

#include "stdio.h"
#include "stdlib.h"
#include "systick.h"
#include "../User/BSP/TIMER1/timer.h"

Timer_struct FlechazoTimer;

/***********************************************************
*@fuction	:vtimerInit
*@brief		:
*@param		:--
*@return	:void
*@author	:flechazo 更多详情请访问 (flechazo.mba)
*@date		:2023-05-21
***********************************************************/
void vtimerInit(void)
{
    rcu_periph_clock_enable(TIMER_RCU_TIMERx);

    timer_deinit(TIMER_TIMERx);
    //0.1ms
    timer_parameter_struct timer_init_struct;

    timer_init_struct.prescaler = SystemCoreClock / 1000000 - 1; // 120M Hz  /  120   = 1 M Hz
    timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;
    timer_init_struct.counterdirection = TIMER_COUNTER_UP;
    timer_init_struct.period = 100; //  1 M Hz /50000 =20 hz  = 50ms //1 M Hz /100=10000 hz  = (1/10000s)=0.1ms
    timer_init_struct.repetitioncounter = 0;
    timer_init_struct.clockdivision = TIMER_CKDIV_DIV1;

    timer_init(TIMER_TIMERx, &timer_init_struct);

    nvic_irq_enable(TIMER_TIMERx_IRQn, 1U, 0U);
    timer_interrupt_enable(TIMER_TIMERx, TIMER_INT_UP);

    timer_auto_reload_shadow_enable(TIMER_TIMERx);
    timer_enable(TIMER_TIMERx);

    FlechazoTimer.Control.GetCurrentTime_ms = vtimerGetCurrentTime_ms;
    FlechazoTimer.Control.GetCurrentTime_s = vtimerGetCurrentTime_s;
    FlechazoTimer.Control.IsTimeOut_ms = vtimerIsTimeOut_ms;
    FlechazoTimer.Control.IsTimeOut_s = vtimerIsTimeOut_s;
}


//0.1ms
void TIMER_TIMERx_IRQHandler(void)
{
    timer_flag_clear(TIMER_TIMERx, TIMER_FLAG_UP); 

    FlechazoTimer.Data.Info.timer_100us++;
    if(FlechazoTimer.Data.Info.timer_100us >= 10)
    {
        FlechazoTimer.Data.Info.timer_100us = 0;
        FlechazoTimer.Data.Info.timer_ms++;
        FlechazoTimer.Data.Info.temp_ms++;
        if(FlechazoTimer.Data.Info.temp_ms >= 1000)
        {
            FlechazoTimer.Data.Info.temp_ms = 0;
            FlechazoTimer.Data.Info.timer_s++;
        }
    }
}
//65535ms  65s  1min
/***********************************************************
*@fuction	:vtimerGetCurrentTime_ms
*@brief		:
*@param		:--
*@return	:void
*@author	:flechazo 更多详情请访问 (flechazo.mba)
*@date		:2023-05-21
***********************************************************/
uint32_t vtimerGetCurrentTime_ms(void)
{
    return FlechazoTimer.Data.Info.timer_ms;
}

/***********************************************************
*@fuction	:vtimerGetCurrentTime_s
*@brief		:
*@param		:--
*@return	:void
*@author	:flechazo 更多详情请访问 (flechazo.mba)
*@date		:2023-05-21
***********************************************************/
uint32_t vtimerGetCurrentTime_s(void)
{
    return FlechazoTimer.Data.Info.timer_s;
}


/***********************************************************
*@fuction	:vtimerIsTimeOut_s
*@brief		:
*@param		:--
*@return	:void
*@author	:flechazo 更多详情请访问 (flechazo.mba)
*@date		:2023-05-21
***********************************************************/
bool vtimerIsTimeOut_s(uint32_t *tick, uint32_t delay_time)
{
    uint32_t temp = 0;
    if(*tick <= vtimerGetCurrentTime_s())
    {
        temp = vtimerGetCurrentTime_s() - *tick;
    }
    else
    {
        temp = 0xFFFFFFFF - *tick + vtimerGetCurrentTime_s();
    }
    if(temp >= delay_time)
    {
        *tick = FlechazoTimer.Data.Info.timer_s; 
        return true; 
    }
    return false;
}



/***********************************************************
*@fuction	:vtimerIsTimeOut_ms
*@brief		:
*@param		:--
*@return	:void
*@author	:flechazo 更多详情请访问 (flechazo.mba)
*@date		:2023-05-21
***********************************************************/
bool vtimerIsTimeOut_ms(uint32_t *tick, uint32_t delay_time)
{
    uint32_t temp = 0;
    if(*tick <= vtimerGetCurrentTime_ms())
    {
        temp = vtimerGetCurrentTime_ms() - *tick;
    }
    else
    {
        temp = 0xFFFFFFFF - *tick + vtimerGetCurrentTime_ms();
    }
    if(temp >= delay_time)
    {
        *tick = FlechazoTimer.Data.Info.timer_ms;
        return true;
    }
    return false;
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H

#include "gd32f30x.h"
#include <stdbool.h>


#define CONFIG_MCU_FREQUENCY  120
#define TIMER_RCU_TIMERx RCU_TIMER1
#define TIMER_TIMERx TIMER1
#define TIMER_TIMERx_IRQn TIMER1_IRQn
#define TIMER_TIMERx_IRQHandler TIMER1_IRQHandler

typedef union
{
    struct
    {
				uint32_t	timer_ms;
        uint32_t	timer_s;
        uint32_t	timer_100us;
				uint32_t	temp_ms;
    } Info;
    uint32_t Byte[4];
} TimerData_union;

typedef struct
{
    uint32_t (*GetCurrentTime_s)(void);
		uint32_t (*GetCurrentTime_ms)(void);
		bool (*IsTimeOut_s)(uint32_t *tick, uint32_t delay_time);
		bool (*IsTimeOut_ms)(uint32_t *tick, uint32_t delay_time);
} TimerControl_struct;

typedef struct
{
		TimerData_union Data;
		TimerControl_struct Control;
} Timer_struct;

void vtimerInit(void);

uint32_t vtimerGetCurrentTime_s(void);
uint32_t vtimerGetCurrentTime_ms(void);

bool vtimerIsTimeOut_s(uint32_t *tick, uint32_t delay_time);
bool vtimerIsTimeOut_ms(uint32_t *tick, uint32_t delay_time);

#endif
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlechazoCLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值