277 lines
5.3 KiB
C
Raw Normal View History

2021-09-28 14:25:22 +08:00
//SysTick <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#include "key.h"
#include "led.h"
#include "Clock.h"
#include "systick.h"
static volatile uint32_t s_uiDelayCount = 0;
static volatile uint8_t s_ucTimeOutFlag = 0;
static SOFT_TMR s_tTmr[TMR_COUNT] = {0}; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
volatile uint32_t g_iRunTime = 0; //ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC>λ ms
static volatile uint8_t g_ucEnableSystickISR = 0; //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
void SysTick_ISR(void);
static void SysTick_SoftTimerDec(SOFT_TMR *_tmr);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> SysTick <EFBFBD>жϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
void SysTick_Init(void)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
for (uint8_t i = 0; i < TMR_COUNT; i++)
{
s_tTmr[i].Count = 0;
s_tTmr[i].PreLoad = 0;
s_tTmr[i].Flag = 0;
s_tTmr[i].Mode = TMR_ONCE_MODE; //ȱʡ<C8B1><CAA1>һ<EFBFBD><D2BB><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>ģʽ
}
//<2F><><EFBFBD><EFBFBD> SysTick <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>Ϊ 1ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SysTick <20>ж<EFBFBD>
SysTick_Config(SystemCoreClock / 1000);
g_ucEnableSystickISR = 1; //ִ<><D6B4>systick<63>ж<EFBFBD>
}
void SysTick_ISR(void)
{
static uint8_t s_count = 0;
static uint16_t l_count = 0;
//<2F><><EFBFBD><EFBFBD> Delay_ms
if (s_uiDelayCount > 0)
if (--s_uiDelayCount == 0)
s_ucTimeOutFlag = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
for (uint8_t i = 0; i < TMR_COUNT; i++)
SysTick_SoftTimerDec(&s_tTmr[i]);
//ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> 1
g_iRunTime++;
if (g_iRunTime == UINT32_MAX)
g_iRunTime = 0;
//ÿ<><C3BF> 1ms <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
if (++s_count >= 10)
{
s_count = 0;
//ÿ<><C3BF> 10ms <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
KEY_Scan10ms();
}
if (++l_count >= 1000)
{
l_count = 0;
//ÿ<><C3BF> 1000ms <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
Clock_Handler();
}
}
static void SysTick_SoftTimerDec(SOFT_TMR *_tmr)
{
if (_tmr->Count > 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
if (--_tmr->Count == 0)
{
_tmr->Flag = 1;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (_tmr->Mode == TMR_AUTO_MODE)
_tmr->Count = _tmr->PreLoad;
}
}
}
/**
* @brief ms <EFBFBD><EFBFBD>ʱ
* @param n: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
void Delay_ms(uint32_t n)
{
if (n == 0)
return;
else if (n == 1)
n = 2;
DISABLE_INT();
s_uiDelayCount = n;
s_ucTimeOutFlag = 0;
ENABLE_INT();
while (1)
{
if (s_ucTimeOutFlag == 1)
break;
}
}
/**
* @brief us <EFBFBD><EFBFBD>ʱ
* @param n: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
void Delay_us(uint32_t n)
{
uint32_t ticks;
uint32_t told;
uint32_t tnow;
uint32_t tcnt = 0;
uint32_t reload;
reload = SysTick->LOAD;
ticks = n * (SystemCoreClock / 1000000); //<2F><>Ҫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
tcnt = 0;
told = SysTick->VAL; //<2F>ս<EFBFBD><D5BD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
tcnt += told - tnow;
else
tcnt += reload - tnow + told;
told = tnow;
//ʱ<><EFBFBD><E4B3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӳٵ<D3B3>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD>˳<EFBFBD>
if (tcnt >= ticks)
break;
}
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _id: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ID
* @param _period: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ ms
*/
void SysTick_StartTimer(uint8_t _id, uint32_t _period)
{
DISABLE_INT();
s_tTmr[_id].Count = _period; //ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
s_tTmr[_id].PreLoad = _period; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ<D7B0><D6B5><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_tTmr[_id].Flag = 0; //<2F><>ʱʱ<CAB1><EFBFBD><E4B5BD>־
s_tTmr[_id].Mode = TMR_ONCE_MODE; //һ<><D2BB><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>ģʽ
ENABLE_INT();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param _id: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ID
* @param _period: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD>λ ms
*/
void SysTick_StartAutoTimer(uint8_t _id, uint32_t _period)
{
DISABLE_INT();
s_tTmr[_id].Count = _period; //ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
s_tTmr[_id].PreLoad = _period; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ<D7B0><D6B5><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_tTmr[_id].Flag = 0; //<2F><>ʱʱ<CAB1><EFBFBD><E4B5BD>־
s_tTmr[_id].Mode = TMR_AUTO_MODE; //<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽ
ENABLE_INT();
}
/**
* @brief ֹͣһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
* @param _id: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ID
*/
void SysTick_StopTimer(uint8_t _id)
{
DISABLE_INT();
s_tTmr[_id].Count = 0; //ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
s_tTmr[_id].Flag = 0; //<2F><>ʱʱ<CAB1><EFBFBD><E4B5BD>־
s_tTmr[_id].Mode = TMR_ONCE_MODE; //<2F>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ģʽ
ENABLE_INT();
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>ʱ
* @param _id: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> ID
* @param _period: <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ʱδ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
uint8_t SysTick_CheckTimer(uint8_t _id)
{
if (_id >= TMR_COUNT)
return 0;
if (s_tTmr[_id].Flag == 1)
{
s_tTmr[_id].Flag = 0;
return 1;
}
else
{
return 0;
}
}
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>λ ms<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>ʾ 24.85 <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
int32_t SysTick_GetRunTime(void)
{
int32_t runtime;
DISABLE_INT();
runtime = g_iRunTime;
ENABLE_INT();
return runtime;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>
* @param _LastTime: <EFBFBD>ϸ<EFBFBD>ʱ<EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD>ȥʱ<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ ms
*/
int32_t SysTick_CheckRunTime(int32_t _LastTime)
{
int32_t now_time;
int32_t time_diff;
DISABLE_INT();
now_time = g_iRunTime;
ENABLE_INT();
if (now_time >= _LastTime)
time_diff = now_time - _LastTime;
else
time_diff = INT32_MAX - _LastTime + now_time;
return time_diff;
}
/**
* @brief SysTick <EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void SysTick_Handler(void)
{
HAL_IncTick();
if (g_ucEnableSystickISR == 0)
return;
SysTick_ISR();
}