独立看门狗(Independent Watchdog,IWDG)和窗口看门狗(Window Watchdog,WWDG)是STM32微控制器中提供的两种看门狗定时器。看门狗定时器是一种硬件计时器,用于监视系统的运行状态,并在系统出现故障或崩溃时执行相应的操作。下面,我将分别介绍STM32中独立看门狗和窗口看门狗的使用方法。
1. 独立看门狗(IWDG)的使用方法
独立看门狗是一个简单的看门狗定时器,它基于硬件提供的时钟,独立于系统时钟。主要用于监视系统中断的处理时间,确保系统在正常工作时定期喂狗,从而避免系统崩溃或卡死。以下是使用IWDG的基本步骤:
步骤1:配置看门狗时钟
为了使用IWDG,首先需要配置看门狗时钟。通过RCC寄存器设置,可以选择不同的时钟源和分频系数。
步骤2:初始化并启动IWDG
通过IWDG寄存器的设置,可以配置独立看门狗的溢出时间和预分频器。首先,需要将IWDG->KR寄存器设置为IWDG_KEY_ENABLE,以使能对IWDG寄存器的写操作。然后,配置IWDG->PR寄存器设置预分频器,IWDG->RLR寄存器设置溢出时间。最后,将IWDG->KR寄存器设置为IWDG_KEY_RELOAD,以重新加载计数器,并开始看门狗计时。
步骤3:喂狗
在系统正常工作期间,需要定期喂狗以防止独立看门狗溢出。通过执行IWDG->KR寄存器的写入操作,将其设置为IWDG_KEY_RELOAD,来重新加载计数器。
下面是一个简单的示例代码,演示了如何使用独立看门狗:
```c
#include "stm32f4xx.h"
void IWDG_Configuration(void)
{
// 步骤1:配置看门狗时钟
RCC_APB1PeriphResetCmd(RCC_APB1Periph_IWDG, ENABLE);
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
// 设置IWDG预分频器和溢出时间
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_256); // 预分频系数为256
IWDG_SetReload(0xFFF); // 溢出时间为0xfff * (4/LSI)秒
// 启动独立看门狗
IWDG_ReloadCounter();
IWDG_Enable();
}
int main(void)
{
// 系统初始化和其他配置
// IWDG配置
IWDG_Configuration();
while (1)
{
// 系统正常工作
// 定期喂狗
IWDG_ReloadCounter();
}
}
```
2. 窗口看门狗(WWDG)的使用方法
窗口看门狗是一种更高级的看门狗定时器,它可以根据设置的窗口值和计数器值来判断系统的工作状态。要确保系统正常工作,计数器的值必须在窗口范围内。以下是使用WWDG的基本步骤:
步骤1:配置看门狗时钟
与独立看门狗类似,需要配置看门狗时钟。通过RCC寄存器设置,可以选择不同的时钟源和分频系数。
步骤2:初始化并启动WWDG
通过WWDG寄存器的设置,可以配置窗口看门狗的窗口值和计数器值。首先,需要将WWDG->CFR寄存器设置为WWDG_CFR_WDGTB和WWDG_CFR_W窗口值和计数器正常工作时的设置。然后,将WWDG->CR寄存器设置为WWDG_CR_T设置计数器值。最后,通过执行WWDG->CR寄存器的写入操作,将其设置为WWDG_CR_WDGA,以启动窗口看门狗。
步骤3:喂狗
在系统正常工作期间,同样需要定期喂狗。通过执行WWDG->CR寄存器的写入操作,将其设置为WWDG_CR_WDGA,以确保计数器值在窗口范围内。
以下是一个简单的示例代码,演示了如何使用窗口看门狗:
```c
#include "stm32f4xx.h"
void WWDG_Configuration(void)
{
// 步骤1:配置看门狗时钟
RCC_APB1PeriphResetCmd(RCC_APB1Periph_WWDG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
// 设置窗口看门狗的窗口值和计数器值
WWDG_SetPrescaler(WWDG_Prescaler_8); // 预分频系数为8
WWDG_SetWindowValue(0x4F); // 窗口值为0x4F,计数器范围为[0x40, 0x4F]
WWDG_Enable(WWDG_Prescaler_8, 0x4F); // 计数器的值为0x4F
// 启动窗口看门狗
WWDG_EnableIT();
WWDG_ClearFlag();
WWDG_Enable(0x4F);
}
int main(void)
{
// 系统初始化和其他配置
// WWDG配置
WWDG_Configuration();
while (1)
{
// 系统正常工作
// 定期喂狗
WWDG_SetCounter(0x4F);
}
}
```
以上是独立看门狗(IWDG)和窗口看门狗(WWDG)的基本使用方法和示例代码。在实际应用中,可以根据需要进行更多的配置和定制。请注意,在使用看门狗时,务必确保定期喂狗,以免触发看门狗复位。同时,看门狗定时器的设置应根据系统的实际情况进行调整,以提供适当的容错能力。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦。
点击链接扫码进入嵌入式交流群 https://fss.mpay8.cn/article/dmrjinh2C6fjejm