optical/NxBase/trigger.c
2025-09-04 09:45:08 +08:00

239 lines
4.6 KiB
C

#define _IN_TRIGGER_C
#include "trigger.h"
#include "iwdog.h"
//-------------------------------------------------------
//-------------------------------------------------------
//-------------------------------------------------------
#define TRIGGER_TIME 10 // 10 毫秒 触发
#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); // 系统时钟产生1ms中断
NVIC_SetPriority(SysTick_IRQn, 0);
g_mstimer = 0;
// 变量
g_triggerListNum = 0;
memset(&g_triggerCtrlList, 0, sizeof(TriggerCtrl)*MAX_TRIGGER_TASK);
g_triggerTimer = 0;
g_triggerTask = 0;
g_triggerInited = 1;
InitIWDog(1000); // 1秒复位看门狗
}
}
int AddTriggerToList(int gapms, TriggerFunc exf, TriggerFunc tskf)
{
int rslt;
if (gapms <= 0)
{
gapms = 1;
}
// 向上取整
// 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)
// 定时触发任务
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
// 定时触发任务
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 中断
void TriggerIntProc(void)
{
g_mstimer++;
TriggerExTask();
if ((g_mstimer%TRIGGER_TIME) == 0) // 每10ms执行一次
{
g_triggerTimer++;
FeedIWDog(); // 喂看门狗
}
}
u32 GetTickTimer(void)
{
return SysTick->VAL;
}
// 得到时间计数, 单位100ns
u32 Get100NsSoftTimer(void)
{
u32 val, stim, stim2;
stim = g_mstimer; // 读取
val = SysTick->VAL;
stim2 = g_mstimer; // 再次读取
if (stim != stim2) // 如果不同, 说明中间产生了中断
{
val = SysTick->VAL; // 重新读取
stim = stim2;
}
return (stim + 1) * 10000 - ((val+1) / NS100_SYS_TICK);
}
// 得到时间计数, 单位1us
u32 GetUsSoftTimer(void)
{
u32 volatile val, stim, stim2;
stim = g_mstimer; // 读取
val = SysTick->VAL;
stim2 = g_mstimer; // 再次读取
if (stim != stim2) // 如果不同, 说明中间产生了中断
{
val = SysTick->VAL; // 重新读取
stim = stim2;
}
return (stim + 1) * 1000 - ((val+1) / US_SYS_TICK);
}
// 得到时间计数, 单位0.1ms
u32 Get100UsSoftTimer(void)
{
u32 volatile val, stim, stim2;
stim = g_mstimer; // 读取
val = SysTick->VAL;
stim2 = g_mstimer; // 再次读取
if (stim != stim2) // 如果不同, 说明中间产生了中断
{
val = SysTick->VAL; // 重新读取
stim = stim2;
}
return (stim + 1)* 10 - ((val+1) / US100_SYS_TICK);
}
// 得到时间计数, 单位1ms
u32 GetMsSoftTimer(void)
{
return g_mstimer;
}
// 得到时间计数, 单位:1ms 精度:10ms
u32 GetMsSoftTimer10(void)
{
return g_mstimer;
// return g_triggerTimer*TRIGGER_TIME;
}