STM32中独立看门狗和窗口看门狗的使用方法

独立看门狗(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

你可能感兴趣的:(单片机,stm32,嵌入式硬件)