/*
 * @Author       : stark1898y 1658608470@qq.com
 * @Date         : 2024-12-15 16:13:37
 * @LastEditors  : czq 860517298@qq.com
 * @LastEditTime : 2025-04-01 14:00:00
 * @FilePath     : \IOT_SCV_CH584M - \BSP\inc\bsp_iwdg.c
 * @Description  :
 *
 * Copyright (c) 2024 by yzy, All Rights Reserved.
 */
// https://www.cnblogs.com/debugdabiaoge/p/17580033.html
// https://www.cnblogs.com/risc5-ble/p/17853714.html
#include "bsp_iwdg.h"
#include "bsp_uart.h"
#include "log.h"

#undef LOG_ENABLE
#define LOG_ENABLE 1

#undef LOG_TAG
#define LOG_TAG "idwg"

/*********************************************************************
 * @fn      IWDG_Init
 *
 * @brief   独立看门狗（IWDG）由专用的内部低速时钟（LSI）驱动，能够在低功耗模式下正常工作。
 *
 * @param   ms
            32k rc
            div 0:4  | 1:8   | 2:16  | 3:32  |
                4:64 | 5:128 | 6:256 | 7:512(32K分频512，时钟62.5Hz) |
            reload max 4095
 * @return  none
 */
void IWDG_Init(uint16_t ms)
{
    uint16_t div = 7;
    float tick_ms = 1000 / (32000 / 512);
    uint16_t reload = (ms / tick_ms);
    R32_IWDG_KR  = 0x5555;
    R32_IWDG_CFG = ((div & 0x7) << 12) | (RB_STOP_EN) | (reload & RB_RLR);
    R32_IWDG_KR  = 0xCCCC;
    // logDebug("IWDG set: div=%d, reload=%d, R32_IWDG_CFG=0x%08X", div, reload, R32_IWDG_CFG);
}


/*********************************************************************
 * @fn      ShowRestartReason
 *
 * @brief   打印复位状态寄存器，显示复位原因
 *
 *          000：软件复位 SR（RB_WDOG_RST_EN=0时软件复位可产生此状态，否则可复位但不产生此状态）；
            001：上电复位 RPOR；
            010：看门狗超时复位 WTR；
            011：外部手动复位 MR；
            101：从下电模式唤醒时的复位 GRWSM；
            100/110/111：唤醒复位 LRW，且此前的上一次复位分别是 SR/WTR/MR。
 * @return  none
 */
void ShowRestartReason(void)
{
    uint8_t reason = R8_RESET_STATUS&0x07;
    logDebug("R8_RESET_STATUS = %02x", reason);
    switch (reason)
    {
    case RST_FLAG_SW:
        logDebug("RST_FLAG_SW");
        break;
    case RST_FLAG_RPOR:
        logDebug("RST_FLAG_RPOR");
        break;
    case RST_FLAG_WTR:
        logDebug("RST_FLAG_WTR");
        break;
    case RST_FLAG_MR:
        logDebug("RST_FLAG_MR");
        break;

    case RST_FLAG_GPWSM:
        logDebug("RST_FLAG_GPWSM");
        break;

    case 0x04:
        logDebug("LRW, last SR");
        break;
    case 0x06:
        logDebug("LRW, last WTR");
        break;
    case 0x07:
        logDebug("LRW, last MR");

    default:
        break;
    }
}