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