**
MCU时间计数系统结构
**
使用定时器运行函数,优点是能很好的管理每个函数时间定位,缺点是当mode函数出现死循环,容易出现死机
#include "SysClock.h"
volatile static u8 SYSCLOCK_timeFlg=0;
volatile static u32 SYSCLOCK_timeCnt=0;
const PFun TimedTaskQueue[Reserve_MODULE] =
{
FlashDtat_TaskManage,
samplingGyr_TaskManage,
samplingAcc_TaskManage,
filterData_TaskManage,
EKF_Data_TaskManage,
UARTDATA_TaskManage,
feedback_TaskManage,
};
/*1ms系统时钟计数函数*/
void SysClock_1msFUNC(void)
{
++SYSCLOCK_timeCnt;
SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1MS);
if(0u==(SYSCLOCK_timeCnt%10u))
{
SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_10MS);
}
if(0u==(SYSCLOCK_timeCnt%100u))
{
SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_100MS);
}
if(0u==(SYSCLOCK_timeCnt%1000u))
{
SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1S);
}
if(0u==(SYSCLOCK_timeCnt%60000u))
{
SYSCLOCK_timeFlg |=(1u<<SYSCLOCK_1MIN);
}
}
/*获取计时标记*/
u8 SysClock_Getflg(u8 TimerType)
{
u8 Flag = 0U;
if (TimerType < TIMER_VALID_NUMBER)
{
Flag = (SYSCLOCK_timeFlg >> TimerType) & 0x01U;
if (1U == Flag)
{
SYSCLOCK_timeFlg &= ~(1U << TimerType); /*读取后清除对应标记*/
}
}
return Flag;
}
/*定时任务*/
void TimedTask(void)
{
u8 TaskQueue = 0U;
u8 TimerType = 0U;
for (TimerType = 0U; TimerType < TIMER_VALID_NUMBER; TimerType++)
{
if (SET == SysClock_Getflg(TimerType))
{
TaskQueue = 0U;
for (; TaskQueue < Reserve_MODULE; TaskQueue++)
{
if (NULL != TimedTaskQueue[TaskQueue])
{
(*TimedTaskQueue[TaskQueue])(TimerType);
}
}
}
}
}
定义工程sysClock.h
#ifndef SYSCLOCK_H
#define SYSCLOCK_H
#include "gd32e23x.h"
#include "systick.h"
#include "string.h"
typedef uint8_t u8 ;
typedef uint16_t u16 ;
typedef uint32_t u32 ;
typedef void (*PFun)(unsigned char);
typedef enum
{
SYSCLOCK_1MS = 0,
SYSCLOCK_10MS,
SYSCLOCK_100MS,
SYSCLOCK_1S,
SYSCLOCK_1MIN,
TIMER_VALID_NUMBER,
}SYSCLOCK_TYPE;
typedef enum
{
USART_MODULE,
Reserve_MODULE,
}MODULE_TYPE;
void SysClock_1msFUNC(void);
void TimedTask(void);
#endif
在函数模块中轮询运行,例如UART打印模块UART.c
static void UARTDATA_1MSTask(void);
static void UARTDATA_10MSTask(void);
static void UARTDATA_100MSTask(void);
static void UARTDATA_1STask(void);
void UARTDATA_TaskManage(u8 TaskPeriod)
{
switch (TaskPeriod)
{
case TIMER_1MS:
UARTDATA_1MSTask();
break;
case TIMER_5MS:
UARTDATA_10MSTask();
break;
case TIMER_10MS:
UARTDATA_100MSTask();
break;
case TIMER_100MS:
UARTDATA_1STask();
break;
default:break;
}
}
static void UARTDATA_1MSTask(void)
{
}
static void UARTDATA_10MSTask(void)
{
}
static void UARTDATA_100MSTask(void)
{
UART_data();
}
static void UARTDATA_1STask(void)
{
}
定时器中断1ms一个时钟
/*!
\brief this function handles SysTick exception
\param[in] none
\param[out] none
\retval none
*/
void SysTick_Handler(void)
{
SysClock_1msTime();
}