/*
* Copyright (c) 2020, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*!****************************************************************************
* @file dl_vref.h
* @brief Voltage Reference (VREF) Driver Library
* @defgroup VREF Voltage Reference (VREF)
*
* @anchor ti_dl_dl_vref_Overview
* # Overview
*
* The Voltage Reference Driver Library allows full configuration of
* the MSPM0 VREF module.
* The VREF module contains a configurable voltage reference buffer which
* allows users to supply a stable internal reference to on-board analog
* peripherals. It also supports bringing in an external reference for
* applications where higher accuracy is required.
*
*
******************************************************************************
*/
/** @addtogroup VREF
* @{
*/
#ifndef ti_dl_dl_m0p_vref__include
#define ti_dl_dl_m0p_vref__include
#include
#include
#include
#include
#ifdef __MSPM0_HAS_VREF__
#ifdef __cplusplus
extern "C" {
#endif
/* clang-format off */
/** @addtogroup DL_VREF_CTL1_READY
* @{
*/
/*!
* @brief VREF bit in CTL1 indicating the module is ready is not set
*/
#define DL_VREF_CTL1_READY_NOTRDY (VREF_CTL1_READY_NOTRDY)
/*!
* @brief VREF bit in CTL1 indicating the module is ready is set
*/
#define DL_VREF_CTL1_READY_RDY (VREF_CTL1_READY_RDY)
/** @}*/
/** @addtogroup DL_VREF_SH
* @{
*/
/*!
* @brief Minimum value for VREF sample and hold, if enabled
*/
#define DL_VREF_SH_MIN (VREF_CTL2_SHCYCLE_MINIMUM)
/*!
* @brief Maximum value for VREF sample and hold, if enabled
*/
#define DL_VREF_SH_MAX (VREF_CTL2_SHCYCLE_MAXIMUM)
/** @}*/
/** @addtogroup DL_VREF_HOLD
* @{
*/
/*!
* @brief Minimum value for VREF hold, if enabled
*/
#define DL_VREF_HOLD_MIN (VREF_CTL2_HCYCLE_MINIMUM)
/*!
* @brief Maximum value for VREF hold, if enabled
*/
#define DL_VREF_HOLD_MAX (VREF_CTL2_HCYCLE_MAXIMUM)
/** @}*/
/* clang-format on */
/*! @enum DL_VREF_CLOCK */
typedef enum {
/*! Set VREF clock source as LFCLK */
DL_VREF_CLOCK_LFCLK = VREF_CLKSEL_LFCLK_SEL_MASK,
/*! Set VREF clock source as MFCLK */
DL_VREF_CLOCK_MFCLK = VREF_CLKSEL_MFCLK_SEL_MASK,
/*! Set VREF clock source as BUSCLK */
DL_VREF_CLOCK_BUSCLK = VREF_CLKSEL_BUSCLK_SEL_MASK,
} DL_VREF_CLOCK;
/*! @enum DL_VREF_CLOCK_DIVIDE */
typedef enum {
/*! Clock divide by 1 */
DL_VREF_CLOCK_DIVIDE_1 = 0,
/*! Clock divide by 2 */
DL_VREF_CLOCK_DIVIDE_2 = 1,
/*! Clock divide by 4 */
DL_VREF_CLOCK_DIVIDE_4 = 3,
/*! Clock divide by 6 */
DL_VREF_CLOCK_DIVIDE_6 = 5,
/*! Clock divide by 8 */
DL_VREF_CLOCK_DIVIDE_8 = 7,
} DL_VREF_CLOCK_DIVIDE;
/*! @enum DL_VREF_ENABLE */
typedef enum {
/*! VREF control set disabled */
DL_VREF_ENABLE_DISABLE = VREF_CTL0_ENABLE_DISABLE,
/*! VREF control set enabled */
DL_VREF_ENABLE_ENABLE = VREF_CTL0_ENABLE_ENABLE,
} DL_VREF_ENABLE;
/*! @enum DL_VREF_BUFCONFIG */
typedef enum {
/*! Configure VREF output buffer to 2.5V */
DL_VREF_BUFCONFIG_OUTPUT_2_5V = VREF_CTL0_BUFCONFIG_OUTPUT2P5V,
/*! Configure VREF output buffer to 1.4V */
DL_VREF_BUFCONFIG_OUTPUT_1_4V = VREF_CTL0_BUFCONFIG_OUTPUT1P4V,
} DL_VREF_BUFCONFIG;
/*! @enum DL_VREF_SHMODE */
typedef enum {
/*! Set VREF sample and hold mode to disabled */
DL_VREF_SHMODE_DISABLE = VREF_CTL0_SHMODE_DISABLE,
/*! Set VREF sample and hold mode to enabled */
DL_VREF_SHMODE_ENABLE = VREF_CTL0_SHMODE_ENABLE,
} DL_VREF_SHMODE;
/*!
* @brief Configuration struct for @ref DL_VREF_setClockConfig.
*/
typedef struct {
/*! Selects VREF module clock source @ref DL_VREF_CLOCK */
DL_VREF_CLOCK clockSel;
/*! Selects the divide ratio. One of @ref DL_VREF_CLOCK_DIVIDE */
DL_VREF_CLOCK_DIVIDE divideRatio;
} DL_VREF_ClockConfig;
/**
* @brief Configuration struct for @ref DL_VREF_Config.
*/
typedef struct {
/*! VREF enable setting. Either @ref DL_VREF_ENABLE_DISABLE or @ref DL_VREF_ENABLE_ENABLE */
DL_VREF_ENABLE vrefEnable;
/*! VREF buffer configuration setting. Either @ref DL_VREF_BUFCONFIG_OUTPUT_1_4V or @ref DL_VREF_BUFCONFIG_OUTPUT_2_5V */
DL_VREF_BUFCONFIG bufConfig;
/*! VREF sample and hold enable configuration setting. Either @ref DL_VREF_SHMODE_DISABLE or @ref DL_VREF_SHMODE_ENABLE */
DL_VREF_SHMODE shModeEnable;
/*! Number of cycles to sample and hold for, if sample and hold mode is enabled. Minimum @ref DL_VREF_SH_MIN, maximum @ref DL_VREF_SH_MAX */
uint32_t shCycleCount;
/*! Number of cycles to hold for, if sample and hold mode is enabled. Minimum @ref DL_VREF_HOLD_MIN, maximum @ref DL_VREF_HOLD_MAX */
uint32_t holdCycleCount;
} DL_VREF_Config;
/**
* @brief Enables the Peripheral Write Enable (PWREN) register for the VREF
*
* Before any peripheral registers can be configured by software, the
* peripheral itself must be enabled by writing the ENABLE bit together with
* the appropriate KEY value to the peripheral's PWREN register.
*
* @note For power savings, please refer to @ref DL_VREF_enableInternalRef
*
* @param vref Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_VREF_enablePower(VREF_Regs *vref)
{
vref->GPRCM.PWREN = VREF_PWREN_KEY_UNLOCK_W | VREF_PWREN_ENABLE_ENABLE;
}
/**
* @brief Disables the Peripheral Write Enable (PWREN) register for the VREF
*
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
* accessible for read/write operations.
*
* @note This API does not provide large power savings. For power savings,
* please refer to @ref DL_VREF_disableInternalRef
*
* @param vref Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_VREF_disablePower(VREF_Regs *vref)
{
vref->GPRCM.PWREN = VREF_PWREN_KEY_UNLOCK_W | VREF_PWREN_ENABLE_DISABLE;
}
/**
* @brief Returns if the Peripheral Write Enable (PWREN) register for the VREF
* is enabled
*
* Before any peripheral registers can be configured by software, the
* peripheral itself must be enabled by writing the ENABLE bit together with
* the appropriate KEY value to the peripheral's PWREN register.
*
* When the PWREN.ENABLE bit is cleared, the peripheral's registers are not
* accessible for read/write operations.
*
* @param vref Pointer to the register overlay for the peripheral
*
* @return true if peripheral register access is enabled
* @return false if peripheral register access is disabled
*/
__STATIC_INLINE bool DL_VREF_isPowerEnabled(VREF_Regs *vref)
{
return ((VREF->GPRCM.PWREN & VREF_PWREN_ENABLE_MASK) ==
VREF_PWREN_ENABLE_ENABLE);
}
/**
* @brief Enables Internal VREF
*
* This function only enables the internal VREF but doesn't configure all
* settings. It's recommended to use @ref DL_VREF_configReference to configure
* and enable VREF with all parameters.
*
* @param vref Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_VREF_enableInternalRef(VREF_Regs *vref)
{
vref->CTL0 |= VREF_CTL0_ENABLE_ENABLE;
}
/**
* @brief Disables Internal VREF, allows for External VREF
*
* The internal VREF must be disabled when using external VREF input.
*
* @param vref Pointer to the register overlay for the peripheral
*
*/
__STATIC_INLINE void DL_VREF_disableInternalRef(VREF_Regs *vref)
{
vref->CTL0 &= ~VREF_CTL0_ENABLE_MASK;
}
/**
* @brief Checks if the internal VREF is enabled
*
* @param vref Pointer to the register overlay for the peripheral
*
* @return Returns the enabled status of the vref peripheral
*
* @retval true The internal VREF is enabled
* @retval false The internal VREF is disabled, external VREF can be used
*/
__STATIC_INLINE bool DL_VREF_isEnabled(const VREF_Regs *vref)
{
return ((vref->CTL0 & VREF_CTL0_ENABLE_MASK) == VREF_CTL0_ENABLE_ENABLE);
}
#if (DeviceFamily_PARENT == DeviceFamily_PARENT_MSPM0L122X_L222X)
/**
* @brief Enable VREF buffer as internal reference input for comparator
*
* @param vref Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_VREF_enableInternalRefCOMP(VREF_Regs *vref)
{
vref->CTL0 |= VREF_CTL0_COMP_VREF_ENABLE_ENABLE;
}
/**
* @brief Checks if VREF buffer for comparator is enabled
*
* @param vref Pointer to the register overlay for the peripheral
*
* @return Returns if VREF buffer for comparator is enabled
*
* @retval true VREF buffer for comparator is enabled
* @retval false VREF buffer for comparator is disabled
*/
__STATIC_INLINE bool DL_VREF_isInternalRefCOMPEnabled(const VREF_Regs *vref)
{
return ((vref->CTL0 & VREF_CTL0_COMP_VREF_ENABLE_MASK) ==
VREF_CTL0_COMP_VREF_ENABLE_ENABLE);
}
/**
* @brief Disable VREF buffer as internal reference input for comparator
*
* @param vref Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_VREF_disableInternalRefCOMP(VREF_Regs *vref)
{
vref->CTL0 &= ~(VREF_CTL0_COMP_VREF_ENABLE_MASK);
}
#endif
/**
* @brief Set the clock select and clock divide fields in VREF
*
* @param vref Pointer to the register overlay for the peripheral
*
* @param config Pointer to the configuration structure
*/
void DL_VREF_setClockConfig(
VREF_Regs *vref, const DL_VREF_ClockConfig *config);
/**
* @brief Copy the clock select and clock divide fields in VREF to config
*
* @param vref Pointer to the register overlay for the peripheral
*
* @param config Pointer to the configuration structure
*/
void DL_VREF_getClockConfig(
const VREF_Regs *vref, DL_VREF_ClockConfig *config);
/**
* @brief Resets the VREF module
*
* @param vref Pointer to the register overlay for the peripheral
*/
__STATIC_INLINE void DL_VREF_reset(VREF_Regs *vref)
{
vref->GPRCM.RSTCTL =
VREF_RSTCTL_RESETASSERT_MASK | VREF_RSTCTL_KEY_UNLOCK_W;
}
/**
* @brief Returns if VREF peripheral was reset
*
* @param vref Pointer to the register overlay for the VREF peripheral
*
* @return true if peripheral was reset
* @return false if peripheral wasn't reset
*
*/
__STATIC_INLINE bool DL_VREF_isReset(const VREF_Regs *vref)
{
return (vref->GPRCM.STAT & VREF_STAT_RESETSTKY_MASK) ==
VREF_STAT_RESETSTKY_RESET;
}
/**
* @brief Returns VREF register status
*
* @param vref Pointer to the register overlay for the VREF peripheral
*
* @return VREF status bits set. Either @ref DL_VREF_CTL1_READY_NOTRDY or @ref DL_VREF_CTL1_READY_RDY
*
*/
__STATIC_INLINE uint32_t DL_VREF_getStatus(const VREF_Regs *vref)
{
return vref->CTL1 & VREF_CTL1_READY_MASK;
}
/**
* @brief Configure VREF enable, control registers
*
* @param vref Pointer to the register overlay for the VREF peripheral
*
* @param config Pointer to @ref DL_VREF_Config structure to configure the peripheral
*
*/
void DL_VREF_configReference(VREF_Regs *vref, const DL_VREF_Config *config);
#ifdef __cplusplus
}
#endif
#endif /* __MSPM0_HAS_VREF__ */
#endif /* ti_dl_dl_m0p_vref__include */
/** @}*/