149 lines
4.6 KiB
C
149 lines
4.6 KiB
C
|
/*
|
||
|
* 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);
|
||
|
}
|