嵌入式系统---看门狗

在嵌入式系统中,看门狗定时器(Watchdog Timer,WDT)是一种常用的机制,用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因(如软件死循环)而变得无响应,看门狗定时器可以自动重启系统,从而防止系统长时间处于不可用状态。

看门狗定时器通常需要定期"喂狗"(即写入特定的值以重置计时器),来防止它触发系统重启。如果系统正常工作,它会在看门狗定时器超时之前喂狗;如果系统出现问题,没有及时喂狗,看门狗定时器就会超时并触发重启。

演示例子如下 :

cpp 复制代码
#include "stm32f4xx_hal.h"

void StartWatchdog(void) {
    // 启用独立看门狗
    HAL_IWDG_Start(&hiwdg);
}

void FeedWatchdog(void) {
    // 喂狗,重置看门狗的计数器
    HAL_IWDG_Refresh(&hiwdg);
}

int main(void) {
    // HAL库初始化
    HAL_Init();
    
    // 配置系统时钟
    SystemClock_Config();
    
    // 看门狗初始化配置
    IWDG_HandleTypeDef hiwdg;
    hiwdg.Instance = IWDG;
    hiwdg.Init.Prescaler = IWDG_PRESCALER_4;
    hiwdg.Init.Reload = 4095;
    HAL_IWDG_Init(&hiwdg);
    
    // 开启看门狗
    StartWatchdog();
    
    while (1) {
        // 正常工作时,定期喂狗
        FeedWatchdog();
        
        // 执行其他任务
    }
}

void SystemClock_Config(void) {
    // 系统时钟配置代码,根据具体硬件配置
}

void Error_Handler(void) {
    // 错误处理代码
    while(1) {
    }
}

在这个例子中:

1.使用HAL_IWDG_Init()函数初始化看门狗定时器,设置预分频器和重载值。

2.使用HAL_IWDG_Start()函数启动看门狗定时器。

3.使用HAL_IWDG_Refresh()函数喂狗,重置看门狗的计数器

总结:

具体问题具体分析,有些场景下可能对看门狗的配置更加复杂,需要根据硬件手册以及库函数文档进行操作配置。

要"关闭"看门狗定时器,通常意味着停止喂狗,让看门狗定时器超时并触发重启。在某些系统中,可能需要特殊的操作或权限来完全禁用看门狗定时器,这通常不推荐在正常运行的系统中进行,因为它会降低系统的可靠性和稳定性。

相关推荐
学逆向的1 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
水饺编程2 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编
CodeYp20192 小时前
第15讲:二叉搜索树
开发语言·c++·二叉搜索树
pipixia200333 小时前
C++继承面试四连问:内存叠加、私有继承、sizeof、权限重映射
c++·面试·嵌入式·继承·面向对象·对象模型
极客 - L U4 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯4 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
牵猫散步的鱼儿5 小时前
C++ 内存分区
c++
码小文6 小时前
CAM350使用笔记(6)---Gerber文件铺铜间距检查
嵌入式硬件·cam350软件·cam350使用笔记
choumin6 小时前
C++ 标准容器为什么不能存引用
c++·容器·引用类型
谙弆悕博士6 小时前
用 C 写了个 Windows 聊天室,踩了几个多线程和控制台的坑
c语言·开发语言·c++·windows·网络编程·聊天室