288 lines
6.9 KiB
C
288 lines
6.9 KiB
C
|
/** ##########################################################################
|
|||
|
** 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*/
|