277 lines
5.3 KiB
C
277 lines
5.3 KiB
C
|
|
//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();
|
|||
|
|
}
|