274 lines
7.8 KiB
C
274 lines
7.8 KiB
C
/**********************************************************************
|
||
* $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 */
|
||
/**
|
||
* @}
|
||
*/
|
||
|