optical/NxBase/trigger.c

239 lines
4.6 KiB
C
Raw Normal View History

2025-09-04 01:45:08 +00:00
#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;
}