/* * Copyright (c) 2016, Freescale Semiconductor, Inc. * Copyright 2016-2018 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "fsl_rtwdog.h" /* Component ID definition, used by tools. */ #ifndef FSL_COMPONENT_ID #define FSL_COMPONENT_ID "platform.drivers.rtwdog" #endif /******************************************************************************* * Code ******************************************************************************/ /*! * 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) { if (mask & kRTWDOG_InterruptFlag) { base->CS |= RTWDOG_CS_FLG_MASK; } } /*! * 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) { assert(config); /* Initializes the configure structure to zero. */ memset(config, 0, sizeof(*config)); config->enableRtwdog = true; config->clockSource = kRTWDOG_ClockSource1; config->prescaler = kRTWDOG_ClockPrescalerDivide1; config->workMode.enableWait = true; config->workMode.enableStop = false; config->workMode.enableDebug = false; config->testMode = kRTWDOG_TestModeDisabled; config->enableUpdate = true; config->enableInterrupt = false; config->enableWindowMode = false; config->windowValue = 0U; config->timeoutValue = 0xFFFFU; } /*! * 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) { assert(config); uint32_t value = 0U; uint32_t primaskValue = 0U; value = RTWDOG_CS_EN(config->enableRtwdog) | RTWDOG_CS_CLK(config->clockSource) | RTWDOG_CS_INT(config->enableInterrupt) | RTWDOG_CS_WIN(config->enableWindowMode) | RTWDOG_CS_UPDATE(config->enableUpdate) | RTWDOG_CS_DBG(config->workMode.enableDebug) | RTWDOG_CS_STOP(config->workMode.enableStop) | RTWDOG_CS_WAIT(config->workMode.enableWait) | RTWDOG_CS_PRES(config->prescaler) | RTWDOG_CS_CMD32EN(true) | RTWDOG_CS_TST(config->testMode); /* 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. */ primaskValue = DisableGlobalIRQ(); RTWDOG_Unlock(base); base->WIN = config->windowValue; base->TOVAL = config->timeoutValue; base->CS = value; while ((base->CS & RTWDOG_CS_RCS_MASK) == 0) { } EnableGlobalIRQ(primaskValue); } /*! * 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) { uint32_t primaskValue = 0U; /* Disable the global interrupts */ primaskValue = DisableGlobalIRQ(); RTWDOG_Unlock(base); RTWDOG_Disable(base); EnableGlobalIRQ(primaskValue); }