617 lines
20 KiB
C
617 lines
20 KiB
C
/*
|
|
* 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_wwdt.h
|
|
* @brief Window Watchdog Timer (WWDT) Driver Library
|
|
* @defgroup WWDT Window Watchdog Timer (WWDT)
|
|
*
|
|
* @anchor ti_dl_dl_wwdt_Overview
|
|
* # Overview
|
|
*
|
|
* The Window Watchdog Timer Driver Library allows full configuration of
|
|
* the MSPM0 WWDT module.
|
|
* The window watchdog timer (WWDT) supervises code execution.
|
|
* If the application software does not successfully reset the window
|
|
* watchdog within the programmed open time window, the window watchdog
|
|
* generates a SYSRST.
|
|
*
|
|
* <hr>
|
|
******************************************************************************
|
|
*/
|
|
/** @addtogroup WWDT
|
|
* @{
|
|
*/
|
|
#ifndef ti_dl_dl_wwdt__include
|
|
#define ti_dl_dl_wwdt__include
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include <ti/devices/msp/msp.h>
|
|
|
|
#ifdef __MSPM0_HAS_WWDT__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* clang-format off */
|
|
|
|
/*! @enum DL_WWDT_CLOCK_DIVIDE */
|
|
typedef enum {
|
|
/*! Clock source divide by 1 */
|
|
DL_WWDT_CLOCK_DIVIDE_1 = 0x00000000,
|
|
/*! Clock source divide by 2 */
|
|
DL_WWDT_CLOCK_DIVIDE_2 = 0x00000001,
|
|
/*! Clock source divide by 3 */
|
|
DL_WWDT_CLOCK_DIVIDE_3 = 0x00000002,
|
|
/*! Clock source divide by 4 */
|
|
DL_WWDT_CLOCK_DIVIDE_4 = 0x00000003,
|
|
/*! Clock source divide by 5 */
|
|
DL_WWDT_CLOCK_DIVIDE_5 = 0x00000004,
|
|
/*! Clock source divide by 6 */
|
|
DL_WWDT_CLOCK_DIVIDE_6 = 0x00000005,
|
|
/*! Clock source divide by 7 */
|
|
DL_WWDT_CLOCK_DIVIDE_7 = 0x00000006,
|
|
/*! Clock source divide by 8 */
|
|
DL_WWDT_CLOCK_DIVIDE_8 = 0x00000007
|
|
} DL_WWDT_CLOCK_DIVIDE;
|
|
|
|
/*! @enum DL_WWDT_WINDOW */
|
|
typedef enum {
|
|
/*! Window 0 active */
|
|
DL_WWDT_WINDOW0 = WWDT_WWDTCTL1_WINSEL_WIN0,
|
|
/*! Window 1 active */
|
|
DL_WWDT_WINDOW1 = WWDT_WWDTCTL1_WINSEL_WIN1
|
|
} DL_WWDT_WINDOW;
|
|
|
|
/*! @enum DL_WWDT_WINDOW_PERIOD */
|
|
typedef enum {
|
|
/*! 0% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_0 = WWDT_WWDTCTL0_WINDOW0_SIZE_0,
|
|
/*! 12% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_12 = WWDT_WWDTCTL0_WINDOW0_SIZE_12,
|
|
/*! 18% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_18 = WWDT_WWDTCTL0_WINDOW0_SIZE_18,
|
|
/*! 25% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_25 = WWDT_WWDTCTL0_WINDOW0_SIZE_25,
|
|
/*! 50% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_50 = WWDT_WWDTCTL0_WINDOW0_SIZE_50,
|
|
/*! 75% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_75 = WWDT_WWDTCTL0_WINDOW0_SIZE_75,
|
|
/*! 81% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_81 = WWDT_WWDTCTL0_WINDOW0_SIZE_81,
|
|
/*! 87% closed window period */
|
|
DL_WWDT_WINDOW_PERIOD_87 = WWDT_WWDTCTL0_WINDOW0_SIZE_87
|
|
} DL_WWDT_WINDOW_PERIOD;
|
|
|
|
/*! @enum DL_WWDT_TIMER_PERIOD */
|
|
typedef enum {
|
|
/*! 2^6 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_6_BITS = WWDT_WWDTCTL0_PER_EN_6,
|
|
/*! 2^8 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_8_BITS = WWDT_WWDTCTL0_PER_EN_8,
|
|
/*! 2^10 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_10_BITS = WWDT_WWDTCTL0_PER_EN_10,
|
|
/*! 2^12 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_12_BITS = WWDT_WWDTCTL0_PER_EN_12,
|
|
/*! 2^15 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_15_BITS = WWDT_WWDTCTL0_PER_EN_15,
|
|
/*! 2^18 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_18_BITS = WWDT_WWDTCTL0_PER_EN_18,
|
|
/*! 2^21 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_21_BITS = WWDT_WWDTCTL0_PER_EN_21,
|
|
/*! 2^25 timer period count */
|
|
DL_WWDT_TIMER_PERIOD_25_BITS = WWDT_WWDTCTL0_PER_EN_25
|
|
} DL_WWDT_TIMER_PERIOD;
|
|
|
|
/*! @enum DL_WWDT_SLEEP_MODE */
|
|
typedef enum {
|
|
/*! Stop the watchdog while in sleep */
|
|
DL_WWDT_STOP_IN_SLEEP = WWDT_WWDTCTL0_STISM_STOP,
|
|
/*! Keep the watchdog running in sleep */
|
|
DL_WWDT_RUN_IN_SLEEP = WWDT_WWDTCTL0_STISM_CONT
|
|
} DL_WWDT_SLEEP_MODE;
|
|
|
|
/*! @enum DL_WWDT_MODE */
|
|
typedef enum {
|
|
/*! The watchdog is in watchdog mode */
|
|
DL_WWDT_WATCHDOG_MODE = 0x0,
|
|
/*! The watchdog is in interval timer mode */
|
|
DL_WWDT_INTERVAL_TIMER_MODE = WWDT_WWDTCTL0_MODE_INTERVAL
|
|
} DL_WWDT_MODE;
|
|
|
|
/*! @enum DL_WWDT_IIDX */
|
|
typedef enum {
|
|
/*! Interrupt index for WWDT if no interrupt is pending */
|
|
DL_WWDT_IIDX_NO_INT = WWDT_IIDX_STAT_NO_INTR,
|
|
/*! WWDT interrupt index for interval timer */
|
|
DL_WWDT_IIDX_INTERVAL_TIMER = WWDT_IIDX_STAT_INTTIM
|
|
} DL_WWDT_IIDX;
|
|
|
|
/*! @enum DL_WWDT_CORE_HALT */
|
|
typedef enum {
|
|
/*! WWDT will halt with core */
|
|
DL_WWDT_CORE_HALT_STOP = WWDT_PDBGCTL_FREE_STOP,
|
|
/*! WWDT ignores the state of the core halted input */
|
|
DL_WWDT_CORE_HALT_FREE_RUN = WWDT_PDBGCTL_FREE_RUN,
|
|
} DL_WWDT_CORE_HALT;
|
|
|
|
/* clang-format on */
|
|
|
|
/*!
|
|
* @brief Initializes the Window Watchdog Timer in watchdog mode
|
|
*
|
|
* While in watchdog mode, the Window Watchdog Timer must be serviced
|
|
* periodically or the device will be reset. After calling this initialization
|
|
* API the watchdog will automatically start running with whatever window is
|
|
* currently selected. See @ref DL_WWDT_setActiveWindow for setting the active
|
|
* window, this is typically window 0 upon startup.
|
|
*
|
|
* Once running, the watchdog will need to be restarted periodically with @ref
|
|
* DL_WWDT_restart.
|
|
*
|
|
* The watchdog can only be initialized once, so this API can only be called
|
|
* once, and you may not later call @ref DL_WWDT_initIntervalTimerMode.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for
|
|
* peripheral
|
|
* @param[in] divider Clock divider for the timer. One of @ref
|
|
* DL_WWDT_CLOCK_DIVIDE.
|
|
* @param[in] period Period for the timer. One of @ref
|
|
* DL_WWDT_TIMER_PERIOD.
|
|
* @param[in] sleepMode Enable/disable the timer running in sleep
|
|
* mode. One of @ref DL_WWDT_SLEEP_MODE.
|
|
* @param[in] window0ClosedPeriod The percentage of the total period that
|
|
* reset window 0 should be closed. One of
|
|
* @ref DL_WWDT_WINDOW_PERIOD.
|
|
* @param[in] window1ClosedPeriod The percentage of the total period that
|
|
* reset window 1 should be closed. One of
|
|
* @ref DL_WWDT_WINDOW_PERIOD.
|
|
*
|
|
* @sa DL_WWDT_initIntervalTimerMode
|
|
* @sa DL_WWDT_setActiveWindow
|
|
* @sa DL_WWDT_restart
|
|
*
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_initWatchdogMode(WWDT_Regs *wwdt,
|
|
DL_WWDT_CLOCK_DIVIDE divider, DL_WWDT_TIMER_PERIOD period,
|
|
DL_WWDT_SLEEP_MODE sleepMode, DL_WWDT_WINDOW_PERIOD window0ClosedPeriod,
|
|
DL_WWDT_WINDOW_PERIOD window1ClosedPeriod)
|
|
{
|
|
/* Window1 is shifted because the #defines used as an input are shared
|
|
between window 0 and window 1 */
|
|
wwdt->WWDTCTL0 =
|
|
(WWDT_WWDTCTL0_KEY_UNLOCK_W | (uint32_t) divider | (uint32_t) period |
|
|
(uint32_t) sleepMode | (uint32_t) window0ClosedPeriod |
|
|
((uint32_t) window1ClosedPeriod << 4));
|
|
}
|
|
|
|
/*!
|
|
* @brief Initializes the Window Watchdog Timer in interval timer mode
|
|
*
|
|
* The Window Watchdog Timer can be used as a simple interval timer if you do
|
|
* not need watchdog/reset functionality. After calling this initialization
|
|
* API the timer will automatically start running and start interrupting
|
|
* periodically.
|
|
*
|
|
* The WWDT can only be initialized once, so this API can only be called once,
|
|
* and you may not later call @ref DL_WWDT_initWatchdogMode.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
* @param[in] divider Clock divider for the timer. One of
|
|
* @ref DL_WWDT_CLOCK_DIVIDE.
|
|
* @param[in] period Period for the timer. One of @ref
|
|
* DL_WWDT_TIMER_PERIOD.
|
|
* @param[in] sleepMode Enable/disable the timer running in sleep mode. One
|
|
* of @ref DL_WWDT_SLEEP_MODE.
|
|
*
|
|
* @sa DL_WWDT_initWatchdogMode
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_initIntervalTimerMode(WWDT_Regs *wwdt,
|
|
DL_WWDT_CLOCK_DIVIDE divider, DL_WWDT_TIMER_PERIOD period,
|
|
DL_WWDT_SLEEP_MODE sleepMode)
|
|
{
|
|
wwdt->WWDTCTL0 =
|
|
(WWDT_WWDTCTL0_KEY_UNLOCK_W | (uint32_t) divider | (uint32_t) period |
|
|
(uint32_t) sleepMode | WWDT_WWDTCTL0_MODE_INTERVAL);
|
|
}
|
|
|
|
/**
|
|
* @brief Enables the Peripheral Write Enable (PWREN) register for the WWDT
|
|
*
|
|
* 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.
|
|
*
|
|
* @param wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_enablePower(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->GPRCM.PWREN = (WWDT_PWREN_KEY_UNLOCK_W | WWDT_PWREN_ENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Disables the Peripheral Write Enable (PWREN) register for the WWDT
|
|
*
|
|
* 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.
|
|
*
|
|
* @param wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_disablePower(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->GPRCM.PWREN = (WWDT_PWREN_KEY_UNLOCK_W | WWDT_PWREN_ENABLE_DISABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Returns if the Peripheral Write Enable (PWREN) register for the WWDT
|
|
* 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 wwdt 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_WWDT_isPowerEnabled(WWDT_Regs *wwdt)
|
|
{
|
|
return ((wwdt->GPRCM.PWREN & WWDT_PWREN_ENABLE_MASK) ==
|
|
WWDT_PWREN_ENABLE_ENABLE);
|
|
}
|
|
|
|
/**
|
|
* @brief Resets wwdt peripheral
|
|
*
|
|
* @param wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_reset(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->GPRCM.RSTCTL =
|
|
(WWDT_RSTCTL_KEY_UNLOCK_W | WWDT_RSTCTL_RESETSTKYCLR_CLR |
|
|
WWDT_RSTCTL_RESETASSERT_ASSERT);
|
|
}
|
|
|
|
/**
|
|
* @brief Returns if wwdt peripheral was reset
|
|
*
|
|
* @param wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return true if peripheral was reset
|
|
* @return false if peripheral wasn't reset
|
|
*
|
|
*/
|
|
__STATIC_INLINE bool DL_WWDT_isReset(WWDT_Regs *wwdt)
|
|
{
|
|
return ((wwdt->GPRCM.STAT & WWDT_STAT_RESETSTKY_MASK) ==
|
|
WWDT_STAT_RESETSTKY_RESET);
|
|
}
|
|
|
|
/*!
|
|
* @brief Restarts the Window Watchdog
|
|
*
|
|
* When the Window Watchdog Timer is in watchdog mode it must be periodically
|
|
* serviced to avoid a hardware reset. This API must be called after the
|
|
* closed window of the watchdog has passed but before the watchdog resets the
|
|
* device.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_restart(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->WWDTCNTRST = 0x00A7;
|
|
}
|
|
|
|
/*!
|
|
* @brief Checks if the Window Watchdog Timer is actively running
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return Returns the running status of the Window Watchdog Timer
|
|
*
|
|
* @retval true The Window Watchdog Timer is running
|
|
* @retval false The Window Watchdog Timer is not running
|
|
*/
|
|
__STATIC_INLINE bool DL_WWDT_isRunning(WWDT_Regs *wwdt)
|
|
{
|
|
return (wwdt->WWDTSTAT == WWDT_WWDTSTAT_RUN_ON);
|
|
}
|
|
|
|
/*!
|
|
* @brief Set the active window being used
|
|
*
|
|
* The Window Watchdog Timer module allows you to switch between two different
|
|
* configured windows. This allows you to configure the watchdog with two
|
|
* different window sizes and switch between them during your application.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
* @param[in] window The window to set as active. One of @ref
|
|
* DL_WWDT_WINDOW.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_setActiveWindow(
|
|
WWDT_Regs *wwdt, DL_WWDT_WINDOW window)
|
|
{
|
|
wwdt->WWDTCTL1 = (WWDT_WWDTCTL1_KEY_UNLOCK_W | (uint32_t) window);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the active window being used
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return The active window being used
|
|
*
|
|
* @retval One of @ref DL_WWDT_WINDOW
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_WINDOW DL_WWDT_getActiveWindow(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t window = (wwdt->WWDTCTL1 & WWDT_WWDTCTL1_WINSEL_MASK);
|
|
|
|
return (DL_WWDT_WINDOW)(window);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the sleep mode being used
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return The current sleep mode
|
|
*
|
|
* @retval One of @ref DL_WWDT_SLEEP_MODE
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_SLEEP_MODE DL_WWDT_getSleepMode(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t mode = (wwdt->WWDTCTL0 & WWDT_WWDTCTL0_STISM_MASK);
|
|
|
|
return (DL_WWDT_SLEEP_MODE)(mode);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the mode the watchdog is running in
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return The current mode the watchdog is running in
|
|
*
|
|
* @retval One of @ref DL_WWDT_MODE
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_MODE DL_WWDT_getMode(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t mode = (wwdt->WWDTCTL0 & WWDT_WWDTCTL0_MODE_MASK);
|
|
|
|
return (DL_WWDT_MODE)(mode);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the window closed percentage for a watchdog window
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
* @param[in] window The window to get the closed window percentage of. One
|
|
* of @ref DL_WWDT_WINDOW.
|
|
*
|
|
* @return The desired window's closed percentage
|
|
*
|
|
* @retval One of @ref DL_WWDT_WINDOW_PERIOD
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_WINDOW_PERIOD DL_WWDT_getWindowPeriod(
|
|
WWDT_Regs *wwdt, DL_WWDT_WINDOW window)
|
|
{
|
|
uint32_t period;
|
|
|
|
if (window == DL_WWDT_WINDOW0) {
|
|
period = (wwdt->WWDTCTL0 & WWDT_WWDTCTL0_WINDOW0_MASK);
|
|
} else {
|
|
period = ((wwdt->WWDTCTL0 & WWDT_WWDTCTL0_WINDOW1_MASK) >> 4);
|
|
}
|
|
|
|
return (DL_WWDT_WINDOW_PERIOD)(period);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the timer period for the watchdog
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return The current timer period for the watchdog
|
|
*
|
|
* @retval One of @ref DL_WWDT_TIMER_PERIOD
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_TIMER_PERIOD DL_WWDT_getTimerPeriod(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t period = (wwdt->WWDTCTL0 & WWDT_WWDTCTL0_PER_MASK);
|
|
|
|
return (DL_WWDT_TIMER_PERIOD)(period);
|
|
}
|
|
|
|
/*!
|
|
* @brief Get the clock divider for the watchdog
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for peripheral
|
|
*
|
|
* @return The current clock divider used
|
|
*
|
|
* @retval One of @ref DL_WWDT_CLOCK_DIVIDE
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_CLOCK_DIVIDE DL_WWDT_getClockDivider(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t clockDivider = (wwdt->WWDTCTL0 & WWDT_WWDTCTL0_CLKDIV_MASK);
|
|
|
|
return (DL_WWDT_CLOCK_DIVIDE)(clockDivider);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable WWDT interrupt
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_enableInterrupt(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->CPU_INT.IMASK = WWDT_IMASK_INTTIM_SET;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable WWDT interrupt
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_disableInterrupt(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->CPU_INT.IMASK = WWDT_IMASK_INTTIM_CLR;
|
|
}
|
|
|
|
/**
|
|
* @brief Check if WWDT interrupt is enabled
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If the WWDT interrupt is enabled
|
|
*
|
|
* @retval true The WWDT interrupt is enabled
|
|
* @retval false The WWDT interrupt is disabled
|
|
*/
|
|
__STATIC_INLINE bool DL_WWDT_isInterruptEnabled(WWDT_Regs *wwdt)
|
|
{
|
|
return ((wwdt->CPU_INT.IMASK & WWDT_IMASK_INTTIM_SET) ==
|
|
WWDT_IMASK_INTTIM_SET);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of enabled WWDT interrupt
|
|
*
|
|
* Checks if the WWDT interrupt that was previously enabled is pending.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If the enabled WWDT interrupt is pending
|
|
*
|
|
* @retval true The WWDT interrupt is pending
|
|
* @retval false The WWDT interrupt is not pending
|
|
*
|
|
* @sa DL_WWDT_enableInterrupt
|
|
*/
|
|
__STATIC_INLINE bool DL_WWDT_getEnabledInterruptStatus(WWDT_Regs *wwdt)
|
|
{
|
|
return ((wwdt->CPU_INT.MIS & WWDT_MIS_INTTIM_SET) == WWDT_MIS_INTTIM_SET);
|
|
}
|
|
|
|
/**
|
|
* @brief Check interrupt flag of any WWDT interrupt
|
|
*
|
|
* Checks if the WWDT interrupt is pending. Interrupt does not have to
|
|
* be previously enabled.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return If the WWDT interrupt is pending
|
|
*
|
|
* @retval true The WWDT interrupt is pending
|
|
* @retval false The WWDT interrupt is not pending
|
|
*/
|
|
__STATIC_INLINE uint32_t DL_WWDT_getRawInterruptStatus(WWDT_Regs *wwdt)
|
|
{
|
|
return (wwdt->CPU_INT.RIS & WWDT_RIS_INTTIM_SET);
|
|
}
|
|
|
|
/**
|
|
* @brief Get highest priority pending WWDT interrupt
|
|
*
|
|
* Checks if any of the WWDT interrupts are pending. Interrupts do not have to
|
|
* be previously enabled.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return The highest priority pending WWDT interrupt
|
|
*
|
|
* @retval One of @ref DL_WWDT_IIDX
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_IIDX DL_WWDT_getPendingInterrupt(WWDT_Regs *wwdt)
|
|
{
|
|
return (DL_WWDT_IIDX)(wwdt->CPU_INT.IIDX);
|
|
}
|
|
|
|
/**
|
|
* @brief Clear pending WWDT interrupt
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_clearInterruptStatus(WWDT_Regs *wwdt)
|
|
{
|
|
wwdt->CPU_INT.ICLR = WWDT_ICLR_INTTIM_CLR;
|
|
}
|
|
|
|
/**
|
|
* @brief Configures WWDT behavior when the core is halted.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @param[in] haltMode WWDT halt behavior. One of @ref DL_WWDT_CORE_HALT.
|
|
*
|
|
*/
|
|
__STATIC_INLINE void DL_WWDT_setCoreHaltBehavior(
|
|
WWDT_Regs *wwdt, DL_WWDT_CORE_HALT haltMode)
|
|
{
|
|
wwdt->PDBGCTL = (uint32_t) haltMode;
|
|
}
|
|
|
|
/**
|
|
* @brief Get WWDT behavior when the core is halted.
|
|
*
|
|
* @param[in] wwdt Pointer to the register overlay for the peripheral
|
|
*
|
|
* @return WWDT bahvior when core is halted. One of
|
|
* @ref DL_WWDT_CORE_HALT
|
|
*
|
|
*/
|
|
__STATIC_INLINE DL_WWDT_CORE_HALT DL_WWDT_getCoreHaltBehavior(WWDT_Regs *wwdt)
|
|
{
|
|
uint32_t haltMode = (wwdt->PDBGCTL & WWDT_PDBGCTL_FREE_MASK);
|
|
return (DL_WWDT_CORE_HALT) haltMode;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __MSPM0_HAS_WWDT__ */
|
|
|
|
#endif /* ti_dl_dl_wwdt__include */
|
|
/** @}*/
|