173 lines
6.0 KiB
C
173 lines
6.0 KiB
C
/*
|
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2018 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#ifndef _FSL_FMEAS_H_
|
|
#define _FSL_FMEAS_H_
|
|
|
|
#include "fsl_common.h"
|
|
|
|
/*!
|
|
* @addtogroup fmeas
|
|
* @{
|
|
*/
|
|
|
|
/*! @file */
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
*******************************************************************************/
|
|
|
|
/*! @name Driver version */
|
|
/*@{*/
|
|
/*! @brief Defines LPC Frequency Measure driver version 2.1.0. */
|
|
#define FSL_FMEAS_DRIVER_VERSION (MAKE_VERSION(2, 1, 0))
|
|
/*@}*/
|
|
|
|
#if defined(FSL_FEATURE_FMEAS_INDEX_20) && (FSL_FEATURE_FMEAS_INDEX_20)
|
|
/*! The calibration duration is 2^FMEAS_INDEX times the reference clock period */
|
|
#define FMEAS_INDEX 20
|
|
#endif /*FSL_FEATURE_FMEAS_INDEX_20*/
|
|
|
|
#if defined(FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL) && (FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL)
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL_MASK ASYNC_SYSCON_FREQMECTRL_CAPVAL_MASK
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL_SHIFT ASYNC_SYSCON_FREQMECTRL_CAPVAL_SHIFT
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL ASYNC_SYSCON_FREQMECTRL_CAPVAL
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG_MASK ASYNC_SYSCON_FREQMECTRL_PROG_MASK
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG_SHIFT ASYNC_SYSCON_FREQMECTRL_PROG_SHIFT
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG ASYNC_SYSCON_FREQMECTRL_PROG
|
|
#else
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL_MASK SYSCON_FREQMECTRL_CAPVAL_MASK
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL_SHIFT SYSCON_FREQMECTRL_CAPVAL_SHIFT
|
|
#define FMEAS_SYSCON_FREQMECTRL_CAPVAL SYSCON_FREQMECTRL_CAPVAL
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG_MASK SYSCON_FREQMECTRL_PROG_MASK
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG_SHIFT SYSCON_FREQMECTRL_PROG_SHIFT
|
|
#define FMEAS_SYSCON_FREQMECTRL_PROG SYSCON_FREQMECTRL_PROG
|
|
#endif /*FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL*/
|
|
|
|
/*******************************************************************************
|
|
* Types
|
|
*******************************************************************************/
|
|
|
|
#if defined(FSL_FEATURE_FMEAS_USE_ASYNC_SYSCON) && (FSL_FEATURE_FMEAS_USE_ASYNC_SYSCON)
|
|
typedef ASYNC_SYSCON_Type FMEAS_SYSCON_Type;
|
|
#elif defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
|
|
typedef FREQME_Type FMEAS_SYSCON_Type;
|
|
#else
|
|
typedef SYSCON_Type FMEAS_SYSCON_Type;
|
|
#endif
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
*******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* API
|
|
*******************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/*!
|
|
* @name FMEAS Functional Operation
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* @brief Starts a frequency measurement cycle.
|
|
*
|
|
* @param base : SYSCON peripheral base address.
|
|
*/
|
|
static inline void FMEAS_StartMeasure(FMEAS_SYSCON_Type *base)
|
|
{
|
|
#if defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
|
|
base->FREQMECTRL_W = 0;
|
|
/*! Set the reference clock count cycle to 2^20 times*/
|
|
base->FREQMECTRL_W = FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_MASK | FREQME_FREQMECTRL_W_REF_SCALE(20);
|
|
#else
|
|
base->FREQMECTRL = 0;
|
|
#if defined(SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK)
|
|
/* Un-gate FRO1M to FMEAS if used as reference or target clock */
|
|
if ((((INPUTMUX->FREQMEAS_REF & INPUTMUX_FREQMEAS_REF_CLKIN_MASK) >> INPUTMUX_FREQMEAS_REF_CLKIN_SHIFT) ==
|
|
kCLOCK_fmeasFRO1Mhz) ||
|
|
(((INPUTMUX->FREQMEAS_TARGET & INPUTMUX_FREQMEAS_TARGET_CLKIN_MASK) >> INPUTMUX_FREQMEAS_TARGET_CLKIN_SHIFT) ==
|
|
kCLOCK_fmeasFRO1Mhz))
|
|
{
|
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK;
|
|
}
|
|
#endif /*SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK*/
|
|
|
|
#if defined(SYSCON_CLOCK_CTRL_XTAL32MHZ_FREQM_ENA_MASK)
|
|
/* Un-gate XTAL32M to FMEAS if used as reference or target clock */
|
|
if ((((INPUTMUX->FREQMEAS_REF & INPUTMUX_FREQMEAS_REF_CLKIN_MASK) >> INPUTMUX_FREQMEAS_REF_CLKIN_SHIFT) ==
|
|
kCLOCK_fmeasXtal32Mhz) ||
|
|
(((INPUTMUX->FREQMEAS_TARGET & INPUTMUX_FREQMEAS_TARGET_CLKIN_MASK) >> INPUTMUX_FREQMEAS_TARGET_CLKIN_SHIFT) ==
|
|
kCLOCK_fmeasXtal32Mhz))
|
|
{
|
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_XTAL32MHZ_FREQM_ENA_MASK;
|
|
}
|
|
#endif
|
|
|
|
#if defined(FMEAS_INDEX)
|
|
base->FREQMECTRL = FMEAS_INDEX | FMEAS_SYSCON_FREQMECTRL_PROG_MASK;
|
|
#else
|
|
base->FREQMECTRL = (1UL << 31);
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
* @brief Indicates when a frequency measurement cycle is complete.
|
|
*
|
|
* @param base : SYSCON peripheral base address.
|
|
* @return true if a measurement cycle is active, otherwise false.
|
|
*/
|
|
static inline bool FMEAS_IsMeasureComplete(FMEAS_SYSCON_Type *base)
|
|
{
|
|
#if defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
|
|
return (bool)((base->FREQMECTRL_R & FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_MASK) == 0);
|
|
#else
|
|
return (bool)((base->FREQMECTRL & (1UL << 31)) == 0);
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
* @brief Returns the computed value for a frequency measurement cycle
|
|
*
|
|
* @param base : SYSCON peripheral base address.
|
|
* @param refClockRate : Reference clock rate used during the frequency measurement cycle.
|
|
*
|
|
* @return Frequency in Hz.
|
|
*/
|
|
uint32_t FMEAS_GetFrequency(FMEAS_SYSCON_Type *base, uint32_t refClockRate);
|
|
|
|
#if defined(FSL_FEATURE_FMEAS_GET_COUNT_SCALE) && (FSL_FEATURE_FMEAS_GET_COUNT_SCALE)
|
|
/*!
|
|
* @brief Get the clock count during the measurement time
|
|
*
|
|
* @param base : SYSCON peripheral base address.
|
|
* @param scale : measurement time is 2^scale cycle of reference clock, value is from 2 to 31.
|
|
* @param refClockCount : Reference clock cycle during the measurement time.
|
|
* @param targetClockCount : Target clock cycle during the measurement time.
|
|
*
|
|
*/
|
|
void FMEAS_GetCountWithScale(FMEAS_SYSCON_Type *base,
|
|
uint8_t scale,
|
|
uint32_t *refClockCount,
|
|
uint32_t *targetClockCount);
|
|
#endif
|
|
|
|
/*@}*/
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
/*! @}*/
|
|
|
|
#endif /* _FSL_FMEAS_H_ */
|