274 lines
7.9 KiB
C
274 lines
7.9 KiB
C
/*
|
|
* Copyright 2018-2021 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#ifndef FSL_OSTIMER_H_
|
|
#define FSL_OSTIMER_H_
|
|
|
|
#include "fsl_common.h"
|
|
|
|
/*!
|
|
* @addtogroup ostimer
|
|
* @{
|
|
*/
|
|
|
|
/*! @file*/
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/*! @name Driver version */
|
|
/*! @{ */
|
|
/*! @brief OSTIMER driver version. */
|
|
#define FSL_OSTIMER_DRIVER_VERSION (MAKE_VERSION(2, 2, 1))
|
|
/*! @} */
|
|
|
|
/*!
|
|
* @brief OSTIMER status flags.
|
|
*/
|
|
enum _ostimer_flags
|
|
{
|
|
kOSTIMER_MatchInterruptFlag = (OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK), /*!< Match interrupt flag bit, sets if
|
|
the match value was reached. */
|
|
};
|
|
|
|
/*! @brief ostimer callback function. */
|
|
typedef void (*ostimer_callback_t)(void);
|
|
|
|
/*******************************************************************************
|
|
* API
|
|
******************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif /* _cplusplus */
|
|
|
|
/*!
|
|
* @name Initialization and deinitialization
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* @brief Initializes an OSTIMER by turning its bus clock on
|
|
*
|
|
*/
|
|
void OSTIMER_Init(OSTIMER_Type *base);
|
|
|
|
/*!
|
|
* @brief Deinitializes a OSTIMER instance.
|
|
*
|
|
* This function shuts down OSTIMER bus clock
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
*/
|
|
void OSTIMER_Deinit(OSTIMER_Type *base);
|
|
|
|
/*!
|
|
* @brief Translate the value from gray-code to decimal.
|
|
*
|
|
* @param gray The gray value input.
|
|
* @return The decimal value.
|
|
*/
|
|
uint64_t OSTIMER_GrayToDecimal(uint64_t gray);
|
|
|
|
/*!
|
|
* @brief Translate the value from decimal to gray-code.
|
|
*
|
|
* @param dec The decimal value.
|
|
* @return The gray code of the input value.
|
|
*/
|
|
static inline uint64_t OSTIMER_DecimalToGray(uint64_t dec)
|
|
{
|
|
return (dec ^ (dec >> 1U));
|
|
}
|
|
|
|
/*!
|
|
* @brief Get OSTIMER status Flags.
|
|
*
|
|
* This returns the status flag.
|
|
* Currently, only match interrupt flag can be got.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @return status register value
|
|
*/
|
|
uint32_t OSTIMER_GetStatusFlags(OSTIMER_Type *base);
|
|
|
|
/*!
|
|
* @brief Clear Status Interrupt Flags.
|
|
*
|
|
* This clears intrrupt status flag.
|
|
* Currently, only match interrupt flag can be cleared.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @param mask Clear bit mask.
|
|
* @return none
|
|
*/
|
|
void OSTIMER_ClearStatusFlags(OSTIMER_Type *base, uint32_t mask);
|
|
|
|
/*!
|
|
* @brief Set the match raw value for OSTIMER.
|
|
*
|
|
* This function will set a match value for OSTIMER with an optional callback. And this callback
|
|
* will be called while the data in dedicated pair match register is equals to the value of central EVTIMER.
|
|
* Please note that, the data format is gray-code, if decimal data was desired, please using OSTIMER_SetMatchValue().
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @param count OSTIMER timer match value.(Value is gray-code format)
|
|
*
|
|
* @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)).
|
|
* @retval kStatus_Success - Set match raw value and enable interrupt Successfully.
|
|
* @retval kStatus_Fail - Set match raw value fail.
|
|
*/
|
|
status_t OSTIMER_SetMatchRawValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb);
|
|
|
|
/*!
|
|
* @brief Set the match value for OSTIMER.
|
|
*
|
|
* This function will set a match value for OSTIMER with an optional callback. And this callback
|
|
* will be called while the data in dedicated pair match register is equals to the value of central OS TIMER.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @param count OSTIMER timer match value.(Value is decimal format, and this value will be translate to Gray code
|
|
* internally.)
|
|
*
|
|
* @param cb OSTIMER callback (can be left as NULL if none, otherwise should be a void func(void)).
|
|
* @retval kStatus_Success - Set match value and enable interrupt Successfully.
|
|
* @retval kStatus_Fail - Set match value fail.
|
|
*/
|
|
status_t OSTIMER_SetMatchValue(OSTIMER_Type *base, uint64_t count, ostimer_callback_t cb);
|
|
|
|
/*!
|
|
* @brief Set value to OSTIMER MATCH register directly.
|
|
*
|
|
* This function writes the input value to OSTIMER MATCH register directly,
|
|
* it does not touch any other registers. Note that, the data format is
|
|
* gray-code. The function @ref OSTIMER_DecimalToGray could convert decimal
|
|
* value to gray code.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @param value OSTIMER timer match value (Value is gray-code format).
|
|
*/
|
|
static inline void OSTIMER_SetMatchRegister(OSTIMER_Type *base, uint64_t value)
|
|
{
|
|
#ifdef OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK
|
|
/* Wait for MATCH register ready for write. */
|
|
while (0U != (base->OSEVENT_CTRL & OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK))
|
|
{
|
|
}
|
|
#endif
|
|
|
|
base->MATCH_L = (uint32_t)value;
|
|
base->MATCH_H = (uint32_t)(value >> 32U);
|
|
}
|
|
|
|
/*!
|
|
* @brief Enable the OSTIMER counter match interrupt.
|
|
*
|
|
* Enable the timer counter match interrupt. The interrupt happens when OSTIMER
|
|
* counter matches the value in MATCH registers.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
*/
|
|
static inline void OSTIMER_EnableMatchInterrupt(OSTIMER_Type *base)
|
|
{
|
|
base->OSEVENT_CTRL |= OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK;
|
|
}
|
|
|
|
/*!
|
|
* @brief Disable the OSTIMER counter match interrupt.
|
|
*
|
|
* Disable the timer counter match interrupt. The interrupt happens when OSTIMER
|
|
* counter matches the value in MATCH registers.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
*/
|
|
static inline void OSTIMER_DisableMatchInterrupt(OSTIMER_Type *base)
|
|
{
|
|
base->OSEVENT_CTRL &= ~OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK;
|
|
}
|
|
|
|
/*!
|
|
* @brief Get current timer raw count value from OSTIMER.
|
|
*
|
|
* This function will get a gray code type timer count value from OS timer register.
|
|
* The raw value of timer count is gray code format.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @return Raw value of OSTIMER, gray code format.
|
|
*/
|
|
static inline uint64_t OSTIMER_GetCurrentTimerRawValue(OSTIMER_Type *base)
|
|
{
|
|
uint64_t tmp = 0U;
|
|
|
|
tmp = base->EVTIMERL;
|
|
tmp |= (uint64_t)(base->EVTIMERH) << 32U;
|
|
|
|
return tmp;
|
|
}
|
|
|
|
/*!
|
|
* @brief Get current timer count value from OSTIMER.
|
|
*
|
|
* This function will get a decimal timer count value.
|
|
* The RAW value of timer count is gray code format, will be translated to decimal data internally.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @return Value of OSTIMER which will be formated to decimal value.
|
|
*/
|
|
uint64_t OSTIMER_GetCurrentTimerValue(OSTIMER_Type *base);
|
|
|
|
/*!
|
|
* @brief Get the capture value from OSTIMER.
|
|
*
|
|
* This function will get a captured gray-code value from OSTIMER.
|
|
* The Raw value of timer capture is gray code format.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @return Raw value of capture register, data format is gray code.
|
|
*/
|
|
static inline uint64_t OSTIMER_GetCaptureRawValue(OSTIMER_Type *base)
|
|
{
|
|
uint64_t tmp = 0U;
|
|
|
|
tmp = base->CAPTURE_L;
|
|
tmp |= (uint64_t)(base->CAPTURE_H) << 32U;
|
|
|
|
return tmp;
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the capture value from OSTIMER.
|
|
*
|
|
* This function will get a capture decimal-value from OSTIMER.
|
|
* The RAW value of timer capture is gray code format, will be translated to decimal data internally.
|
|
*
|
|
* @param base OSTIMER peripheral base address.
|
|
* @return Value of capture register, data format is decimal.
|
|
*/
|
|
uint64_t OSTIMER_GetCaptureValue(OSTIMER_Type *base);
|
|
|
|
/*!
|
|
* @brief OS timer interrupt Service Handler.
|
|
*
|
|
* This function handles the interrupt and refers to the callback array in the driver to callback user (as per request
|
|
* in OSTIMER_SetMatchValue()).
|
|
* if no user callback is scheduled, the interrupt will simply be cleared.
|
|
*
|
|
* @param base OS timer peripheral base address.
|
|
* @param cb callback scheduled for this instance of OS timer
|
|
* @return none
|
|
*/
|
|
void OSTIMER_HandleIRQ(OSTIMER_Type *base, ostimer_callback_t cb);
|
|
/*! @} */
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
/*! @}*/
|
|
|
|
#endif /* FSL_OSTIMER_H_ */
|