单片机STM32看门狗详解(嵌入式学习)

news2024/9/29 3:28:25

单片机STM32看门狗

  • 什么是看门狗
  • 为什么需要看门狗?
  • STM32CubeMX配置和应用
  • 示例
    • 独立看门狗(IWDG)
    • 窗口看门狗(WWDG)
  • 注意事项

什么是看门狗

单片机STM32的看门狗(Watchdog)是一种硬件定时器,用于监控系统的运行状态并在出现故障或死锁时采取措施以恢复正常操作。看门狗的主要功能是定期检查系统是否正常运行,并在系统出现问题时触发复位操作。

STM32系列单片机通常配备了内置的看门狗定时器(通常称为独立看门狗,IWDG)和窗口看门狗定时器(WWDG),以提供更可靠的系统保护。
在这里插入图片描述

独立看门狗(IWDG)是STM32中常用的看门狗,它是一个独立的硬件模块,可以在系统内部独立运行。通过配置IWDG定时器的计数器和预分频器,可以设置看门狗的定时时间。当看门狗定时器计数器达到预设的值时,会产生看门狗超时事件,触发系统复位。

窗口看门狗(WWDG)是另一种类型的看门狗,它允许在特定的时间窗口内更新计数器值,以避免触发复位。WWDG可以通过设定窗口和计数器的值来进行配置,并在每次更新计数器时,确保计数器值位于设定的窗口范围内。如果计数器超出窗口范围,将触发看门狗复位。

通过使用STM32的看门狗功能,可以监测系统运行的正常性,防止系统出现死锁或意外故障导致的无响应状态。看门狗可以在系统软件编程错误、电源干扰或其他异常情况下,提供一个安全机制来恢复系统的正常运行。

为什么需要看门狗?

看门狗在嵌入式系统中起着重要的作用,以下是一些需要看门狗的原因:

  1. 防止系统死锁:在某些情况下,嵌入式系统可能会陷入无限循环或死锁状态,导致系统停止响应。看门狗能够监测系统的运行状态,如果系统在预定的时间内没有及时更新看门狗定时器,就会触发复位操作,使系统重新启动并恢复正常运行。

  2. 处理软件故障:在开发嵌入式软件时,可能会出现编程错误、内存溢出、任务优先级错误等问题,导致系统运行不正常。看门狗可以监测系统是否持续运行,并在软件故障时进行复位,以恢复系统到初始状态。

  3. 应对外部干扰:嵌入式系统可能受到外部干扰,如电源波动、电磁干扰等。这些干扰可能导致系统崩溃或运行不正常。看门狗可以检测这些异常情况,并在系统无响应时采取措施,以确保系统的稳定性和可靠性。

  4. 提高系统可靠性:通过引入看门狗,系统可以在出现故障时自动恢复,减少系统停机时间。这对于需要连续运行和高可靠性的应用非常重要,如工业控制、汽车电子、医疗设备等领域。

总之,看门狗提供了一种监测和保护机制,确保嵌入式系统的可靠性和稳定性。它可以防止系统死锁、处理软件故障、抵御外部干扰,并提高系统的可用性和可靠性。

STM32CubeMX配置和应用

在这里插入图片描述
在这里插入图片描述

在使用STM32CubeMX配置和应用看门狗时,您可以按照以下步骤进行操作:

  1. 打开STM32CubeMX软件,并创建或打开您的工程。

  2. 在"Pinout & Configuration"选项卡中,选择您的目标STM32微控制器型号。

  3. 在"Peripherals"面板中,找到并展开"System Core"选项。

  4. 选择"Independent Watchdog"(独立看门狗)或"Window Watchdog"(窗口看门狗),具体根据您的需求选择相应的看门狗类型。

  5. 配置看门狗的参数,包括计数器值、预分频器、窗口值等,根据您的应用需求进行设置。您可以在"Configuration"面板中进行配置。

  6. 在配置完成后,单击"Project"菜单,选择"Settings",然后在"Code Generator"选项中启用看门狗的代码生成。

  7. 单击"Project"菜单,选择"Generate Code",生成代码并导出到您的工程目录。

  8. 在您的代码中,可以使用相关的看门狗函数来初始化和操作看门狗。

例如,如果使用独立看门狗(IWDG),则可以使用以下函数进行初始化和操作:

  • HAL_IWDG_Init():初始化独立看门狗,设置计数器和预分频器等参数。
  • HAL_IWDG_Start():启动独立看门狗计数器。
  • HAL_IWDG_Refresh():刷新独立看门狗计数器,防止看门狗超时复位系统。
  • HAL_IWDG_GetState():获取独立看门狗的状态,判断是否发生看门狗超时。

对于窗口看门狗(WWDG),可以使用类似的函数来进行配置和操作。

请注意,以上步骤仅涵盖了基本的配置和应用看门狗的过程。具体的步骤和函数名称可能会根据您所使用的STM32系列和CubeMX版本而有所不同。建议参考官方文档和相应的参考手册以获取更详细的信息和指导。

示例

独立看门狗(IWDG)

以下是使用STM32F103C8T6单片机编写独立看门狗(IWDG)的代码示例:

#include "stm32f1xx_hal.h"

IWDG_HandleTypeDef hiwdg;

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_4;  // 设置预分频器,产生IWDG时钟频率
  hiwdg.Init.Reload = 4095;  // 设置计数器重装载值,用于设定看门狗超时时间

  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    Error_Handler();
  }

  while (1)
  {
    HAL_IWDG_Refresh(&hiwdg);  // 刷新看门狗计数器,防止看门狗超时复位系统
    // 执行其他任务和代码
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

以上代码示例中,主要步骤如下:

  1. 初始化HAL库和系统时钟。

  2. 定义IWDG_HandleTypeDef类型的变量hiwdg,用于配置和操作独立看门狗。

  3. main()函数中,使用HAL_IWDG_Init()函数初始化独立看门狗,设置预分频器和计数器重装载值。

  4. 在主循环中,使用HAL_IWDG_Refresh()函数刷新看门狗计数器,防止看门狗超时复位系统。您可以在此处添加其他任务和代码。

请注意,此代码示例中的时钟配置是基于HSI(内部高速时钟)和PLL(锁相环)的基本配置。

窗口看门狗(WWDG)

以下是使用STM32F103C8T6单片机编写窗口看门狗(WWDG)的代码示例:

#include "stm32f1xx_hal.h"

WWDG_HandleTypeDef hwwdg;

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  hwwdg.Instance = WWDG;
  hwwdg.Init.Prescaler = WWDG_PRESCALER_8;  // 设置预分频器,产生WWDG时钟频率
  hwwdg.Init.Window = 127;  // 设置窗口值
  hwwdg.Init.Counter = 127;  // 设置计数器重装载值

  if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
  {
    Error_Handler();
  }

  while (1)
  {
    HAL_WWDG_Refresh(&hwwdg, 127);  // 刷新看门狗计数器,并设置窗口值
    // 执行其他任务和代码
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

以上代码示例中,主要步骤如下:

  1. 初始化HAL库和系统时钟。

  2. 定义WWDG_HandleTypeDef类型的变量hwwdg,用于配置和操作窗口看门狗。

  3. main()函数中,使用HAL_WWDG_Init()函数初始化窗口看门狗,设置预分频器、窗口值和计数器重装载值。

  4. 在主循环中,使用HAL_WWDG_Refresh()函数刷新看门狗计数器,并设置窗口值。您可以在此处添加其他任务和代码。

注意事项

在使用看门狗时,有几个方面需要特别注意:

  1. 看门狗定时器的配置:确保正确配置看门狗的计数器值、预分频器等参数,以满足您的应用需求和系统稳定性要求。过小的计数器值可能导致系统频繁复位,而过大的计数器值则可能导致看门狗无法及时复位系统。

  2. 定时刷新看门狗:在主循环或关键任务中,确保及时刷新看门狗,以防止看门狗超时复位系统。刷新看门狗的操作应该在预定的时间范围内完成,否则看门狗将认为系统出现故障。

  3. 看门狗的启动和停止:确保在适当的时机启动和停止看门狗。通常,在系统初始化完成后启动看门狗,并在系统关闭或出现异常情况时停止看门狗。

  4. 系统稳定性和测试:使用看门狗之前,确保系统的稳定性和可靠性。进行全面的系统测试,包括正常操作、异常情况、边界条件等,以确保看门狗能够按预期工作并保护系统免受故障影响。

  5. 注意看门狗的限制:了解您使用的具体看门狗的限制和特性。不同的单片机和看门狗模块可能具有不同的特性和限制,如最大计数器值、精度、复位时间等。确保在使用中符合相关规范和要求。

  6. 处理看门狗超时:当看门狗超时发生时,系统将被复位。如果出现看门狗超时复位,请仔细检查系统代码和硬件设计,查找潜在的问题,例如任务优先级、死循环、资源竞争等。

总之,使用看门狗需要确保正确配置和及时刷新,同时进行系统稳定性测试和故障排查,以保证系统的可靠性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PRL:城大团队提出新型量子理论

光子盒研究院 近期,由香港城市大学(城大)物理学家领导的团队开发了一个新的量子理论,解释了物质的“光诱导阶段(light-induced phase)”,并预测了它的新功能。 3月初,研究成果以Multidimensional Coherent …

基于Arduino UNO的智能摇头避障小车

目录 1.首先介绍两个基本函数 2.L298N控制逻辑 3.让小车实现前后左右轮子动代码示例 4.串口介绍 5.跟随小车开发 6.摇头避障小车开发 7.实物展示 1.首先介绍两个基本函数 void setup() { // put your setup code here, to run once: 把你的设置代码放在这里&#xff0…

创建项目并精细化配置【Vue3】

创建项目并精细化配置 git管理项目 基于 create-vue 创建出来的项目默认没有初始化git仓库,需要我们手动初始化 执行命令并完成首次提交 git initgit addgit commit -m “init” 什么是别名路径联想提示 在编写代码的过程中,一旦输入 /,V…

【数据分享】1929-2022年全球站点的逐日平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

【零基础入门学习Python---Python函数和模块】

🚀 Python 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

protoBuf

序列化和反序列化 链接 序列化的对象是什么 程序对象 对象序列化之后是什么 字节流 protocol buffer 链接 教程 原文链接 Protocol Buffer 的作用 通过将结构化的数据(拥有多种属性)进行序列化,从而实现(内存与硬盘之间…

探索MediaPipe检测人脸关键点

MediaPipe是Google开源的计算机视觉处理框架,基于TensorFlow来训练模型,支持人脸识别、人脸关键点、物体检测追踪、图像分类、人像分割、手势识别、文本分类、语音分类等。我们可以使用CPU来推理,也可以选择GPU加速推理。在滤镜特效场景&…

【软考网络管理员】2023年软考网管初级常见知识考点(17)-数据加密与签名摘要

涉及知识点 对称加密,非对称加密,数字签名,报文摘要,数字证书 软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 文章目录 涉及知识点前言一、对称加密技术1.DES2.3DES3.IDEA4.AES5…

系统架构的精髓:18个必懂的设计概念一览

要想在系统设计领域中脱颖而出,深入理解一些基础的系统设计概念是必不可少的,这些概念包括负载均衡、缓存、分区、复制、数据库和代理等。 依据我自己的经验,我总结出了18个关键概念,如果能掌握这些,将极大地提升你处…

Android APT 系列 (二):APT 筑基之注解

注解介绍 元数据 元数据就是为其他数据提供信息的数据 注解 官方解释:注解用于为代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 JDK 1.5 开始添加到 Java 的。 简单…

建议收藏:OpenKruise入门与实践

简介 OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署、发布、运维以及可用性防护。 OpenKruise 提供的绝大部分能力都是基于 CRD 扩展来定义,它们不存在于任何外部依赖,可以运行在任意纯净的…

css 背景颜色级别高于背景图

<div class"bg-parent"> <img :src"employeeImg" class"bg-url" /> <div class"bg"> <el-icon class"plus-icon"> <Plus /> </el-icon> </div> </div> .bg-parent{ //父级…

Web服务器群集:Nginx之Rewrite重写

目录 一、理论 1.Nginx正则表达式 2.location匹配 3.rewrite重写 二、实验 1.基于域名的跳转 2.基于客户端 IP访问跳转 3.基于旧域名跳转到新域名后面加目录 4.基于参数匹配的跳转 5.基于目录下所有 php结尾的文件跳转 6.基于最普通一条url请求的跳转 三、总结 一、…

福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现

漏洞概述 福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商&#xff0c;提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品Foxit PDF Reader和Foxit PDF Edit…

性能测试——App性能测试需要关注的指标

目录 一、Android客户端性能测试常见指标&#xff1a; 二、预期标准指定原则 三、测试方法及工具 一.从用户角度出发 二.站在管理员的角度考虑需要关注的性能点 三.站在开发(设计)人员角度去考虑 四.站在测试工程师角度考虑 总结&#xff1a; 一、Android客户端性能测试…

无功功率补偿及电容器的简单介绍 安科瑞 许敏

摘要&#xff1a;主要对无功功率的概念、电容器的补偿方式、补偿容量的计算等方面进行了阐述&#xff0c;在此基础上介绍了电容器运行的注意事项。 关键词&#xff1a;电力电容器&#xff1b;补偿方式 &#xff1b;运行 0 引言 笔者从进入吕合煤业从事电工工作的那天起&#…

Wav2Lip原理以及训练

原理 1: 音视频同步判别器 常规SyncNet&#xff1a; 功能&#xff1a;音频和嘴唇同步 实质&#xff1a;判断音频和唇形在某个共同参数空间下的相似性。 网络结构&#xff1a; 一种伪孪生网络结构&#xff0c;分别提取嘴形特征和音频特征&#xff0c;然后通过对比损失计算两者…

VS2017+OpenCV4.5.1 安装与配置,扩展模块opencv_contrib的安装与配置

文章目录 VS2017OpenCV4.5.1 安装与配置&#xff0c;扩展模块opencv_contrib的安装与配置1、OpenCV下载&#xff1a;&#xff08;1&#xff09;下载地址&#xff1a;https://opencv.org/releases/page&#xff08;2&#xff09;解压到指定文件夹&#xff1a; 2、配置环境&#…

如何进行可视化的数据过滤?Sugar BI 的过滤组件教你快速实现

Sugar BI 中支持了 10种过滤组件&#xff0c;这些过滤组件都是让用户在浏览报表或大屏的时候&#xff0c;能够交互式的对页面上的图表进行数据的过滤。所有过滤组件对图表的数据过滤设置都是一样的&#xff0c;如下&#xff1a; 例如页面中已有两个图表&#xff08;这两个图表…

人脑髓鞘化

髓鞘化 大纲&#xff1a;髓鞘化定义&#xff1b;髓鞘化能用来干嘛&#xff1b;髓鞘化现阶段存在的痛点&#xff1b;现有方法如何解决问题&#xff1b;我们方法的优势。 定义 髓鞘化是指髓鞘发展的过程&#xff0c;它使神经兴奋在沿神经纤维传导时速度加快&#xff0c;并保证…