/**
 * @brief IWDG-看门狗复位时间
 * @details
 * 1. 配置看门狗2S进行复位，P0.6作为指示IO。
 * 2. 初始化完成之后0.6输出低电平
 * 3. no_feed_dog_flg 等于0时正常喂狗，等于1时将0.6设置为高电平，并停止喂狗。
 * 4. feed_dog_time_mS 不等于-1时会更新喂狗时间为feed_dog_time_mS毫秒
 * 5. 给P0.6接一个下拉(芯片复位后所有IO都是低电平，看门狗的复位到GPIO初始化需要大约2mS)。
 * 6. 读取P0.6的高电平时间即可确认实际看门狗复位时间。
 */
#include "lks32mc09x_gpio.h"
#include "lks32mc09x_iwdg.h"
volatile int32_t no_feed_dog_flg = 0;
volatile int32_t feed_dog_time_mS = -1;

/**
 * @brief 主函数
 */
int main(void)
{
    // IWDG初始化结构体
    IWDG_InitTypeDef IWDG_InitStruct;

    // 硬件初始化
    // 初始化GPIO
    GPIO_ResetBits(GPIO0, GPIO_Pin_6);
    GPIO_Config(GPIO0, GPIO_PinSource_6, GPIO_Mode_OUT, GPIO_AF_GPIO);

    // 初始化IWDG
    IWDG_StrutInit(&IWDG_InitStruct);
    IWDG_InitStruct.WDG_EN = 1;
    IWDG_InitStruct.WTH = IWDG_SECOND2IWDGCNT(2); // 设置看门狗定时唤醒门限值为2秒
    IWDG_Init(&IWDG_InitStruct);
    IWDG_ENABLE(); // 使能看门狗

    while (1)
    {
        if (feed_dog_time_mS != -1)
        {
            IWDG_Update(IWDG_SECOND2IWDGCNT((float)feed_dog_time_mS / 1000.0f));
            feed_dog_time_mS = -1;
        }
        if (no_feed_dog_flg == 0)
        {
            IWDG_Feed();
        }
        else
        {
            GPIO_SetBits(GPIO0, GPIO_Pin_6);
        }
    }
}
