Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | /*
* 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);
}
|