
#include "iwdog.h"

/*
	独立看门狗有一个40KHz的时钟，通过预分频值和重装载值来确定看门狗复位周期

	公式:
			Tout = ((4 × 2^prer) × rlr) / 40;

		Tout 为复位时间，单位是ms
		prer 为看门狗时钟预分频值，写入值是 0--7，是分频系数/4的幂数。例如: 4分频的值是0, 64 分频的 写入值是4
		rlr 是看门狗的重装载值
*/

//-------------------------------------------------------------------------------

#define	MAX_IWD_MS	6553

#ifdef USE_STDPERIPH_DRIVER
#define	IWDG_PRE	IWDG_Prescaler_4		// 4分频，分频后是0.1ms
#endif

#ifdef USE_FULL_LL_DRIVER
#define	IWDG_PRE	LL_IWDG_PRESCALER_4		// 4分频，分频后是0.1ms
#endif

//-------------------------------------------------------------------------------

void InitIWDog(u16 ms)
{
	if (ms < MAX_IWD_MS)
	{
		ms *= 10;
	}
	else
	{
		ms = 65535;
	}
#if (USE_IWDOG == 1)
#ifdef USE_STDPERIPH_DRIVER
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	// 取消寄存器写保护
    IWDG_SetPrescaler(IWDG_PRE);					// 设置独立看门狗的预分频系数
    IWDG_SetReload(ms);								// 设置独立看门狗的重装载值

    IWDG_ReloadCounter();							// 重载计数值, 第一次喂狗
	IWDG_Enable();									// 启动看门狗
#endif

#ifdef USE_FULL_LL_DRIVER
	LL_IWDG_EnableWriteAccess(IWDG);			// 取消寄存器写保护
	LL_IWDG_SetPrescaler(IWDG, IWDG_PRE);		// 设置独立看门狗的预分频系数
	LL_IWDG_SetWindow(IWDG, ms);				// 设置窗口
	LL_IWDG_SetReloadCounter(IWDG, ms);			// 设置独立看门狗的重装载值

	LL_IWDG_ReloadCounter(IWDG);				// 重载计数值, 第一次喂狗

	LL_IWDG_Enable(IWDG);						// 启动看门狗
#endif
#endif

}

void FeedIWDog(void)
{
#if (USE_IWDOG == 1)
#ifdef USE_STDPERIPH_DRIVER
	IWDG_ReloadCounter();
#endif

#ifdef USE_FULL_LL_DRIVER
	LL_IWDG_ReloadCounter(IWDG);
#endif
#endif
}
