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---独立看门狗 的相关文章

  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • ARM 的启动过程是怎样的?

    我们知道 对于X86架构 按下电源按钮后 机器开始执行0xFFFFFFF0处的代码 然后开始执行BIOS中的代码以进行硬件初始化 BIOS 执行后 它使用引导加载程序将操作系统映像加载到内存中 最后 操作系统代码开始运行 对于ARM架构 使
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • 如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

    我对这个已经咬牙切齿了 我需要在 ARM 板上进行分析并需要查看调用图 我尝试使用 OProfile Kernel perf 和 Google 性能工具 一切正常 但不输出任何调用图信息 这使我得出结论 我没有正确编译代码 我在编译 C 代
  • RAM 存储二进制数和汇编语言的冒泡排序

    我必须使用 ARM v7 执行一个例程 在 RAM 内存中存储 10 个二进制数 然后使用冒泡排序对这些数字从高到低进行排序 我应该如何开始 func bubbleSortAscendingU32 ldr r3 r0 4 mov r1 9
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s

随机推荐

  • 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 独立看门狗 提示 以下是本篇文章正文内容 下面案例可供