/* * Function to delete the Timer instance. */ status_t SYSTM001_DeleteTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM001_CFG_MAX_TMR) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if( (TimerTracker & (1UL << (uint32_t)(Handle - 1U))) == 0UL) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(Error == (status_t)DAVEApp_SUCCESS) { /* Check if timer is running */ if(TimerTbl[(Handle - 1U)].TimerState == SYSTM001_STATE_RUNNING) { /* Yes,remove this timer from timer list*/ SYSTM001_lRemoveTimerList((Handle - 1U)); } /* Release resource that this timer hold*/ TimerTracker &=~((uint32_t)1U << (Handle - 1U)); } return Error; }
status_t CAN001_ReadMsgObj ( const CAN001_HandleType* Handle, CAN001_MessageHandleType* SwMsgObjptr, uint8_t MsgObjnr ) { uint32_t Error = (uint32_t)CAN001_ERROR; uint32_t Count = 0U; bool RxPnd = 0U; bool NewData = 0U; uint8_t MsgNo = (uint8_t)(Handle->FirstMOMapping+(MsgObjnr-1U)); /* Mapping to message object offset value*/ CAN_MO_TypeDef* CAN_MOxRegs = \ GET_MO_OFFSET(MsgNo); DBG002_N((MsgObjnr == 0U)||(MsgObjnr > Handle->NodeMONo)); /* check if message object is a receive message object */ /*<<<DD_CAN001_API_6_1>>>*/ if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_DIR_Msk, \ CAN_MO_MOSTAT_DIR_Pos) != (uint32_t)RECMSGOBJ) { Error = (uint32_t)CAN001_MO_NOT_ACCEPTABLE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } /* check if reception is ongoing on message object */ /*<<<DD_CAN001_API_6_2>>>*/ else if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_RXUPD_Msk, \ CAN_MO_MOSTAT_RXUPD_Pos) == 1U) { Error = (uint32_t)CAN001_MO_BUSY; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* read message parameters */ /*<<<DD_CAN001_API_6_3>>>*/ do { CAN_MOxRegs->MOCTR = CAN_MO_MOCTR_RESNEWDAT_Msk; if((RD_REG(CAN_MOxRegs->MOAR, CAN_MO_MOAR_IDE_Msk , \ CAN_MO_MOAR_IDE_Pos)) == 0U) { SwMsgObjptr->IDExten = (uint8_t)STANDARDTYPE; SwMsgObjptr->Identifier = (CAN_MOxRegs->MOAR & (uint32_t)CAN_MO_MOAR_STDID_Msk) >> \ CAN_MO_MOAR_STDID_Pos; SwMsgObjptr->IDEMask = (uint8_t)((uint32_t)(CAN_MOxRegs->MOAMR & (uint32_t)CAN_MO_MOAMR_MIDE_Msk) >> \ CAN_MO_MOAMR_MIDE_Pos); if(SwMsgObjptr->IDEMask == 1U) { SwMsgObjptr->IDMask = (CAN_MOxRegs->MOAMR & (uint32_t)CAN_MO_MOAR_STDID_Msk) >> \ CAN_MO_MOAR_STDID_Pos; } else { SwMsgObjptr->IDMask = CAN_MOxRegs->MOAMR & (uint32_t)CAN_MO_MOAMR_AM_Msk; } } else {
/* * Interface to stop the software timer. */ status_t SYSTM001_StopTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM001_CFG_MAX_TMR) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if( (TimerTracker & (1UL << (uint32_t)(Handle - 1U))) == 0UL) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(Error == (status_t)DAVEApp_SUCCESS) { /* Check whether Timer is in Stop state */ if(TimerTbl[(Handle - 1U)].TimerState != SYSTM001_STATE_STOPPED) { /* remove Timer from node list */ SYSTM001_lRemoveTimerList((Handle - 1U)); /* Set timer status as SYSTM001_STATE_STOPPED */ TimerTbl[(Handle - 1U)].TimerState = SYSTM001_STATE_STOPPED; } } return Error; }
/* * Interface to start the software timer . */ status_t SYSTM002_StartTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM002_CFG_MAX_TMR) { Error = (status_t)SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(0UL == (TimerTracker & (SYSTM002_BIT_SET << (Handle - 1UL)))) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } /* Any timer with time '0', can't start again. */ if(0UL == TimerTbl[Handle - 1U].TimerCount) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if((status_t)DAVEApp_SUCCESS == Error) { /* Check if timer is running */ if(SYSTM002_STATE_RUNNING != TimerTbl[(Handle - 1U)].TimerState) { /* set timer status as SYSTM002_STATE_RUNNING */ TimerTbl[(Handle - 1U)].TimerState = SYSTM002_STATE_RUNNING; /* Insert this timer into timer list */ SYSTM002_lInsertTimerList((Handle - 1U)); } else { /* for misra */ } } else { /* for misra */ } return Error; }
/* * Function to delete the Timer instance. */ status_t SYSTM002_DeleteTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM002_CFG_MAX_TMR) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(0UL == (TimerTracker & (SYSTM002_BIT_SET << (Handle - 1UL)))) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if((status_t)DAVEApp_SUCCESS == Error) { /* Check if timer is running */ if(SYSTM002_STATE_RUNNING == TimerTbl[(Handle - 1U)].TimerState) { /* Yes,remove this timer from timer list*/ SYSTM002_lRemoveTimerList((Handle - 1U)); } else { /* for misra */ } /* Release resource that this timer hold */ TimerTracker &=~(SYSTM002_BIT_SET << (Handle - 1UL)); } else { /* for misra */ } return Error; }
/* * Interface to stop the software timer. */ status_t SYSTM002_StopTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM002_CFG_MAX_TMR) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(0UL == (TimerTracker & (SYSTM002_BIT_SET << (Handle - 1UL)))) { Error = (status_t) SYSTM002_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if((status_t)DAVEApp_SUCCESS == Error) { /* Check whether Timer is in Stop state */ if(SYSTM002_STATE_STOPPED != TimerTbl[(Handle - 1U)].TimerState) { /* remove Timer from node list */ SYSTM002_lRemoveTimerList((Handle - 1U)); /* Set timer status as SYSTM002_STATE_STOPPED */ TimerTbl[(Handle - 1U)].TimerState = SYSTM002_STATE_STOPPED; } else { /* for misra */ } } else { /* for misra */ } return Error; }
/* * Interface to start the software timer . */ status_t SYSTM001_StartTimer(handle_t Handle) { status_t Error = (status_t )DAVEApp_SUCCESS; /* Check validity of parameter */ if(Handle > SYSTM001_CFG_MAX_TMR) { Error = (status_t)SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if( (TimerTracker & (1UL << (uint32_t)(Handle - 1U))) == 0UL) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } /* Any timer with time '0', can't start again. */ if(TimerTbl[Handle - 1U].TimerCount == 0UL) { Error = (status_t) SYSTM001_INVALID_HANDLE_ERROR; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(Error == (status_t)DAVEApp_SUCCESS) { /* Check if timer is running */ if(TimerTbl[(Handle - 1U)].TimerState != SYSTM001_STATE_RUNNING) { /* set timer status as SYSTM001_STATE_RUNNING */ TimerTbl[(Handle - 1U)].TimerState = SYSTM001_STATE_RUNNING; /* Insert this timer into timer list */ SYSTM001_lInsertTimerList((Handle - 1U)); } } return Error; }
/* * Initialization function which initializes the App internal data * structures to default values. */ void SYSTM001_Init( void) { uint32_t Status = 0UL; /** Initialize the header of the list */ TimerList = NULL; /* Clock Initialization */ CLK002_Init(); /** Initialize timer tracker */ Status = SysTick_Config((uint32_t)(SYSTM001_SYSTICK_INTERVAL * SYSTM001_SYS_CORE_CLOCK * 1000U)); if(Status == 1U) { DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Status), &Status); } NVIC_SetPriority(SysTick_IRQn, 0); TimerTracker = 0UL; }
status_t CAN001_SendRemoteFrame(const CAN001_HandleType* Handle, uint8_t MsgObjnr) { uint32_t Error = 0U; uint8_t MsgNo = (uint8_t)(Handle->FirstMOMapping+(MsgObjnr-1U)); /* Mapping to message object offset value*/ CAN_MO_TypeDef* CAN_MOxRegs = \ GET_MO_OFFSET(MsgNo); /*<<<DD_CAN001_API_5>>>*/ DBG002_FUNCTION_ENTRY(DBG002_GID_CAN001,CAN001_FUNCTION_ENTRY); DBG002_N ((MsgObjnr == 0U)||(MsgObjnr > Handle->NodeMONo)); /* check if message object is a receive message object */ /*<<<DD_CAN001_API_5_1>>>*/ if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_DIR_Msk, \ CAN_MO_MOSTAT_DIR_Pos) != (uint32_t)RECMSGOBJ) { Error = (uint32_t)CAN001_MO_NOT_ACCEPTABLE; DBG002_ERROR(DBG002_GID_CAN001,Error, 0, NULL); } /* check if message is disabled */ else if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_MSGVAL_Msk, \ CAN_MO_MOSTAT_MSGVAL_Pos) == 0U) { Error = (uint32_t)CAN001_MSGOBJ_DISABLED; DBG002_INFO(DBG002_GID_CAN001,Error, 0, NULL); } /* check if transmission is ongoing on message object */ /*<<<DD_CAN001_API_5_2>>>*/ else if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_TXRQ_Msk, \ CAN_MO_MOSTAT_TXRQ_Pos) == 1U) { Error = (uint32_t)CAN001_MO_BUSY; DBG002_INFO(DBG002_GID_CAN001,Error, 0, NULL); } else { /* Put transmit request to message object */ /*<<<DD_CAN001_API_5_3>>>*/ CAN_MOxRegs->MOCTR = CAN_MO_MOCTR_SETTXRQ_Msk; Error = (uint32_t)DAVEApp_SUCCESS; } DBG002_FUNCTION_EXIT(DBG002_GID_CAN001,CAN001_FUNCTION_EXIT); return Error; }
status_t CAN001_SendDataFrame(const CAN001_HandleType* Handle, uint8_t MsgObjnr) { uint32_t Error = (uint32_t)CAN001_ERROR; uint8_t MsgNo = (uint8_t)(Handle->FirstMOMapping+(MsgObjnr-1U)); /* Mapping to message object offset value*/ CAN_MO_TypeDef* CAN_MOxRegs = \ GET_MO_OFFSET(MsgNo); DBG002_N((MsgObjnr == 0U)||(MsgObjnr > Handle->NodeMONo)); /* check if message object is not a transmit message object */ /*<<<DD_CAN001_API_4_1>>>*/ if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_DIR_Msk, \ CAN_MO_MOSTAT_DIR_Pos) != (uint32_t)TRANSMSGOBJ) { Error = (uint32_t)CAN001_MO_NOT_ACCEPTABLE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } /* check if message is disabled */ else if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_MSGVAL_Msk, \ CAN_MO_MOSTAT_MSGVAL_Pos) == 0U) { Error = (uint32_t)CAN001_MSGOBJ_DISABLED; DBG002_INFO(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } /* check if transmission is ongoing on message object */ /*<<<DD_CAN001_API_4_2>>>*/ else if( RD_REG(CAN_MOxRegs->MOSTAT, CAN_MO_MOSTAT_TXRQ_Msk, \ CAN_MO_MOSTAT_TXRQ_Pos) == 1U) { Error = (uint32_t)CAN001_MO_BUSY; DBG002_INFO(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* set TXRQ bit */ /*<<<DD_CAN001_API_4_3>>>*/ CAN_MOxRegs->MOCTR = CAN_MO_MOCTR_SETTXRQ_Msk; Error = (uint32_t)DAVEApp_SUCCESS; } return Error; }
/* * Interface for creating a new software Timer instance. * Note: Because of invocation of SYSTM002_Init() : Timer reload value * programmed, Hardware System Timer started. Software Timer will be created * using SYSTM002_CreateTimer(). Due to time at which SW timer creation asked * by user will not be in sync with HW timer, the count value used below with * SW Timer, will not create starting/initial period same as expected value. * To SW timer period (Initial one) equal to more than expected, it is decided * to add one extra count(HW_TIMER_ADDITIONAL_CNT) with Software timer. * * Impact: Impact of this additional count(HW_TIMER_ADDITIONAL_CNT) is, * First SW Timer period is always equal to or more than expected/configured. */ handle_t SYSTM002_CreateTimer ( uint32_t Period, SYSTM002_TimerType TimerType, SYSTM002_TimerCallBackPtr TimerCallBack, void * pCallBackArgPtr ) { uint32_t TimerID = 0UL; uint32_t Count = 0UL; uint32_t Error = 0UL; uint32_t PeriodRatio = 0U; /* Check for input parameter */ if((SYSTM002_ONE_SHOT != TimerType) && (SYSTM002_PERIODIC != TimerType)) { Error = SYSTM002_TIMER_CREATION_FAILURE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(Period < (uint32_t)SYSTM002_SYSTICK_INTERVAL) { Error = SYSTM002_TIMER_CREATION_FAILURE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(0UL == Period) /* Timer with '0' time is not allowed. */ { Error = SYSTM002_TIMER_CREATION_FAILURE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if(NULL == TimerCallBack) { Error = SYSTM002_TIMER_CREATION_FAILURE; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } else { /* for misra */ } if (!Error) { for(Count = 0UL; Count < SYSTM002_CFG_MAX_TMR; Count++) { /* Check for free timer ID */ if(0UL == (TimerTracker & (SYSTM002_BIT_SET << Count))) { /* If yes,assign ID to this timer */ TimerTracker |= (SYSTM002_BIT_SET << Count); /* Initialize the timer as per input values */ TimerTbl[Count].TimerID = Count; TimerTbl[Count].TimerType = TimerType; TimerTbl[Count].TimerState = SYSTM002_STATE_STOPPED; PeriodRatio = SYSTM002_PeriodRatioSysClockInterval(Period); TimerTbl[Count].TimerCount = \ (PeriodRatio + HW_TIMER_ADDITIONAL_CNT); TimerTbl[Count].TimerReload = PeriodRatio; TimerTbl[Count].TimerCallBack = TimerCallBack; TimerTbl[Count].ParamToCallBack = pCallBackArgPtr; TimerTbl[Count].TimerPrev = NULL; TimerTbl[Count].TimerNext = NULL; TimerID = Count + SYSTM002_INCREMENT_COUNT; break; } else { /* for misra */ } } } else { /* for misra */ } return (handle_t)TimerID; }
/* Function which allows changing of baudrate,parity & stopbit at run time.*/ status_t UART001_Configure ( const UART001_HandleType* Handle, uint32_t BaudRate, UART_ParityType Parity, UART_StopBitType Stopbit ) { uint32_t Brg_Pdiv = 0x00U; uint32_t Fdr_Step = 0x00U; uint32_t TXIDLE_status; uint32_t RXIDLE_status; USIC_CH_TypeDef* UartRegs = Handle->UartRegs; status_t Status = (status_t)UART001_ERROR; DBG002_FUNCTION_ENTRY(APP_GID,UART001_FUN_ENTRY); /* <<<DD_UART001_API_3>>>*/ TXIDLE_status = (uint32_t)\ RD_REG(UartRegs->PSR_ASCMode,USIC_CH_PSR_ASCMode_TXIDLE_Msk, \ USIC_CH_PSR_ASCMode_TXIDLE_Pos); RXIDLE_status = (uint32_t)\ RD_REG(UartRegs->PSR_ASCMode,USIC_CH_PSR_ASCMode_RXIDLE_Msk, \ USIC_CH_PSR_ASCMode_RXIDLE_Pos); if(( TXIDLE_status & RXIDLE_status) == 0x01U) { /* Configuration of USIC Channel Fractional Divider */ UART001_lConfigureBaudRate(BaudRate,&Brg_Pdiv,&Fdr_Step); /* Step value: 0x3FF */ UartRegs->FDR &= ~(USIC_CH_FDR_STEP_Msk); UartRegs->FDR |= ( Fdr_Step & USIC_CH_FDR_STEP_Msk); /* The PreDivider for CTQ, PCTQ = 0 */ /* The Denominator for CTQ, DCTQ = 16 */ UartRegs->BRG &= ~(USIC_CH_BRG_PDIV_Msk); UartRegs->BRG |= ((((uint32_t)Brg_Pdiv << USIC_CH_BRG_PDIV_Pos) \ & USIC_CH_BRG_PDIV_Msk)); /* Configure StopBit */ UartRegs->PCR_ASCMode &= ~(USIC_CH_PCR_ASCMode_STPB_Msk); UartRegs->PCR_ASCMode |= \ (((uint32_t)Stopbit << USIC_CH_PCR_ASCMode_STPB_Pos) & \ USIC_CH_PCR_ASCMode_STPB_Msk); /* Configure Parity*/ UartRegs->CCR &= ~(USIC_CH_CCR_PM_Msk); UartRegs->CCR |= (((UART_MODE & USIC_CH_CCR_MODE_Msk)) | \ (((uint32_t)Parity << USIC_CH_CCR_PM_Pos) & \ USIC_CH_CCR_PM_Msk)); Status = (status_t)DAVEApp_SUCCESS; } else { Status = (status_t)UART001_BUSY; DBG002_ERROR(APP_GID,Status, 0, NULL); } DBG002_FUNCTION_EXIT(APP_GID,UART001_FUN_EXIT); return Status; }
/* * Interface for creating a new software Timer instance. * Note: Because of invocation of SYSTM001_Init() : Timer reload value * programmed, Hardware System Timer started. Software Timer will be created * using SYSTM001_CreateTimer(). Due to time at which SW timer creation asked * by user will not be in sync with HW timer, the count value used below with * SW Timer, will not create starting/initial period same as expected value. * To SW timer period (Initial one) equal to more than expected, it is decided * to add one extra count(HW_TIMER_ADDITIONAL_CNT) with Software timer. * * Impact: Impact of this additional count(HW_TIMER_ADDITIONAL_CNT) is, * First SW Timer period is always equal to or more than expected/configured. */ handle_t SYSTM001_CreateTimer ( uint32_t Period, SYSTM001_TimerType TimerType, SYSTM001_TimerCallBackPtr TimerCallBack, void * pCallBackArgPtr ) { uint32_t TimerID = 0UL; uint32_t Count = 0UL; uint32_t Error = 0UL; /* Check for input parameter */ if((TimerType != SYSTM001_ONE_SHOT) && (TimerType != SYSTM001_PERIODIC)) { Error=(uint32_t)1UL; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(Period < (uint32_t)SYSTM001_SYSTICK_INTERVAL) { Error=(uint32_t)1UL; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(Period == 0) /* Timer with '0' time is not allowed. */ { Error=(uint32_t)1UL; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if(TimerCallBack == NULL) { Error=(uint32_t)1UL; DBG002_ERROR(APP_GID, DBG002_MESSAGEID_LITERAL, sizeof(Error), &Error); } if (!Error) { for(Count = 0UL; Count < SYSTM001_CFG_MAX_TMR; Count++) { /* Check for free timer ID */ if((TimerTracker & ((uint32_t)1U << Count)) == 0U) { /* If yes,assign ID to this timer */ TimerTracker |= ((uint32_t)1U << Count); /* Initialize timer as per input values */ TimerTbl[Count].TimerID = Count; TimerTbl[Count].TimerType = TimerType; TimerTbl[Count].TimerState = SYSTM001_STATE_STOPPED; TimerTbl[Count].TimerCount = ((Period / SYSTM001_SYSTICK_INTERVAL)\ +HW_TIMER_ADDITIONAL_CNT); TimerTbl[Count].TimerReload = (Period / SYSTM001_SYSTICK_INTERVAL); TimerTbl[Count].TimerCallBack = TimerCallBack; TimerTbl[Count].ParamToCallBack = pCallBackArgPtr; TimerTbl[Count].TimerPrev = NULL; TimerTbl[Count].TimerNext = NULL; TimerID = Count + 1U; break; } } } return (handle_t)TimerID; }