/*
  ******************************************************************************
  * @file    APP.c
  * @author  SAM
  * @version V1.0.0
  * @date    2021
  * @brief   WDT demo source code.
  ******************************************************************************
*/
#include "app.h"
#include "fxx_wdt.h"

volatile uint32_t g_IRQFlag = 0;
volatile uint32_t g_wdtRis = 0;

/*********************************************************************************
* Function    : APP_WDT_Test
* Description : 
* Input       : fe_Func
* Output      : None
**********************************************************************************/
void APP_WDT_Test(enum_WDT_FUNC_t fe_Func)
{
    uint32_t resetReason;

    switch (fe_Func)
    {
        /* WDT中断功能 */
        case WDT_Interrupt: 
        {
            /* 使能WDT复位系统 */
            System_Enable_Disable_Reset(RESET_ENABLE_SOURCE_WDT, FUNC_ENABLE);
            
            WDT_DeInit();
            
            /* 使能WDT时钟 */
            System_Module_Enable(EN_WDT);
            /* 设置128分频 */
            WDT_SetPrescaler(WDT_CLOCK_PRESCALER_128);
            /* 设置为中断模式 */
            WDT_SetMode(WDT_MODE_INTERRUPT);
            /* 设置 Relaod */
            WDT_SetLoadValue(3000 * ((System_Get_APBClock() / 128) / 1000));   // 3000ms
            /* 设置清除中断时限 */
            WDT_SetITClrTime(5 * ((System_Get_APBClock() / 128) / 1000));    // 50ms
            
            printfS("WDT interrupt period : 3000 ms.\r\n");
            printfS("If the WDT feed dog fails, the system will be reset.\r\n");
    
            // Enable NVIC IRQ
            NVIC_ClearPendingIRQ(WDT_IRQn);
            NVIC_SetPriority(WDT_IRQn, 0x03);
            NVIC_EnableIRQ(WDT_IRQn);
            
            /* 使能中断 */
            WDT_ITCmd(WDT_INTERRUPT_ENABLE);
            
            /* 看门狗使能 */
            WDT_Cmd(WDT_ENABLE);
            
            g_IRQFlag = 0;
            g_wdtRis = 0;
            
            while(1)
            {
                if(g_IRQFlag)
                {
                    g_IRQFlag = 0;
                    printfS("WDT Interrupt occurs, WDT->RIS = %d\r\n", g_wdtRis);
                    g_wdtRis = 0;
                }
            }
            
        }break;

        /* WDT复位功能 */
        case WDT_Reset:
        {
            resetReason = System_Return_Last_Reset_Reason();
            printfS("System Return Last Reset Reason is %d\r\n", resetReason);
            if(resetReason == RESET_REASON_WDT)
            {
                resetReason = 0;
                printfS("System WDT reset\r\n");
            }
           /* 使能WDT复位系统 */
            System_Enable_Disable_Reset(RESET_ENABLE_SOURCE_WDT, FUNC_ENABLE);
            
            WDT_DeInit();
            
            /* 使能WDT时钟 */
            System_Module_Enable(EN_WDT);
            /* 设置128分频 */
            WDT_SetPrescaler(WDT_CLOCK_PRESCALER_128);
            /* 设置为复位模式 */
            WDT_SetMode(WDT_MODE_RESET);
            /* 设置 Relaod */
            WDT_SetLoadValue(3000 * ((System_Get_APBClock() / 128) / 1000));   // 500ms
            /* 设置清除中断时限 */
            WDT_SetITClrTime(5 * ((System_Get_APBClock() / 128) / 1000));    // 50ms
            
            printfS("WDT reset period : 3000 ms.\r\n");
            printfS("Without WDT feed dog fails, the system will be reset.\r\n");
   
            /* 看门狗使能 */   
            WDT_Cmd(WDT_ENABLE);       
            
            while(1)
            {

            }
        }break;

       
        
        default: break; 
    }
}
