| /* |
| * Copyright (c) 2016, Freescale Semiconductor, Inc. |
| * Copyright 2016-2017 NXP |
| * |
| * Redistribution and use in source and binary forms, with or without modification, |
| * are permitted provided that the following conditions are met: |
| * |
| * o Redistributions of source code must retain the above copyright notice, this list |
| * of conditions and the following disclaimer. |
| * |
| * o 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. |
| * |
| * o Neither the name of the copyright holder 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 HOLDER 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. |
| */ |
| #ifndef _FSL_RTWDOG_H_ |
| #define _FSL_RTWDOG_H_ |
| |
| #include "fsl_common.h" |
| |
| /*! |
| * @addtogroup rtwdog |
| * @{ |
| */ |
| |
| |
| /******************************************************************************* |
| * Definitions |
| *******************************************************************************/ |
| /*! @name Unlock sequence */ |
| /*@{*/ |
| #define WDOG_FIRST_WORD_OF_UNLOCK (RTWDOG_UPDATE_KEY & 0xFFFFU) /*!< First word of unlock sequence */ |
| #define WDOG_SECOND_WORD_OF_UNLOCK ((RTWDOG_UPDATE_KEY >> 16U)& 0xFFFFU) /*!< Second word of unlock sequence */ |
| /*@}*/ |
| |
| /*! @name Refresh sequence */ |
| /*@{*/ |
| #define WDOG_FIRST_WORD_OF_REFRESH (RTWDOG_REFRESH_KEY & 0xFFFFU) /*!< First word of refresh sequence */ |
| #define WDOG_SECOND_WORD_OF_REFRESH ((RTWDOG_REFRESH_KEY >> 16U)& 0xFFFFU) /*!< Second word of refresh sequence */ |
| /*@}*/ |
| /*! @name Driver version */ |
| /*@{*/ |
| /*! @brief RTWDOG driver version 2.0.0. */ |
| #define FSL_RTWDOG_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) |
| /*@}*/ |
| |
| /*! @brief Describes RTWDOG clock source. */ |
| typedef enum _rtwdog_clock_source |
| { |
| kRTWDOG_ClockSource0 = 0U, /*!< Clock source 0 */ |
| kRTWDOG_ClockSource1 = 1U, /*!< Clock source 1 */ |
| kRTWDOG_ClockSource2 = 2U, /*!< Clock source 2 */ |
| kRTWDOG_ClockSource3 = 3U, /*!< Clock source 3 */ |
| } rtwdog_clock_source_t; |
| |
| /*! @brief Describes the selection of the clock prescaler. */ |
| typedef enum _rtwdog_clock_prescaler |
| { |
| kRTWDOG_ClockPrescalerDivide1 = 0x0U, /*!< Divided by 1 */ |
| kRTWDOG_ClockPrescalerDivide256 = 0x1U, /*!< Divided by 256 */ |
| } rtwdog_clock_prescaler_t; |
| |
| /*! @brief Defines RTWDOG work mode. */ |
| typedef struct _rtwdog_work_mode |
| { |
| bool enableWait; /*!< Enables or disables RTWDOG in wait mode */ |
| bool enableStop; /*!< Enables or disables RTWDOG in stop mode */ |
| bool enableDebug; /*!< Enables or disables RTWDOG in debug mode */ |
| } rtwdog_work_mode_t; |
| |
| /*! @brief Describes RTWDOG test mode. */ |
| typedef enum _rtwdog_test_mode |
| { |
| kRTWDOG_TestModeDisabled = 0U, /*!< Test Mode disabled */ |
| kRTWDOG_UserModeEnabled = 1U, /*!< User Mode enabled */ |
| kRTWDOG_LowByteTest = 2U, /*!< Test Mode enabled, only low byte is used */ |
| kRTWDOG_HighByteTest = 3U, /*!< Test Mode enabled, only high byte is used */ |
| } rtwdog_test_mode_t; |
| |
| /*! @brief Describes RTWDOG configuration structure. */ |
| typedef struct _rtwdog_config |
| { |
| bool enableRtwdog; /*!< Enables or disables RTWDOG */ |
| rtwdog_clock_source_t clockSource; /*!< Clock source select */ |
| rtwdog_clock_prescaler_t prescaler; /*!< Clock prescaler value */ |
| rtwdog_work_mode_t workMode; /*!< Configures RTWDOG work mode in debug stop and wait mode */ |
| rtwdog_test_mode_t testMode; /*!< Configures RTWDOG test mode */ |
| bool enableUpdate; /*!< Update write-once register enable */ |
| bool enableInterrupt; /*!< Enables or disables RTWDOG interrupt */ |
| bool enableWindowMode; /*!< Enables or disables RTWDOG window mode */ |
| uint16_t windowValue; /*!< Window value */ |
| uint16_t timeoutValue; /*!< Timeout value */ |
| } rtwdog_config_t; |
| |
| /*! |
| * @brief RTWDOG interrupt configuration structure. |
| * |
| * This structure contains the settings for all of the RTWDOG interrupt configurations. |
| */ |
| enum _rtwdog_interrupt_enable_t |
| { |
| kRTWDOG_InterruptEnable = RTWDOG_CS_INT_MASK, /*!< Interrupt is generated before forcing a reset */ |
| }; |
| |
| /*! |
| * @brief RTWDOG status flags. |
| * |
| * This structure contains the RTWDOG status flags for use in the RTWDOG functions. |
| */ |
| enum _rtwdog_status_flags_t |
| { |
| kRTWDOG_RunningFlag = RTWDOG_CS_EN_MASK, /*!< Running flag, set when RTWDOG is enabled */ |
| kRTWDOG_InterruptFlag = RTWDOG_CS_FLG_MASK, /*!< Interrupt flag, set when interrupt occurs */ |
| }; |
| |
| /******************************************************************************* |
| * API |
| *******************************************************************************/ |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif /* __cplusplus */ |
| |
| /*! |
| * @name RTWDOG Initialization and De-initialization |
| * @{ |
| */ |
| |
| /*! |
| * @brief Initializes the RTWDOG configuration structure. |
| * |
| * This function initializes the RTWDOG configuration structure to default values. The default |
| * values are: |
| * @code |
| * rtwdogConfig->enableRtwdog = true; |
| * rtwdogConfig->clockSource = kRTWDOG_ClockSource1; |
| * rtwdogConfig->prescaler = kRTWDOG_ClockPrescalerDivide1; |
| * rtwdogConfig->workMode.enableWait = true; |
| * rtwdogConfig->workMode.enableStop = false; |
| * rtwdogConfig->workMode.enableDebug = false; |
| * rtwdogConfig->testMode = kRTWDOG_TestModeDisabled; |
| * rtwdogConfig->enableUpdate = true; |
| * rtwdogConfig->enableInterrupt = false; |
| * rtwdogConfig->enableWindowMode = false; |
| * rtwdogConfig->windowValue = 0U; |
| * rtwdogConfig->timeoutValue = 0xFFFFU; |
| * @endcode |
| * |
| * @param config Pointer to the RTWDOG configuration structure. |
| * @see rtwdog_config_t |
| */ |
| void RTWDOG_GetDefaultConfig(rtwdog_config_t *config); |
| |
| /*! |
| * @brief Initializes the RTWDOG module. |
| * |
| * This function initializes the RTWDOG. |
| * To reconfigure the RTWDOG without forcing a reset first, enableUpdate must be set to true |
| * in the configuration. |
| * |
| * Example: |
| * @code |
| * rtwdog_config_t config; |
| * RTWDOG_GetDefaultConfig(&config); |
| * config.timeoutValue = 0x7ffU; |
| * config.enableUpdate = true; |
| * RTWDOG_Init(wdog_base,&config); |
| * @endcode |
| * |
| * @param base RTWDOG peripheral base address. |
| * @param config The configuration of the RTWDOG. |
| */ |
| void RTWDOG_Init(RTWDOG_Type *base, const rtwdog_config_t *config); |
| |
| /*! |
| * @brief De-initializes the RTWDOG module. |
| * |
| * This function shuts down the RTWDOG. |
| * Ensure that the WDOG_CS.UPDATE is 1, which means that the register update is enabled. |
| * |
| * @param base RTWDOG peripheral base address. |
| */ |
| void RTWDOG_Deinit(RTWDOG_Type *base); |
| |
| /* @} */ |
| |
| /*! |
| * @name RTWDOG functional Operation |
| * @{ |
| */ |
| |
| /*! |
| * @brief Enables the RTWDOG module. |
| * |
| * This function writes a value into the WDOG_CS register to enable the RTWDOG. |
| * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address. |
| */ |
| static inline void RTWDOG_Enable(RTWDOG_Type *base) |
| { |
| base->CS |= RTWDOG_CS_EN_MASK; |
| } |
| |
| /*! |
| * @brief Disables the RTWDOG module. |
| * |
| * This function writes a value into the WDOG_CS register to disable the RTWDOG. |
| * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address |
| */ |
| static inline void RTWDOG_Disable(RTWDOG_Type *base) |
| { |
| base->CS &= ~RTWDOG_CS_EN_MASK; |
| } |
| |
| /*! |
| * @brief Enables the RTWDOG interrupt. |
| * |
| * This function writes a value into the WDOG_CS register to enable the RTWDOG interrupt. |
| * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address. |
| * @param mask The interrupts to enable. |
| * The parameter can be a combination of the following source if defined: |
| * @arg kRTWDOG_InterruptEnable |
| */ |
| static inline void RTWDOG_EnableInterrupts(RTWDOG_Type *base, uint32_t mask) |
| { |
| base->CS |= mask; |
| } |
| |
| /*! |
| * @brief Disables the RTWDOG interrupt. |
| * |
| * This function writes a value into the WDOG_CS register to disable the RTWDOG interrupt. |
| * The WDOG_CS register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address. |
| * @param mask The interrupts to disabled. |
| * The parameter can be a combination of the following source if defined: |
| * @arg kRTWDOG_InterruptEnable |
| */ |
| static inline void RTWDOG_DisableInterrupts(RTWDOG_Type *base, uint32_t mask) |
| { |
| base->CS &= ~mask; |
| } |
| |
| /*! |
| * @brief Gets the RTWDOG all status flags. |
| * |
| * This function gets all status flags. |
| * |
| * Example to get the running flag: |
| * @code |
| * uint32_t status; |
| * status = RTWDOG_GetStatusFlags(wdog_base) & kRTWDOG_RunningFlag; |
| * @endcode |
| * @param base RTWDOG peripheral base address |
| * @return State of the status flag: asserted (true) or not-asserted (false). @see _rtwdog_status_flags_t |
| * - true: related status flag has been set. |
| * - false: related status flag is not set. |
| */ |
| static inline uint32_t RTWDOG_GetStatusFlags(RTWDOG_Type *base) |
| { |
| return (base->CS & (RTWDOG_CS_EN_MASK | RTWDOG_CS_FLG_MASK)); |
| } |
| |
| /*! |
| * @brief Clears the RTWDOG flag. |
| * |
| * This function clears the RTWDOG status flag. |
| * |
| * Example to clear an interrupt flag: |
| * @code |
| * RTWDOG_ClearStatusFlags(wdog_base,kRTWDOG_InterruptFlag); |
| * @endcode |
| * @param base RTWDOG peripheral base address. |
| * @param mask The status flags to clear. |
| * The parameter can be any combination of the following values: |
| * @arg kRTWDOG_InterruptFlag |
| */ |
| void RTWDOG_ClearStatusFlags(RTWDOG_Type *base, uint32_t mask); |
| |
| /*! |
| * @brief Sets the RTWDOG timeout value. |
| * |
| * This function writes a timeout value into the WDOG_TOVAL register. |
| * The WDOG_TOVAL register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address |
| * @param timeoutCount RTWDOG timeout value, count of RTWDOG clock ticks. |
| */ |
| static inline void RTWDOG_SetTimeoutValue(RTWDOG_Type *base, uint16_t timeoutCount) |
| { |
| base->TOVAL = timeoutCount; |
| } |
| |
| /*! |
| * @brief Sets the RTWDOG window value. |
| * |
| * This function writes a window value into the WDOG_WIN register. |
| * The WDOG_WIN register is a write-once register. Ensure that the WCT window is still open and |
| * this register has not been written in this WCT while the function is called. |
| * |
| * @param base RTWDOG peripheral base address. |
| * @param windowValue RTWDOG window value. |
| */ |
| static inline void RTWDOG_SetWindowValue(RTWDOG_Type *base, uint16_t windowValue) |
| { |
| base->WIN = windowValue; |
| } |
| |
| /*! |
| * @brief Unlocks the RTWDOG register written. |
| * |
| * This function unlocks the RTWDOG register written. |
| * |
| * Before starting the unlock sequence and following the configuration, disable the global interrupts. |
| * Otherwise, an interrupt could effectively invalidate the unlock sequence and the WCT may expire. |
| * After the configuration finishes, re-enable the global interrupts. |
| * |
| * @param base RTWDOG peripheral base address |
| */ |
| static inline void RTWDOG_Unlock(RTWDOG_Type *base) |
| { |
| if ((base->CS) & RTWDOG_CS_CMD32EN_MASK) |
| { |
| base->CNT = RTWDOG_UPDATE_KEY; |
| } |
| else |
| { |
| base->CNT = WDOG_FIRST_WORD_OF_UNLOCK; |
| base->CNT = WDOG_SECOND_WORD_OF_UNLOCK; |
| } |
| } |
| |
| /*! |
| * @brief Refreshes the RTWDOG timer. |
| * |
| * This function feeds the RTWDOG. |
| * This function should be called before the Watchdog timer is in timeout. Otherwise, a reset is asserted. |
| * |
| * @param base RTWDOG peripheral base address |
| */ |
| static inline void RTWDOG_Refresh(RTWDOG_Type *base) |
| { |
| if ((base->CS) & RTWDOG_CS_CMD32EN_MASK) |
| { |
| base->CNT = RTWDOG_REFRESH_KEY; |
| } |
| else |
| { |
| base->CNT = WDOG_FIRST_WORD_OF_REFRESH; |
| base->CNT = WDOG_SECOND_WORD_OF_REFRESH; |
| } |
| } |
| |
| /*! |
| * @brief Gets the RTWDOG counter value. |
| * |
| * This function gets the RTWDOG counter value. |
| * |
| * @param base RTWDOG peripheral base address. |
| * @return Current RTWDOG counter value. |
| */ |
| static inline uint16_t RTWDOG_GetCounterValue(RTWDOG_Type *base) |
| { |
| return base->CNT; |
| } |
| |
| /*@}*/ |
| |
| #if defined(__cplusplus) |
| } |
| #endif /* __cplusplus */ |
| |
| /*! @}*/ |
| |
| #endif /* _FSL_RTWDOG_H_ */ |