/** ****************************************************************************** * @file xl_wdog.c * @author Kirk ,xu.wang * @version 4.5.2 * @date Fri Mar 26 17:29:12 2021 * @brief This file provide function about WDOG firmware program ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ /* Includes ---------------------------------------------------------------*/ #include "xl_wdog.h" /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @defgroup WDOG WDOG Module * @brief WDOG Driver Modules Library * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup WDOG_Private_Functions * @{ */ /** * @brief ÉèÖÃWDOGÍâÉè¼Ä´æÆ÷Ϊ³õʼ״̬ * @param WDOGx: WDTÍâÉè¡£ * @retval None */ void WDOG_DeInit(WDOG_Type *WDOGx) { /* Deinitializes to default reset values */ //WDOGx->CS2 = 0x00; WDOGx->CS1 = 0x00; } /** * @brief ³õʼ»¯WTDģʽ * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @param WDOG_InitStruct: WDOG_InitTypeDef ÀàÐ͵ÄÖ¸Õ룬°üº¬Ìض¨µÄWDTÍâÉèµÄÉèÖÃÐÅÏ¢ * @retval None */ void WDOG_Init(WDOG_Type *WDOGx, const WDOG_InitTypeDef *WDOG_InitStruct) { uint8_t tmpreg1; uint32_t tmpreg; /*---------------------------- WDT CS2 Configuration ------------------------*/ /* Get the WDT CS1 value */ tmpreg1 = (uint8_t)WDOGx->CS2 ; /* Clear RPL, RMOD bits */ //tmpreg1 &= ~(WDOG_CS2_CLK_MASK | WDOG_CS2_PRES_MASK | WDOG_CS2_STOP_MASK | WDOG_CS2_WAIT_MASK | WDOG_CS2_DEBUG_MASK); tmpreg1 &= ~0x7Fu; /* Set the bit in CS1 Register */ tmpreg1 |= (uint8_t)(WDOG_InitStruct->WDOG_ClkSource | \ ((uint32_t)WDOG_InitStruct->WDOG_DEBUGEn << WDOG_CS2_DEBUG_SHIFT) | \ ((uint32_t)WDOG_InitStruct->WDOG_PRESEn << WDOG_CS2_PRES_SHIFT) | \ ((uint32_t)WDOG_InitStruct->WDOG_STOPEn << WDOG_CS2_STOP_SHIFT) | \ ((uint32_t)WDOG_InitStruct->WDOG_WAITEn << WDOG_CS2_WAIT_SHIFT)); /* Write to WDT CS1 */ WDOGx->CS2 = (uint32_t)tmpreg1; /*---------------------------- WDT CS1 Configuration ------------------------*/ /* Get the WDT CS1 value */ tmpreg = WDOGx->CS1; /* Clear RPL, RMOD bits */ tmpreg &= ~(WDOG_CS1_RMOD_MASK | WDOG_CS1_RPL_MASK); /* Set the bit in CS1 Register */ tmpreg |= (((uint32_t)WDOG_InitStruct->WDOG_PulseLength << WDOG_CS1_RPL_SHIFT) | \ ((uint32_t)WDOG_InitStruct->WDOG_ResponseMode << WDOG_CS1_RMOD_SHIFT)); /* Write to WDT CS1 */ WDOGx->CS1 = tmpreg ; /*------------------------------------ end --------------------------------*/ } /** * @brief WDOGʹÄÜ * @param WDOGx: Ñ¡ÔñWODGÍâÉè¡£ * @param State: WDOGʹÄÜ״̬ * Õâ¸ö²ÎÊý¿ÉÒÔΪÒÔÏÂÖµ: * @arg ENABLE: WDOGʹÄÜ * @arg DISABLE: WDOGʧÄÜ * @retval None */ void WDOG_EnableCmd(WDOG_Type *WDOGx,FunctionalState State) { if(State !=DISABLE) { /* Enable the WDT */ WDOGx->CS1 |= WDOG_CS1_EN_MASK; } else { /* Disable the WDT */ WDOGx->CS1 &= ~WDOG_CS1_EN_MASK; } } /** * @brief ½¨Á¢¿´ÃŹ·Ê±ÖÓ·ÖÆµ * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @param TimeoutIndex: ³¬Ê±Ê±¼ä * @retval None */ void WDOG_SetTimeoutPeriod(WDOG_Type *WDOGx, uint8_t TimeoutIndex) { WDOGx->TORR &= ~WDOG_TORR_TOP_MASK; WDOGx->TORR |= TimeoutIndex; } /** * @brief »ñµÃÄÚ²¿¼ÆÊýÆ÷µÄÖµ * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @retval ¼ÆÊýÆ÷µÄµ±Ç°Öµ */ uint32_t WDOG_GetCurrentVal(const WDOG_Type *WDOGx) { return WDOGx->CCVR ; } /** * @brief ÖØÆô WDT * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @retval None */ void WDOG_CountRestart(WDOG_Type *WDOGx) { /* write the value 0x76 to the register */ WDOGx->CRR = 0x76; } /** * @brief »ñµÃWDOGÖжÏ״̬ * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @retval ÖжÏ״̬ */ FlagStatus WDOG_GetIntStatus(const WDOG_Type *WDOGx) { FlagStatus ret; /* get the interrupt status */ if(WDOGx->STAT != 0u) { ret = SET; } else { ret = RESET; } return ret; } /** * @brief Çå¿ÕWDOGÖÐ¶Ï * @param WDOGx: Ñ¡ÔñWDTÍâÉè¡£ * @retval None */ void WDOG_ClrInt(const WDOG_Type *WDOGx) { /* Dummy read to clear */ (void)(WDOGx->EOI); } /** * @} */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */ /** * @} */ /** * @} */