239 lines
4.6 KiB
C
239 lines
4.6 KiB
C
|
|
|
|||
|
|
#define _IN_TRIGGER_C
|
|||
|
|
#include "trigger.h"
|
|||
|
|
#include "iwdog.h"
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define TRIGGER_TIME 10 // 10 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
#define MS_SYS_TICK (SYSCLK/1000)
|
|||
|
|
|
|||
|
|
#define US100_SYS_TICK (SYSCLK/10000)
|
|||
|
|
|
|||
|
|
#define US_SYS_TICK (SYSCLK/1000000)
|
|||
|
|
|
|||
|
|
#define NS100_SYS_TICK (SYSCLK/10000000)
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
//#define SYS_TICK_NUM MS_SYS_TICK
|
|||
|
|
|
|||
|
|
int volatile g_mstimer = 0; // 1ms++
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
int g_triggerListNum = 0;
|
|||
|
|
TriggerCtrl g_triggerCtrlList[MAX_TRIGGER_TASK];
|
|||
|
|
|
|||
|
|
u32 volatile g_triggerTimer = 0; // ÿ10ms++
|
|||
|
|
int g_triggerTask = 0;
|
|||
|
|
int g_triggerInited = 0;
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------
|
|||
|
|
|
|||
|
|
void InitTrigger(void)
|
|||
|
|
{
|
|||
|
|
if (g_triggerInited == 0)
|
|||
|
|
{
|
|||
|
|
SysTick_Config(MS_SYS_TICK); // ϵͳʱ<CDB3>Ӳ<EFBFBD><D3B2><EFBFBD>1ms<6D>ж<EFBFBD>
|
|||
|
|
NVIC_SetPriority(SysTick_IRQn, 0);
|
|||
|
|
|
|||
|
|
g_mstimer = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
|
g_triggerListNum = 0;
|
|||
|
|
memset(&g_triggerCtrlList, 0, sizeof(TriggerCtrl)*MAX_TRIGGER_TASK);
|
|||
|
|
|
|||
|
|
g_triggerTimer = 0;
|
|||
|
|
g_triggerTask = 0;
|
|||
|
|
g_triggerInited = 1;
|
|||
|
|
|
|||
|
|
InitIWDog(1000); // 1<>븴λ<EBB8B4><CEBB><EFBFBD>Ź<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int AddTriggerToList(int gapms, TriggerFunc exf, TriggerFunc tskf)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
|
|||
|
|
if (gapms <= 0)
|
|||
|
|
{
|
|||
|
|
gapms = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
|
|||
|
|
// gapms = (gapms + (TRIGGER_TIME-1)) / TRIGGER_TIME;
|
|||
|
|
// gapms *= TRIGGER_TIME;
|
|||
|
|
|
|||
|
|
if (g_triggerInited != 0 && g_triggerListNum < MAX_TRIGGER_TASK && gapms != 0)
|
|||
|
|
{
|
|||
|
|
g_triggerCtrlList[g_triggerListNum].triggerTimer = gapms;
|
|||
|
|
g_triggerCtrlList[g_triggerListNum].triggerExFunc = exf;
|
|||
|
|
g_triggerCtrlList[g_triggerListNum].triggerTaskFunc = tskf;
|
|||
|
|
rslt = g_triggerListNum;
|
|||
|
|
g_triggerListNum++;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("AddTriggerToList failed, g_triggerInited=%d, g_triggerListNum = %d, gap=%d\r\n", g_triggerInited, g_triggerListNum, gapms);
|
|||
|
|
rslt = -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void TriggerExTask(void)
|
|||
|
|
{
|
|||
|
|
int i;
|
|||
|
|
if (g_triggerInited != 0)
|
|||
|
|
{
|
|||
|
|
for (i = 0; i < g_triggerListNum; i++)
|
|||
|
|
{
|
|||
|
|
if ((g_mstimer % g_triggerCtrlList[i].triggerTimer) == 0)
|
|||
|
|
{
|
|||
|
|
if (g_triggerCtrlList[i].triggerExFunc != NULL)
|
|||
|
|
{
|
|||
|
|
g_triggerCtrlList[i].triggerExFunc();
|
|||
|
|
}
|
|||
|
|
if (g_triggerCtrlList[i].triggerTaskFunc != NULL)
|
|||
|
|
{
|
|||
|
|
g_triggerCtrlList[i].triggerTask = 1;
|
|||
|
|
g_triggerTask = 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if (TRIGGER_MAXTIM > 0)
|
|||
|
|
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void TriggerTask(void)
|
|||
|
|
{
|
|||
|
|
static int index = 0;
|
|||
|
|
int i = 0;
|
|||
|
|
if (g_triggerInited != 0 && g_triggerTask != 0)
|
|||
|
|
{
|
|||
|
|
u32 timer = GetUsSoftTimer();
|
|||
|
|
for (i = index; i < g_triggerListNum; i++)
|
|||
|
|
{
|
|||
|
|
if (g_triggerCtrlList[i].triggerTask != 0)
|
|||
|
|
{
|
|||
|
|
g_triggerCtrlList[i].triggerTask = 0;
|
|||
|
|
g_triggerCtrlList[i].triggerTaskFunc();
|
|||
|
|
}
|
|||
|
|
if (GetUsSoftTimer() - timer > TRIGGER_MAXTIM)
|
|||
|
|
{
|
|||
|
|
//printf("TriggerTask use > 1ms, break\r\n");
|
|||
|
|
i++;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (i >= g_triggerListNum)
|
|||
|
|
{
|
|||
|
|
i = 0;
|
|||
|
|
}
|
|||
|
|
index = i;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#else
|
|||
|
|
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void TriggerTask(void)
|
|||
|
|
{
|
|||
|
|
int i;
|
|||
|
|
if (g_triggerInited != 0 && g_triggerTask != 0)
|
|||
|
|
{
|
|||
|
|
for (i = 0; i < g_triggerListNum; i++)
|
|||
|
|
{
|
|||
|
|
if (g_triggerCtrlList[i].triggerTask != 0)
|
|||
|
|
{
|
|||
|
|
g_triggerCtrlList[i].triggerTask = 0;
|
|||
|
|
g_triggerCtrlList[i].triggerTaskFunc();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
// 1ms <20>ж<EFBFBD>
|
|||
|
|
void TriggerIntProc(void)
|
|||
|
|
{
|
|||
|
|
g_mstimer++;
|
|||
|
|
TriggerExTask();
|
|||
|
|
if ((g_mstimer%TRIGGER_TIME) == 0) // ÿ10msִ<73><D6B4>һ<EFBFBD><D2BB>
|
|||
|
|
{
|
|||
|
|
g_triggerTimer++;
|
|||
|
|
FeedIWDog(); // ι<><CEB9><EFBFBD>Ź<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u32 GetTickTimer(void)
|
|||
|
|
{
|
|||
|
|
return SysTick->VAL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>λ100ns
|
|||
|
|
u32 Get100NsSoftTimer(void)
|
|||
|
|
{
|
|||
|
|
u32 val, stim, stim2;
|
|||
|
|
stim = g_mstimer; // <20><>ȡ
|
|||
|
|
val = SysTick->VAL;
|
|||
|
|
stim2 = g_mstimer; // <20>ٴζ<D9B4>ȡ
|
|||
|
|
if (stim != stim2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ, ˵<><CBB5><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
{
|
|||
|
|
val = SysTick->VAL; // <20><><EFBFBD>¶<EFBFBD>ȡ
|
|||
|
|
stim = stim2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (stim + 1) * 10000 - ((val+1) / NS100_SYS_TICK);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>λ1us
|
|||
|
|
u32 GetUsSoftTimer(void)
|
|||
|
|
{
|
|||
|
|
u32 volatile val, stim, stim2;
|
|||
|
|
stim = g_mstimer; // <20><>ȡ
|
|||
|
|
val = SysTick->VAL;
|
|||
|
|
stim2 = g_mstimer; // <20>ٴζ<D9B4>ȡ
|
|||
|
|
if (stim != stim2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ, ˵<><CBB5><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
{
|
|||
|
|
val = SysTick->VAL; // <20><><EFBFBD>¶<EFBFBD>ȡ
|
|||
|
|
stim = stim2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (stim + 1) * 1000 - ((val+1) / US_SYS_TICK);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>λ0.1ms
|
|||
|
|
u32 Get100UsSoftTimer(void)
|
|||
|
|
{
|
|||
|
|
u32 volatile val, stim, stim2;
|
|||
|
|
stim = g_mstimer; // <20><>ȡ
|
|||
|
|
val = SysTick->VAL;
|
|||
|
|
stim2 = g_mstimer; // <20>ٴζ<D9B4>ȡ
|
|||
|
|
if (stim != stim2) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ, ˵<><CBB5><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
{
|
|||
|
|
val = SysTick->VAL; // <20><><EFBFBD>¶<EFBFBD>ȡ
|
|||
|
|
stim = stim2;
|
|||
|
|
}
|
|||
|
|
return (stim + 1)* 10 - ((val+1) / US100_SYS_TICK);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>λ1ms
|
|||
|
|
u32 GetMsSoftTimer(void)
|
|||
|
|
{
|
|||
|
|
return g_mstimer;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>λ:1ms <20><><EFBFBD><EFBFBD>:10ms
|
|||
|
|
u32 GetMsSoftTimer10(void)
|
|||
|
|
{
|
|||
|
|
return g_mstimer;
|
|||
|
|
// return g_triggerTimer*TRIGGER_TIME;
|
|||
|
|
}
|