#ifndef __LKS32MC09X_IWDG_H__
#define __LKS32MC09X_IWDG_H__

#include "lks32mc09x_reg.h"

/**
 * @brief IWDG初始化结构体句柄
 */
typedef struct
{
    uint32_t DWK_EN; ///< 深度休眠定时唤醒使能，0:禁用，1:使能
    uint32_t WDG_EN; ///< 独立看门狗使能，0:禁用，1:使能
    uint32_t WTH;    ///< 看门狗定时唤醒门限值（21位计数器，但低8位恒为0）
    uint32_t RTH;    ///< 看门狗超时复位门限值（21位计数器，但低8位恒为0）
} IWDG_InitTypeDef;

/**
 * @brief 将秒数转换为IWDG计数器值
 * @param x 秒数
 * @return IWDG计数器值，向上取整，例如设置10ms复位，最小复位门限是8mS，则实际复位时间是16mS
 */
#define IWDG_SECOND2IWDGCNT_SAT(x, min, max) ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
#define IWDG_SECOND2IWDGCNT(x)               IWDG_SECOND2IWDGCNT_SAT((int32_t)(32000 * (float)x + 0x40), 0x100, 0x1fff00)

/**
 * @brief IWDG初始化
 * @param IWDG_InitStruct 指向IWDG初始化结构体的指针
 */
void IWDG_Init(IWDG_InitTypeDef *IWDG_InitStruct);

/**
 * @brief IWDG配置结构体初始化
 * @param IWDG_InitStruct 指向IWDG初始化结构体的指针
 */
void IWDG_StrutInit(IWDG_InitTypeDef *IWDG_InitStruct);
/**
 * @brief 关闭看门狗
 */
void IWDG_DISABLE(void);

/**
 * @brief 使能看门狗
 */
void IWDG_ENABLE(void);

/**
 * @brief 喂狗，重置看门狗计数器
 */
void IWDG_Feed(void);

/**
 * @brief 设置超时复位时间
 * @param rth 超时复位时间，单位1/64k 秒，建议用 SECOND2IWDGCNT 宏将秒转换
 */
void IWDG_Update(uint32_t rth);
#endif
