STM32---独立看门狗

2023-11-15


前言

STM32—独立看门狗


提示:以下是本篇文章正文内容,下面案例可供参考

一、看门狗概述

1.背景

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
看门狗就是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号的电路。看门狗命令在程序的中断中拥有最高的优先级。

2.工作原理

看门狗电路的应用,使单片机可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在单片机其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到单片机送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。

二、使用步骤

1.添加复位检测代码

助于观察当前产品工作的可靠性,如果看门狗复位次数过多,请检查硬件与软件是否有问题的。
代码如下(示例):

/* 检查当前复位是否有独立看门狗导致 */
if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
{
    /* IWDGRST flag set */
    printf("iwdg reset cpu\r\n");
}
else
{
    /* IWDGRST flag is not set */
    printf("normal reset cpu\r\n");
}
/* Clear reset flags */
RCC_ClearFlag();

2.喂狗时间设置

代码如下(示例):

/* 独立看门狗是受到保护的,现在进行解锁动作 */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
 
/* 设置看门狗的时钟 = 32KHz / 256 =125Hz */
IWDG_SetPrescaler(IWDG_Prescaler_256);
 
/* 设置看门狗的超时时间,也就是设置它的计数值
当前看门狗的时钟为125Hz,然后设置超时时间为1秒,那么重载值为125-1
当前看门狗的时钟为125Hz,然后设置超时时间为2秒,那么重载值为250-1
*/   
IWDG_SetReload(125-1);
 
/* Reload IWDG counter,重载独立看门狗的计数值,说白了就是喂狗 */
IWDG_ReloadCounter();
 
/* Enable IWDG (the LSI oscillator will be enabled by hardware),使能独立看门狗 */
IWDG_Enable();

3.喂狗

1)在main函数死循环里每隔500毫秒喂狗,CPU无复位
代码:

while(1)
{
    //刷新计数值,让计数值非0==喂狗
    IWDG_ReloadCounter();  
    delay_ms(500);
}

2)在main函数死循环里每隔1100毫秒不及时(超时了)喂狗,CPU复位。
代码:

while(1)
{
    //刷新计数值,让计数值非0==喂狗
    IWDG_ReloadCounter();  
    delay_ms(500);
    delay_ms(600);
 
}

3)在main函数死循环里不喂狗,CPU复位。
代码:

while(1)
{
        //空代码
}

4.喂狗技巧

1.在裸机代码实现喂狗,放在定时器里面,因为定时器与看门狗是使用不同的时钟源,允许这么做!
2. 如果有实时的操作系统的加持,可以在任务里面添加喂狗动作,如果操作系统崩溃了,能够检测到软件的错误,触发CPU的复位。

三、应用领域

手机、平板、电脑“重新启动”
在这里插入图片描述

四、源码地址

独立看门狗源码下载

总结

以上就是今天要讲的内容,本文仅仅简单介绍了STM32独立看门狗的使用,而STM32的其他一些使用模块,请各位大神移步本博主其他文章或是关注博主等待后续发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32---独立看门狗 的相关文章

  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 交叉编译armv5,但它创建v7二进制文件

    我设法为arm926ej s创建了一个目标文件我在 qemu 上使用 Debian Arm arm linux gnueabi gcc 4 4 static O c mcpu arm926ej s hello c o hello root
  • 如何在WinMobile6上启用ARMv6非对齐访问?

    ARMv6 引入了一个很棒的功能 未对齐的内存访问 这使得代码中的某些事情变得更加简单和更快 但微软只在winCE6中提供了API 现在大多数 PDA 都基于 WinMobile6 基于 CE 5 x 默认情况下禁用未对齐访问 我尝试在 C
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • 将 C 函数与 ARM 汇编结合使用

    我见过人们在代码中使用 C 库中的 printf 的示例 如下所示 data balign 4 hello asciz Hello n text global main func main main ldr r0 hello msg bl
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e

随机推荐

  • openGL之API学习(十六)glViewport

    确定要绘制的区域 如果你打算把整个屏幕渲染到一个或大或小的纹理上 你需要用新的纹理的尺寸作为参数再次调用glViewport 要在渲染到你的帧缓冲之前做好 否则只有一小部分纹理或屏幕能够绘制到纹理上 void glViewport GLin
  • 【Docker基础入门】部署docker管理工具portainer-ce

    Docker基础入门 部署docker管理工具portainer ce 一 portainer ce介绍 1 portainer简介 2 portainer ce简介 3 portainer ce容器镜像说明 二 检查本地docker环境
  • python计算机视觉第五次实验

    相机标定 Camera calibration 摄像机标定简单来说是从世界坐标系转换为相机坐标系 再由相机坐标系转换为图像坐标系的过程 也就是求最终的投影矩阵P的过程 世界坐标系 用户定义的三维世界的坐标系 为了描述目标物在真实世界里的位置
  • vite项目中处理各种静态资源的引入方式介绍

    一 引用图片资源 在vite创建的vue3项目中 引用图片资源有以下两种方式 直接在模板中使用路径引用 在模板中使用标签 通过src属性引用图片 例如
  • Python os.path() 模块

    os path 模块主要用于获取文件的属性 以下是os path 模块的几种常用方法 方法 说明 os path abspath path 返回绝对路径 os path basename path 返回路径中最后一个元素 以 结尾时返回空字
  • 静态代码扫描(六)——火线针对资源关闭问题的横向对比报告

    在上一篇文章中 我们列举了一些资源关闭需要考虑的特殊场景 并且预告了会在这篇放出火线和其他开源产品横向的扫描结果对比报告 包括Sonar Infer PMD和Findbugs 由于Lint没有针对资源关闭的规则 未加入对比 一 对比结果 我
  • Ubuntu更改CMAKE和C++版本

    在代码移植的过程中 因为ubuntu版本的不同 经常会出现代码在新环境中编译不通过 其中有很多因素是因为camke和C 的版本不同 下面将给出方案 更改Cmake版本 sudo apt remove cmake 删除旧版本的cmake su
  • idea 集成 rest api 测试工具 相当于 postman

    HTTP Client IntelliJ IDEs Plugin Marketplace
  • Type C --- 引脚图解

  • 小程序项目结构及项目启动过程和页面渲染过程

    微信开发者初识 编辑器 一级工具 项目 gt 退出当前项目 格式化代码 gt shift alt f 工具 gt 构建npm 详情 gt 本地设置 使用npm模块 不校验合法域名 项目结构 项目结构 pages 视图组件 页面 由四个文件组
  • CentOS 7 保姆级图文详细安装部署Apache教程

    目录 前言 一 HTTP协议介绍 二 安装依赖 三 安装apr 四 APR util安装 五 apr iconv安装 六 Apache安装 七 启动和测试Apache 国外官方 Apache 相关组件官方下载列表 Apache Distri
  • 对全连接层的理解

    1 1概述 全连接层 Fully Connected Layer 一般位于整个卷积神经网络的最后 负责将卷积输出的二维特征图转化成一维的一个向量 由此实现了端到端的学习过程 即 输入一张图像或一段语音 输出一个向量或信息 全连接层的每一个结
  • url服务器显示错误,服务器地址 (URL) 错误无效错误 - Dynamics 365 Sales

    为 Outlook 配置 时 URL Microsoft Dynamics CRM 无效 错误 3 31 2021 本文内容 本文提供了当您尝试将 Outlook 的 Microsoft Dynamics CRM 连接到您的 Microso
  • st语言编程手册plc_三菱Q系列PLC,ST语言的IF语句、CASE语句指令格式

    IF语句和CASE语句是ST编程语言中的选择 条件 语句的两种形式 1 如果 IF BOOL事件 1 0 那么 THEN 结果 语句 END IF 2 如果 IF BOOL事件 1 0 那么 THEN 结果 语句1 否则ELSE 语句2 E
  • Python 对加减乘除分别封装一个函数进行计算,参数是两个数,返回值是计算结果

    1 对加减乘除分别封装一个函数进行计算 参数是两个数 返回值是计算结果 def add x y param x param y return 返回结果 print x y return add 3 4 def sub x y param x
  • 动态菜单/权限管理的实现

    权限管理 序 现在基本上大大小小的系统都由权限分配这一基础功能 不同的用户看到的界面不一样 能够使用的功能也不会尽然相同 所以我要让我的系统做到超级管理员可以看到 操作所有界面 而新闻管理员只能看到新闻管理模块 仓库管理员只能看到仓库管理模
  • 基于openwrt,aria2下载器安装与配置

    迅雷下载不好用 所以用这个下载器aria2 需要安装软件 在可用软件列表中安装aria2和luci app aria2 安装完后有可能需要重启路由器 需要注意的问题 1 aria2只是一个下载工具 并没有图形界面 2 文件下载的位置 在ar
  • 在传统公司干IT是一种什么体验(六)

    不要轻视任何一家传统公司 传统公司能够在激烈的竞争中活下来 都有自己的绝活 表哥语录 表哥虽然经常吐槽自己的公司 但是大部分都是对传统公司的文化和风格的不适应 任何一家传统公司 能够在长达十几年甚至几十年的市场竞争中活下来 一定有自己的独门
  • 数据库开发之MySql(下)(多表查询)

    多表查询 介绍 多表查询就是指从多张表中查询数据 笛卡尔积 笛卡尔乘积是指在数学中 两个集合A集合 和 B集合的所有组合情况 在多表查询时 需要消除无效的笛卡尔积 怎么做多表查询的需求 要查询的数据涉及到哪些表 找出关联条件 外键 主键 其
  • STM32---独立看门狗

    文章目录 前言 一 看门狗概述 1 背景 2 工作原理 二 使用步骤 1 添加复位检测代码 2 喂狗时间设置 3 喂狗 4 喂狗技巧 三 应用领域 四 源码地址 总结 前言 STM32 独立看门狗 提示 以下是本篇文章正文内容 下面案例可供