#include "lks32mc09x_iwdg.h"

/**
 * @brief IWDG初始化
 * @param IWDG_InitStruct 指向IWDG初始化结构体的指针
 */
void IWDG_Init(IWDG_InitTypeDef *IWDG_InitStruct)
{
    IWDG_InitStruct->RTH = (IWDG_InitStruct->RTH > BIT21) ? BIT21 - 1 : IWDG_InitStruct->RTH;
    IWDG_InitStruct->WTH = (IWDG_InitStruct->WTH > BIT21) ? BIT21 - 1 : IWDG_InitStruct->WTH;
    IWDG->CFG            = (IWDG_InitStruct->DWK_EN << 4) | (IWDG_InitStruct->WDG_EN);
    IWDG->PSW            = PSW_IWDG_PRE;
    IWDG->RTH            = IWDG_InitStruct->RTH;
    if (IWDG_InitStruct->RTH > IWDG_InitStruct->WTH)
    {
        IWDG->WTH = IWDG_InitStruct->RTH - IWDG_InitStruct->WTH;
    }
    else
    {
        IWDG->WTH = 0x001000;
    }
    IWDG->PSW = PSW_IWDG_PRE;
    IWDG->CLR = PSW_IWDG_CLR;
}

/**
 * @brief IWDG配置结构体初始化
 * @param IWDG_InitStruct 指向IWDG初始化结构体的指针
 */
void IWDG_StrutInit(IWDG_InitTypeDef *IWDG_InitStruct)
{
    IWDG_InitStruct->DWK_EN = DISABLE;                // 深度休眠定时唤醒使能
    IWDG_InitStruct->WDG_EN = DISABLE;                // 独立看门狗使能
    IWDG_InitStruct->WTH    = IWDG_SECOND2IWDGCNT(1); // 看门狗定时唤醒时间,大于复位时间后无效
    IWDG_InitStruct->RTH    = IWDG_SECOND2IWDGCNT(2); // 看门狗超时复位时间（21位计数器，但低12恒位0）
                                                      // SECOND2IWDGCNT输入参数，秒
}

/**
 * @brief 关闭看门狗
 */
void IWDG_DISABLE(void)
{
    IWDG->CFG = 0x3c00;
}

/**
 * @brief 使能看门狗
 */
void IWDG_ENABLE(void)
{
    IWDG->CFG = 0x1;
}

/**
 * @brief 喂狗，重置看门狗计数器
 */
void IWDG_Feed(void)
{
    IWDG->PSW = PSW_IWDG_PRE;
    IWDG->CLR = PSW_IWDG_CLR;
}
/**
 * @brief 设置超时复位时间
 * @param rth 超时复位时间，单位1/64k 秒，建议用 SECOND2IWDGCNT 宏将秒转换
 */
void IWDG_Update(uint32_t rth)
{
    IWDG->PSW = PSW_IWDG_PRE;
    IWDG->RTH = rth;
    IWDG->CLR = PSW_IWDG_CLR;
}
