NTK SDK中timer的用法

时间:2023-03-06


文章目录

  • ​​`NTK SDK`中`timer`的用法​​
  • ​​1.相关头文件​​
  • ​​2.用法​​
  • ​​2-1.用法1​​
  • ​​2-1-1.用例1​​
  • ​​2-1-2.用例2​​
  • ​​测试效果​​
  • ​​2-1.用法2​​
  • ​​2-2.用法3​​

1.相关头文件

na51023_bsp_20190819_linux\uitron\Include\Drv\Driver_Sys\timer.h
na51023_bsp_20190819_linux\uitron\Include\Lib\_System\GxTimer\GxTimer.h
na51023_bsp_20190819_linux\uitron\Include\Lib\_System\GxSystem\SxTimer.h

2.用法

2-1.用法1

/**
Timer mode.

Timer mode.
*/
typedef enum {
TIMER_MODE_CLKSRC_DIV0 = 0x00000000, ///< Timer clock source is from divider 0, the clock is fixed at 1 MHz.
TIMER_MODE_CLKSRC_DIV1 = 0x00000001, ///< Timer clock source is from divider 1, the clock can be configured.
TIMER_MODE_ONE_SHOT = 0x00000010, ///< Timer operation mode is "one shot"
TIMER_MODE_FREE_RUN = 0x00000020, ///< Timer operation mode is "free run"
TIMER_MODE_ENABLE_INT = 0x00000040, ///< Enable timeout interrupt

ENUM_DUMMY4WORD(TIMER_MODE)
} TIMER_MODE, *PTIMER_MODE;

/**
Timer state.

Timer state.
*/
typedef enum {
TIMER_STATE_PAUSE, ///< Stop timer
TIMER_STATE_PLAY, ///< Start timer

ENUM_DUMMY4WORD(TIMER_STATE)
} TIMER_STATE, *PTIMER_STATE;

2-1-1.用例1

​na51023_bsp_20190819_linux\uitron\Project\F12LIT_EAEKit\SrcCode\System\SysInput_Long_Exe.c​

static volatile UINT32  guiResetShutDownTimerID;
static volatile UINT32 guiResetSDTimerCount = 0;

void SysInit_ResetShutDownTimerHdl(UINT32 uiEvent)
{
// checking whether power butter pressing or not
if (rtc_getPWRStatus()==FALSE)
{
rtc_poweroffPWR();
while (1)
{
debug_err(("*"));
}

} else {

if (guiResetSDTimerCount > RESET_SHUTDOWN_TIMER_COUNT)
{
// over 2 sec
timer_close(guiResetShutDownTimerID);
debug_msg("power butter pressing over 2 sec .\r\n");
} else {
guiResetSDTimerCount++;
// reset shutdown timer once
rtc_resetShutdownTimer();
debug_msg("power butter pressing not over 2 sec .\r\n");
}
}
}

void SysInit_ResetShutDownTimer(void)
{
// reset shutdown timer first
rtc_resetShutdownTimer();

if (timer_open((UINT *)&guiResetShutDownTimerID, SysInit_ResetShutDownTimerHdl) != E_OK)
return;

timer_cfg(guiResetShutDownTimerID, RESET_SHUTDOWN_TIMER_INTERVAL*1000, TIMER_MODE_FREE_RUN | TIMER_MODE_ENABLE_INT, TIMER_STATE_PLAY);
}

2-1-2.用例2

static TIMER_ID     g_TEST_TimerID = TIMER_NUM;
static void TEST_TimerCB(UINT32 TimerId)
{
CHKPNT;

static UINT32 i = 0;
debug_msg("%s()--> i = %d\r\n", __func__, i);

i++;
}

void TEST_TimerEn(BOOL En)
{
if(En){
timer_pausePlay(g_TEST_TimerID, TIMER_STATE_PLAY);
}else{
timer_pausePlay(g_TEST_TimerID, TIMER_STATE_PAUSE);
}
}

void TEST_TimerOpen(void)
{
if (timer_open(&g_TEST_TimerID, TEST_TimerCB) != E_OK) {
DBG_ERR("open TEST timer fail\r\n");
}

timer_cfg(g_TEST_TimerID, 1000 * 1000/*ms*/, TIMER_MODE_FREE_RUN | TIMER_MODE_ENABLE_INT, TIMER_STATE_PAUSE);
}

void TEST_TimerClose(void)
{
if(g_TEST_TimerID !=TIMER_NUM){
timer_pausePlay(g_TEST_TimerID, TIMER_STATE_PAUSE);
timer_close(g_TEST_TimerID);
}
}

static BOOL Cmd_test_timer(CHAR *strCmd)
{
UINT32 value = 0;

sscanf_s(strCmd, "%d", &value);
DBG_DUMP("input=%d\r\n", value);

if(value==0){
Test_SwTimerOpen();
}else if(value==1){
Test_SwTimerClose();
}
else if(value==2)
{
TEST_TimerOpen();
}
else if(value == 3)
{
TEST_TimerClose();
}
else if(value == 4)
{
TEST_TimerEn(0);
}
else if(value == 5)
{
TEST_TimerEn(1);
}
else{
DBG_ERR("input wrong parameter\r\n");
}

return TRUE;
}
测试效果
[2023/3/8 13:53:36-736] input=5
[2023/3/8 13:53:37-728] > CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:37-728] TEST_TimerCB()--> i = 0
[2023/3/8 13:53:38-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:38-735] TEST_TimerCB()--> i = 1
[2023/3/8 13:53:39-727] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:39-727] TEST_TimerCB()--> i = 2
[2023/3/8 13:53:40-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:40-735] TEST_TimerCB()--> i = 3
[2023/3/8 13:53:41-729] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:41-729] TEST_TimerCB()--> i = 4
[2023/3/8 13:53:42-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:42-735] TEST_TimerCB()--> i = 5
[2023/3/8 13:53:43-727] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:43-727] TEST_TimerCB()--> i = 6
[2023/3/8 13:53:44-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:44-735] TEST_TimerCB()--> i = 7
[2023/3/8 13:53:45-729] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:45-730] TEST_TimerCB()--> i = 8
[2023/3/8 13:53:46-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:46-735] TEST_TimerCB()--> i = 9
[2023/3/8 13:53:47-727] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:47-727] TEST_TimerCB()--> i = 10
[2023/3/8 13:53:48-735] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:48-735] TEST_TimerCB()--> i = 11
[2023/3/8 13:53:49-727] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:49-727] TEST_TimerCB()--> i = 12
[2023/3/8 13:53:49-822]
[2023/3/8 13:53:49-824] input=4
[2023/3/8 13:53:56-174] >
[2023/3/8 13:53:56-176] input=5
[2023/3/8 13:53:57-182] > CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:57-182] TEST_TimerCB()--> i = 13
[2023/3/8 13:53:58-190] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:58-190] TEST_TimerCB()--> i = 14
[2023/3/8 13:53:59-182] CHK: 1581, TEST_TimerCB
[2023/3/8 13:53:59-182] TEST_TimerCB()--> i = 15
[2023/3/8 13:54:00-190] CHK: 1581, TEST_TimerCB
[2023/3/8 13:54:00-190] TEST_TimerCB()--> i = 16
[2023/3/8 13:54:01-182] CHK: 1581, TEST_TimerCB
[2023/3/8 13:54:01-182] TEST_TimerCB()--> i = 17
[2023/3/8 13:54:02-190] CHK: 1581, TEST_TimerCB
[2023/3/8 13:54:02-190] TEST_TimerCB()--> i = 18
[2023/3/8 13:54:03-182] CHK: 1581, TEST_TimerCB
[2023/3/8 13:54:03-182] TEST_TimerCB()--> i = 19
[2023/3/8 13:54:04-189] CHK: 1581, TEST_TimerCB
[2023/3/8 13:54:04-189] TEST_TimerCB()--> i = 20
[2023/3/8 13:54:04-910]
[2023/3/8 13:54:04-911] input=3
[2023/3/8 13:54:17-997] >
[2023/3/8 13:54:17-999] input=4

2-1.用法2

/**
The operation type of Timer.
*/
typedef enum _TIMER_TYPE {
ONE_SHOT = 0x00, ///< One-shot mode, the timer just run once.
CONTINUE ///< Continuing mode, the timer will keep running untill GxTimer_StopTimer() is invoked.
} TIMER_TYPE;

static UINT32  gUIMotionDetTimerID = NULL_TIMER;
static UINT32 g_uiDateTimerID = NULL_TIMER;

void FlowMovie_startTimer(void)
{
if (gUIMotionDetTimerID == NULL_TIMER) {
gUIMotionDetTimerID = GxTimer_StartTimer(/*TIMER_HALF_SEC*/250, NVTEVT_05SEC_TIMER, CONTINUE);
}

if (g_uiDateTimerID == NULL_TIMER) {
g_uiDateTimerID = GxTimer_StartTimer(TIMER_ONE_SEC, NVTEVT_1SEC_TIMER, CONTINUE);
}
CHKPNT;
}

void FlowMovie_stopTimer(void)
{
if (gUIMotionDetTimerID != NULL_TIMER) {
GxTimer_StopTimer(&gUIMotionDetTimerID);
}

if (g_uiDateTimerID != NULL_TIMER) {
GxTimer_StopTimer(&g_uiDateTimerID);
}
CHKPNT;
}

INT32 UIFlowWndMovie_OnTimer(VControl *, UINT32, UINT32 *);

EVENT_ITEM(NVTEVT_TIMER, UIFlowWndMovie_OnTimer)

INT32 UIFlowWndMovie_OnTimer(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
{
UINT32 uiEvent;
uiEvent = paramNum ? paramArray[0] : 0;
switch (uiEvent) {
case NVTEVT_01SEC_TIMER:

break;
case NVTEVT_05SEC_TIMER:

break;
case NVTEVT_1SEC_TIMER:

break;
}

Ux_DefaultEvent(pCtrl, NVTEVT_TIMER, paramNum, paramArray);
return NVTEVT_CONSUME;
}

2-2.用法3

#if (ACC_FUNCTION == ENABLE)
/ACC DET TIMER/
extern void SysACCDet_SyscACCStatus(void);
extern void SysACCDet_DetFunc(void);

int SX_TIMER_DET_ACC_ID = -1;
SX_TIMER_ITEM(SysACCDet_DetFunc, SysACCDet_DetFunc, 10, TRUE)
/
#endif

#if (ACC_FUNCTION == ENABLE)
SysACCDet_SyscACCStatus();
SX_TIMER_DET_ACC_ID = SxTimer_AddItem(&Timer_SysACCDet_DetFunc);
SxTimer_SetFuncActive(SX_TIMER_DET_ACC_ID, FALSE);
#endif

SxTimer_SetFuncActive(SX_TIMER_DET_ACC_ID, TRUE);

void SysACCDet_SyscACCStatus(void)
{
g_bDetACCStatus = acc_gpio_DetACC();
}

void SysACCDet_DetFunc(void)
{
// ...........
}