2025-04-26 16:03:23 +08:00

288 lines
6.9 KiB
C
Raw Permalink 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.

/** ##########################################################################
** Filename :
** Project :
** Module :
** Processor :
** Version : 1.0
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note :
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "clk.h"
#include "gpio.h"
#include "queue_entity.h"
#include "logic_timer.h"
#include "wdog.h"
//#include "rcm_check.h"
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
typedef struct
{
u8 state;
u16 count;
#ifdef WDOG_DEBUG_EN
u8 test[3];
#endif
}wdt_s;
typedef struct
{
u16 count;
u32 flag_self_check;
}wdt_check_s;
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
static wdt_s g_wdt;
static wdt_check_s g_wdt_check;
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void WDT_IRQHandler(void)
{
if(FL_WWDT_IsActiveFlag_NearOverflow(WWDT))
{
FL_WWDT_ClearFlag_NearOverflow(WWDT);
FL_WWDT_ReloadCounter(WWDT);
/* LED0_TOG(); */
return;
}
/* 若程序进入此分支则表示IWDT中断请自行处理 */
}
#if WDT_OPERATION_MODE == WDT_OPERATION_NORMAL
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
static void iwdt_in_init(void)
{
FL_IWDT_Init(IWDT, (FL_IWDT_InitTypeDef*)&g_IWDT_InitStruct);
//FL_IWDT_EnableFreezeWhileSleep(IWDT); //在休眠时,冻结
FL_IWDT_DisableFreezeWhileSleep(IWDT); //在休眠时,不冻结
}
#endif
#if WDT_OPERATION_MODE == WDT_OPERATION_WINDOWS
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
static void wwdt_in_init(void)
{
FL_WWDT_Init(WWDT, (FL_WWDT_InitTypeDef*)&g_WWDT_InitStruct);
NVIC_ClearPendingIRQ(WWDT_IRQn);
NVIC_DisableIRQ(WWDT_IRQn);
NVIC_SetPriority(WWDT_IRQn, NVIC_PRIORITY_WDOG);
NVIC_EnableIRQ(WWDT_IRQn);
FL_WWDT_ClearFlag_NearOverflow(WWDT);
/* 开中断 */
FL_WWDT_EnableIT_NearOverflow(WWDT);
}
#endif
/*---------------------------------------------------------------------------
|Prototype : 初始化
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void wdog_init(void)
{
//TEST1_ON();
#if WDT_OPERATION_MODE == WDT_OPERATION_NORMAL
iwdt_in_init();
#endif
#if WDT_OPERATION_MODE == WDT_OPERATION_WINDOWS
wwdt_in_init();
#endif
//TEST1_OFF();
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void wdog_task(void)
{
#if 1
#if WDT_OPERATION_MODE == WDT_OPERATION_NORMAL
#if 0//def WDOG_DEBUG_EN
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
#endif
//if(g_wdt.state == 0u)
{
FL_IWDT_ReloadCounter(IWDT);
}
#endif
#endif
}
/*---------------------------------------------------------------------------
|Prototype : 当使用窗口看门狗时的喂狗
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void wdt_feed_windows(void)
{
#if 1
#if WDT_OPERATION_MODE == WDT_OPERATION_WINDOWS
#if 0//def WDOG_DEBUG_EN
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
g_wdt.test[0]++;
TEST1_TOGGLE();
#endif
g_wdt_check.count++;
g_wdt.count++;
if(g_wdt.count>=WDT_WINDOWS_TIMEOUT)
{
g_wdt.count=0u;
FL_WWDT_ReloadCounter(WWDT);
}
#ifdef WDT_ENABLE_SELF_CHECK
else if(g_wdt.count >= (WDT_WINDOWS_TIMEOUT/2u))
{
if(g_wdt_check.flag_self_check != WDT_SELF_CHECK_DATA)
{
g_wdt_check.flag_self_check = WDT_SELF_CHECK_DATA;
FL_WWDT_ReloadCounter(WWDT);
}
}
#endif
#endif
#endif
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void wdt_enable(void)
{
//
}/* End of function wdt_enable*/
/*---------------------------------------------------------------------------
|Prototype : 禁
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void wdt_disable(void)
{
#if WDT_OPERATION_MODE == WDT_OPERATION_NORMAL
FL_IWDT_DeInit(IWDT);
#endif
#if WDT_OPERATION_MODE == WDT_OPERATION_WINDOWS
FL_WWDT_DeInit(WWDT);
#endif
}
/*end line*/