Files
tinyUSB/demos/bsp/lpc43xx/CMSIS_LPC43xx_DriverLib/src/lpc43xx_wwdt.c

274 lines
7.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**********************************************************************
* $Id$ lpc43xx_wwdt.c 2011-06-02
*//**
* @file lpc43xx_wwdt.c
* @brief Contains all functions support for WDT firmware library
* on lpc43xx
* @version 1.0
* @date 02. June. 2011
* @author NXP MCU SW Application Team
*
* Copyright(C) 2011, NXP Semiconductor
* All rights reserved.
*
***********************************************************************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
* Permission to use, copy, modify, and distribute this software and its
* documentation is hereby granted, under NXP Semiconductors
* relevant copyright in the software, without fee, provided that it
* is used in conjunction with NXP Semiconductors microcontrollers. This
* copyright, permission, and disclaimer notice must appear in all copies of
* this code.
**********************************************************************/
/* Peripheral group ----------------------------------------------------------- */
/** @addtogroup WWDT
* @{
*/
/* Includes ------------------------------------------------------------------- */
#include "lpc43xx_wwdt.h"
/* If this source file built with example, the lpc43xx FW library configuration
* file in each example directory ("lpc43xx_libcfg.h") must be included,
* otherwise the default FW library configuration file must be included instead
*/
#ifdef __BUILD_WITH_EXAMPLE__
#include "lpc43xx_libcfg.h"
#else
#include "lpc43xx_libcfg_default.h"
#endif /* __BUILD_WITH_EXAMPLE__ */
#ifdef _WWDT
void WWDT_SetTimeOut(uint32_t timeout);
/*********************************************************************//**
* @brief Update WDT timeout value and feed
* @param[in] timeout WDT timeout (us)
* @return none
**********************************************************************/
void WWDT_SetTimeOut(uint32_t timeout)
{
uint32_t timeoutVal;
timeoutVal = WDT_GET_FROM_USEC(timeout);
if(timeoutVal < WWDT_TIMEOUT_MIN)
{
timeoutVal = WWDT_TIMEOUT_MIN;
}
else if (timeoutVal > WWDT_TIMEOUT_MAX)
{
timeoutVal = WWDT_TIMEOUT_MAX;
}
LPC_WWDT->TC = timeoutVal;
}
/* Public Functions ----------------------------------------------------------- */
/** @addtogroup WDT_Public_Functions
* @{
*/
/*********************************************************************//**
* @brief Initial for Watchdog function
* @param[in] none
* @return None
**********************************************************************/
void WWDT_Init(void)
{
LPC_WWDT->MOD = 0; // Clear time out and interrupt flags
LPC_WWDT->TC = WWDT_TIMEOUT_MIN; // Reset time out
LPC_WWDT->WARNINT= 0; // Reset warning value
LPC_WWDT->WINDOW = WWDT_WINDOW_MAX; // Reset window value
}
/********************************************************************//**
* @brief Update WDT timeout value and feed
* @param[in] TimeOut TimeOut value to be updated, should be in range:
* 2048 .. 134217728
* @return None
*********************************************************************/
void WDT_UpdateTimeOut(uint32_t TimeOut)
{
/* check WDPROTECT,
* if it is enable, wait until the counter is below the value of
* WDWARNINT and WDWINDOW
*/
if(LPC_WWDT->MOD & (1<<4))
{
while((LPC_WWDT->TV <(LPC_WWDT->WARNINT & WWDT_WDWARNINT_MASK))\
&&(LPC_WWDT->TV <(LPC_WWDT->WINDOW & WWDT_WDTC_MASK)));
}
WWDT_SetTimeOut(TimeOut);
}
/********************************************************************//**
* @brief After set WDTEN, call this function to start Watchdog
* or reload the Watchdog timer
* @param[in] None
* @return None
*********************************************************************/
void WWDT_Feed (void)
{
LPC_WWDT->FEED = 0xAA;
LPC_WWDT->FEED = 0x55;
}
/********************************************************************//**
* @brief Update WDT timeout value and feed
* @param[in] WarnTime time to generate watchdog warning interrupt(us)
* should be in range: 2048 .. 8192
* @return None
*********************************************************************/
void WWDT_SetWarning(uint32_t WarnTime)
{
uint32_t warnVal;
warnVal = WDT_GET_FROM_USEC(WarnTime);
if(warnVal <= WWDT_WARNINT_MIN)
{
warnVal = WWDT_WARNINT_MIN;
}
else if (warnVal >= WWDT_WARNINT_MAX)
{
warnVal = WWDT_WARNINT_MAX;
}
LPC_WWDT->WARNINT = warnVal;
}
/********************************************************************//**
* @brief Update WDT timeout value and feed
* @param[in] WindowedTime expected time to set watchdog window event(us)
* @return none
*********************************************************************/
void WWDT_SetWindow(uint32_t WindowedTime)
{
uint32_t wndVal;
wndVal = WDT_GET_FROM_USEC(WindowedTime);
if(wndVal <= WWDT_WINDOW_MIN)
{
wndVal = WWDT_WINDOW_MIN;
}
else if (wndVal >= WWDT_WINDOW_MAX)
{
wndVal = WWDT_WINDOW_MAX;
}
LPC_WWDT->WINDOW = wndVal;
}
/*********************************************************************//**
* @brief Enable/Disable WWDT activity
* @param[in] None
* @return None
**********************************************************************/
void WWDT_Configure(st_Wdt_Config wdtCfg)
{
WWDT_SetTimeOut(wdtCfg.wdtTmrConst);
if(wdtCfg.wdtReset)
{
LPC_WWDT->MOD |= WWDT_WDMOD_WDRESET;
}
else
{
LPC_WWDT->MOD &= ~WWDT_WDMOD_WDRESET;
}
if(wdtCfg.wdtProtect)
{
LPC_WWDT->MOD |= WWDT_WDMOD_WDPROTECT;
}
else
{
LPC_WWDT->MOD &= ~WWDT_WDMOD_WDPROTECT;
}
}
/*********************************************************************//**
* @brief Enable WWDT activity
* @param[in] None
* @return None
**********************************************************************/
void WWDT_Start(void)
{
LPC_WWDT->MOD |= WWDT_WDMOD_WDEN;
WWDT_Feed();
}
/********************************************************************//**
* @brief Read WWDT status flag
* @param[in] Status kind of status flag that you want to get, should be:
* - WWDT_WARNINT_FLAG: watchdog interrupt flag
* - WWDT_TIMEOUT_FLAG: watchdog time-out flag
* @return Time out flag status of WDT
*********************************************************************/
FlagStatus WWDT_GetStatus (uint8_t Status)
{
if(Status == WWDT_WARNINT_FLAG)
{
return ((FlagStatus)(LPC_WWDT->MOD & (1<<3)));
}
else if (Status == WWDT_TIMEOUT_FLAG)
{
return ((FlagStatus)(LPC_WWDT->MOD & (1<<2)));
}
return (FlagStatus)RESET;
}
/********************************************************************//**
* @brief Read WWDT status flag
* @param[in] Status kind of status flag that you want to get, should be:
* - WWDT_WARNINT_FLAG: watchdog interrupt flag
* - WWDT_TIMEOUT_FLAG: watchdog time-out flag
* @return Time out flag status of WDT
*********************************************************************/
void WWDT_ClearStatusFlag (uint8_t flag)
{
if(flag == WWDT_WARNINT_FLAG)
{
// Write 1 to this bit to clear itself
LPC_WWDT->MOD |= WWDT_WDMOD_WDINT;
}
else if(flag == WWDT_TIMEOUT_FLAG)
{
// Write 0 to this bit to clear itself
LPC_WWDT->MOD &= ~ WWDT_WDMOD_WDTOF;
}
}
/********************************************************************//**
* @brief Get the current value of WDT
* @param[in] None
* @return current value of WDT
*********************************************************************/
uint32_t WWDT_GetCurrentCount(void)
{
return LPC_WWDT->TV;
}
/**
* @}
*/
#endif /* _WWDT */
/**
* @}
*/