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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android中级——IPC

IPC IPC是什么?多进程带来的问题IPC前提SerializableParcelableBinder Android中的IPCBundle文件共享MessengerAIDLContentProviderSocket不同IPC优缺点 Binder连接池 IPC是什么? Inter-Process Communcation,含义为进程间通信或者跨进程通信…

【FFMPEG】AVFilter使用流程

流程图 核心类 AVFilterGraph ⽤于统合这整个滤波过程的结构体 AVFilter 滤波器,滤波器的实现是通过AVFilter以及位于其下的结构体/函数来维护的 AVFilterContext ⼀个滤波器实例,即使是同⼀个滤波器,但是在进⾏实际的滤波时,也…

易模为真人3D手办制作带来了创新

3d打印技术是一项近年来迅速发展的先进制造技术,逐渐在各个领域展现出无限的潜力。其中,3d打印真人手办成为了一个备受关注的领域。在市面上,我们常常可以看到一些热门动漫角色或明星的真人3d手办,逼真的细节和完美的再现度让人们…

实验室仪器管理系统/基于微信小程序的实验室仪器管理系统

摘 要 随着当今网络的发展,时代的进步,各行各业也在发生着变化,于是网络已经逐步进入人们的生活,给我们生活或者工作提供了新的方向新的可能。 本毕业设计的内容是设计实现一个实验室仪器管理系统。使用微信开发者是以java语言…

【机器学习】主成分分析实现案例 (PCA)

一、说明 这篇文章的目的是提供主成分分析(PCA)的完整和简化的解释。我们将逐步介绍它是如何工作的,这样每个人都可以理解并使用它,即使是那些没有强大数学背景的人。 PCA是网络上广泛覆盖的机器学习方法,并且有一些关…

3.Hive SQL数据定义语言(DDL)

1. 数据定义语言概述 1.1 常见的开发方式 (1) Hive CLI、Beeline CLI Hive自带的命令行客户端 优点:不需要额外安装 缺点:编写SQL环境恶劣,无有效提示,无语法高亮,误操作率高 (2&…

LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

ipad手写笔一定要买苹果的吗?苹果平板平替电容笔排行

苹果原装Pencil,无疑是一个性能很出色的电容笔,但是,由于其的价格也很高,如果丢失了,或者弄坏,那就太可惜了。而且购买如此昂贵的苹果原装电容笔,仅仅只用于书写笔记方面,显得有点浪…

【开发问题】sqlserver怎么开启cdc

怎么开启 执行sql1、创建cdc​2.如上执行完毕之后&#xff0c;会在<database_name>数据库下的“系统表”中创建如下六个系统表&#xff1a;3.验证SQLServer库级别CDC是否启用4.启用SQLServer表级别CDC功能&#xff08;针对某一张表&#xff09;5、验证SQLServer表级别是否…

本地部署开源大模型的完整教程:LangChain + Streamlit+ Llama

在过去的几个月里&#xff0c;大型语言模型(llm)获得了极大的关注&#xff0c;这些模型创造了令人兴奋的前景&#xff0c;特别是对于从事聊天机器人、个人助理和内容创作的开发人员。 大型语言模型(llm)是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型…

【STM32智能车】小车状态

【STM32智能车】小车状态 搭建智能车 65MM轮径小车所选材料安装说明直行测试智能车可能存在的状态 智能车功能丰富&#xff0c;我们从最基础的开始&#xff0c;先来搭建一个智能车吧~。 搭建智能车 我们之前用了一个测试板子去学习调试电机&#xff0c;是时候拼装一个简单的车来…

Leetcode-每日一题【92.反转链表Ⅱ】

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4输出&#xff1a;…

详细解释lvs的工作原理

vsl用于集群中的直接路由它的原理如下 如果在公司并发太高了怎么解决 1.加配置cpu 内存 带宽 ssd高效硬盘 2.加服务器 为用户提供服务 横向扩展 集群是什么 由的多台主机构成,相当于一台大型计算机,只提供一个访问入口(域名与ip地址) 集群用在那个场景 高并发场景 vrrp是…

服务无法注册进Eureka

相同的配置&#xff0c;在demo里能注册&#xff0c;在自己项目的无法注册&#xff0c;眼睛都快盯出老花眼了&#xff0c;还是不行&#xff0c;果然出现的问题只有在发现问题以后才觉得简单&#xff08;虽然确实是小问题&#xff0c;但是排查了一整天&#xff0c;值得记录一下&a…

论文阅读:Segment Anything之阅读笔记

目录 引言整体结构介绍论文问答代码仓库中&#xff0c;模型哪部分转换为了ONNX格式&#xff1f;以及如何转的&#xff1f;Mask decoder部分 Transformer decoder block?如何整合image_embedding&#xff0c;image_pe, sparse_prompt_embedding和dense_prompt_embedding的&…

ue4:Dota总结—HUD篇

1.绘制ui&#xff1a; DrawMoney&#xff1a; DrawPower&#xff1a; 点击ui响应事件&#xff1a; 点击响应显示对应的模型&#xff1a; 点击ui拖动模型跟随鼠标移动&#xff1a; 显示ui&#xff1a;PlayerContrler&#xff1a;

内网IP怎么用域名让外网访问,域名动态解析和静态区别?

域名解析是将域名与公网IP进行对应关系&#xff0c;实现访问域名即访问到对应IP应用的方式。域名解析分静态域名解析和动态域名解析的区别&#xff0c;它们的区别在哪&#xff1f;内网IP服务器怎么用域名让外网连接访问&#xff1f;这些都是需要我们有所了解掌握的。 这里不但…

如何基于GeoToolKit/INT实现矢量流线的聚集动画效果示例

继续在上一篇文章的基础上&#xff0c;利用相同的数据处理方法统一了不同年代地层的数据格式&#xff08;目前js解析支持的格式有ZMap、TS、XYZ和XYZA等&#xff09;&#xff0c;本文主要基于GeoToolKit/INT组件&#xff0c;针对地质研究经常在二维等值线基础上模拟计算地层中物…

Quiz 14_2-2: Using Web Services | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 14_2-2: Using Web Services单选题&#xff08;1-15&#xff09;操作题Autograder 1: Extract Data from JSONAutograder 2: Calling a JSON API Python for Everybody 课程简介 Python for Everybody 零基础程序设计&#xff08;P…

NSS [NSSCTF 2022 Spring Recruit]ezgame

NSS [NSSCTF 2022 Spring Recruit]ezgame 前端小游戏&#xff0c;乐。