75 lines
1.6 KiB
C
75 lines
1.6 KiB
C
|
||
#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
|
||
}
|