Example #1
0
/*
 *  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;

}
Example #2
0
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
      {
Example #3
0
/*
 *  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;
}
Example #7
0
/*
 *  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;
}
Example #8
0
/*
 *  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;

}
Example #9
0
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;
}
Example #10
0
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;
}  
Example #12
0
/* 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;
}
Example #13
0
/*
 *  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;
}