通过 MX_IWDG_Init 时, 已经
开启IWDG.
剩下就是在合适的时机 HAL_IWDG_Refresh(&hiwdg);
由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下等,所以它叫独立看门狗,注意一旦开启此看门狗则只能由MCU复位后才清除,让它不再工作。
它的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ。
-
##### How to use this driver #####
-
==============================================================================
-
[..]
-
(#) Use IWDG using HAL_IWDG_Init() function to :
-
(++) Enable instance by writing Start keyword in IWDG_KEY register. LSI
-
clock is forced ON and IWDG counter starts downcounting.
-
(++) Enable write access to configuration register: IWDG_PR & IWDG_RLR.
-
(++) Configure the IWDG prescaler and counter reload value. This reload
-
value will be loaded in the IWDG counter each time the watchdog is
-
reloaded, then the IWDG will start counting down from this value.
-
(++) wait for status flags to be reset
-
(#) Then the application program must refresh the IWDG counter at regular
intervals during normal operation to prevent an MCU reset, using
HAL_IWDG_Refresh() function.
-
static void MX_IWDG_Init(void) //在 cubeMX 中配置 iwdg的频率为 40Khz
-
{
-
hiwdg.Instance = IWDG;
-
hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32分频, 差不多 1.25Khz, 约 0.8 ms 计数一次.
-
hiwdg.Init.Reload = 1000; //1000, 即1000 * 0.8 = 800ms 不刷新IWDG, 则系统复位
-
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
-
{
-
Error_Handler();
-
}
-
}
-
while (1)
-
{
-
HAL_IWDG_Refresh(&hiwdg); //喂狗
-
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
-
HAL_Delay(100); //如果为 820就很临界了, 很可能会触发引起硬复位. 主要是 40KHz 不是精确值.
-
}
窗口看门狗相对独立看门狗对计数器的刷新时间要求更加严格。必须在限定的时间窗口内刷新计数器
窗口看门狗激活情况下,7位递减寄存器满足以下条件会产生复位。
1.当递减计数器的值小于0x40时(即从0x40滚到0x3F)会产生复位。 狗饿死了.
2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位. 狗撑死了.
即不能太早刷新, 也不能太迟刷新.
WWDG时钟是挂接到APB1上, 使用 PCLK1. (24位计数器)
根据 STM32F101xx_2xx_3xx_5xx_7xx_UM.pdf P493的公式
Twwdg = Tpclk1 * 4096 * 2wdgtb(预分频) * (T[5:0](递减计数器的值) + 1)
当 PCLK1=54MHz. 如果配置
WWDG为8分频, 则
WWDG计数器的频率为:(PCLK1 (54MHz)/4096)/8) = 1648 Hz (~607 us)
WWDG计数器设置刷新值为127,则超时时间为:~607 us * (127-63(即0x40)) = 39 ms.
设置
窗口值90(狗撑死的界限), 那么在计数器递减到 90, 才能进行喂狗动作.
设置开启 WWDG的中断.
提前唤醒中断 (EWI)置 1 后,只要计数器值达到 0x40 就会产生中断。此中断只有在复位后才由硬件清零. 一般不需要设置.
-
static void MX_WWDG_Init(void) //当前设置为 PCLK1 = 32MHz.
-
{
-
hwwdg.Instance = WWDG;
-
//则 WWDG计数器的频率为:(PCLK1 (32MHz)/4096)/8) = 1000 Hz (~1000 us)
-
// WWDG计数器设置刷新值为127(狗撑死的界限),则超时时间为:~1000 us * (127-63(即0x40)) = 64 ms.
-
//设置window = 90, 则 至少需要 ~1000 us * (127-90) = 38 ms 后才能喂狗.
-
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
-
hwwdg.Init.Window = 90;
-
hwwdg.Init.Counter = 127;
-
hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
-
if (HAL_WWDG_Init(&hwwdg) != HAL_OK) //初始化并使能递减计数器开始递减.
-
{
-
Error_Handler();
-
}
-
//需要重新赋值一遍, 否则 Init被清空, 应该是HAL的BUG
-
hwwdg.Init.Window = 90;
-
hwwdg.Init.Counter = 127;
-
hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
-
}
下面就是刷新wwdg.
//当递减计数器递减到0x40时,触发中断函数,进行喂狗
void WWDG_IRQHandler(void) //注意这个暂时无法设置断点的.
{
// HAL_WWDG_IRQHandler(&hwwdg); 如果设置
EWI, 则需要开启
HAL_WWDG_Refresh(&hwwdg);
}
阅读(3456) | 评论(0) | 转发(0) |