STM32 IWDGWWDG

news2025/7/10 20:35:14

STM32 IWDG&WWDG

启动看门狗之后,看门狗是不能再被关闭的,除非发生复位。

IWDG独立看门狗

独立看门狗配置流程

  • 开启LSI时钟,只有LSI时钟开启了,独立看门狗才能运行。

    • 但是开启LSI的代码,并不需要我们来写,因为如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG。
  • 解除IWDG_PR和IWDG_RLR的写保护(向键寄存器写入0x5555)

  • 写入预分频器(IWDG_PR)和重装寄存器(IWDG_RLR)。

    预分频值和重装值具体写入多少,可以通过超时时间:TIWDG = TLSI × PR预分频系数 × (RL + 1) (其中:TLSI = 1 / FLSI)来计算。

  • 启用独立看门狗(向键寄存器写入0xCCCC)

  • 在主循环中,不断向键寄存器写入0xAAAA(使IWDG_RLR中的值重新加载到计数器(喂狗)

预分频值和重装值计算

  • TIWDG = TLSI × PR预分频系数 × (RL + 1) (其中:TLSI = 1 / FLSI

    • 比如现在设置超时时间位1000ms,也就是1s,那就是要求,喂狗时间间隔,不能超过1000ms。

    • TIWDG=1000ms,TLSI=1/40KHz=0.025ms。

    • PR和RL都是待定的数值,并且它们的值,可以有多种组合,并不是固定的,随着预分频系数的不同,RL也对应的有不同的选择。

    • 目前,我们要设置1000ms,所以前两个预分频是不能选择的(计数器计数最长时间超过了1000ms),剩下的预分频系数都可以选择,因为它们计数的最长时间和最短时间都包含了1000ms。优先选择较小的预分频系数,可以最大化利用计数器的值,来减小时间误差。因为有的时候,得到的RL值是个小数,但RL只能给整数,所以四舍五入取整就会造成误差。

    • 这里选择预分频系数为16,计算可得RL=1000/0.025/16-1=2499。(RL范围0~4096)

在这里插入图片描述

代码示例

main.c
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "Key.h"
int main(void)
{
    OLED_Init();
    Key_Init();
    
    OLED_ShowString(1,1,"IWDG TEST");
    
    if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)//查看独立看门狗复位的标志位,判断是否是独立看门狗导致的程序复位
    {
        OLED_ShowString(2,1,"IWDGSET");
        Delay_ms(500);
        OLED_ShowString(2,1,"       ");
        Delay_ms(500);
        
        RCC_ClearFlag();//清除标志位
    }
    else
    {
        OLED_ShowString(3,1,"RST");
        Delay_ms(500);
        OLED_ShowString(3,1,"   ");
        Delay_ms(100);
    }
    
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护
    IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频值
    IWDG_SetReload(2499);//配置重装值
    
    IWDG_ReloadCounter();//在启动前先喂一次狗,这样启动后的第一个喂狗周期,就是1000ms。
    IWDG_Enable();//启动看门狗
    //喂狗或使能的时候,会在键寄存器写入0x5555之外的值,又顺便给寄存器写保护了,不用再手动执行写保护。
    
    while(1)
    {
        Key_GetNum();//按住按键不放,主循环就会阻塞,主循环阻塞,不能及时喂狗,独立看门狗就会复位。
        
        IWDG_ReloadCounter();//喂狗
        
        OLED_ShowString(4,1,"FEED");
        Delay_ms(200);
        OLED_ShowString(4,1,"    ");
        Delay_ms(600);
    }
}

WWDG窗口看门狗

窗口看门狗配置流程

  • 开启窗口看门狗APB1的时钟
  • 配置预分频系数和窗口值
    • 窗口看门狗没有写保护,可以直接写寄存器
  • 写入控制寄存器CR
    • 看门狗使能位
    • 计数器溢出标志位
    • 计数器有效位
  • 不断向计数器写入想要的重装值,进行喂狗

预分频值和重装值计算

  • 超时时间:TWWDG = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] + 1)

  • 窗口时间:TWIN = TPCLK1 × 4096 × WDGTB预分频系数 × (T[5:0] - W[5:0])

  • 其中:TPCLK1 = 1 / FPCLK1

    • 超时时间
      • 比如现在设置超时时间是50ms,窗口时间是30ms。
      • 首先带入第一个公式,确定预分频和喂狗要给的计数器值,由于想要设置的超时时间为50ms,所以前三个预分频系数是不能选择的(计数器计数最长时间超过了50ms),只能选择最后一个分频系数,只有最后一个分频系数对应的时间范围包含50ms,这里WDGTB=3,对应预分频系数就是23=8。
      • TWWDG=50ms TPCLK=1/36M (单位为ms,所以取36000)WDGTB预分频系数=8,计算(取整)可得T+1=55,T[5:0]=54,但这个54只是T[5:0]的值,还有一个T6位也要设置为1,所以再54的基础上,需要再或上0x40,也就是把控制寄存器次高位T6位设置为1。(0x41 | 54)
    • 窗口时间
      • 预分频系数=8,T=54,TPCLK=1/36M,TWIN=30ms,计算(取整)可得 T-W = 33,W[5:0]=21,同理这个窗口值也是只有W[5:0],低6位,W6这一位,也需要或上0x40,给该位置1。(0x40 | 21)

在这里插入图片描述

代码示例

main.c
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "Key.h"
int main(void)
{
    OLED_Init();
    Key_Init();
    
    OLED_ShowString(1,1,"WWDG TEST");
    
    if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)//查看窗口看门狗复位的标志位,判断是否是窗口看门狗导致的程序复位
    {
        OLED_ShowString(2,1,"WWDGSET");
        Delay_ms(500);
        OLED_ShowString(2,1,"       ");
        Delay_ms(500);
        
        RCC_ClearFlag();//清除标志位
    }
    else
    {
        OLED_ShowString(3,1,"RST");
        Delay_ms(500);
        OLED_ShowString(3,1,"   ");
        Delay_ms(100);
    }
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启WWDG时钟
    
    WWDG_SetPrescaler(WWDG_Prescaler_8);//配置预分频值
    WWDG_SetWindowValue(0x40 | 21);//设置窗口值 30ms
    WWDG_Enable(0x40 | 54);//开启窗口看门狗,同时喂狗并在窗口看门狗使能位置1 50ms

    while(1)
    {
        Key_GetNum();
                
        OLED_ShowString(4,1,"FEED");
        Delay_ms(20);
        OLED_ShowString(4,1,"    ");
        Delay_ms(20);
        
        WWDG_SetCounter(0x40 | 54);//先经过40ms的延迟再喂狗(防止立刻复位) 同时在窗口看门狗使能位置0,但是不会关闭窗口看门狗,因为启动看门狗之后,看门狗是不能再被关闭的,除非发生复位
    }
}

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "Key.h"
int main(void)
{
    OLED_Init();
    Key_Init();
    
    OLED_ShowString(1,1,"WWDG TEST");
    
    if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)//查看窗口看门狗复位的标志位,判断是否是窗口看门狗导致的程序复位
    {
        OLED_ShowString(2,1,"WWDGSET");
        Delay_ms(500);
        OLED_ShowString(2,1,"       ");
        Delay_ms(500);
        
        RCC_ClearFlag();//清除标志位
    }
    else
    {
        OLED_ShowString(3,1,"RST");
        Delay_ms(500);
        OLED_ShowString(3,1,"   ");
        Delay_ms(100);
    }
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启WWDG时钟
    
    WWDG_SetPrescaler(WWDG_Prescaler_8);//配置预分频值
    WWDG_SetWindowValue(0x40 | 21);//设置窗口值 30ms
    WWDG_Enable(0x40 | 54);//开启窗口看门狗,同时喂狗并在窗口看门狗使能位置1 50ms

    while(1)
    {
        Key_GetNum();
                
        OLED_ShowString(4,1,"FEED");
        Delay_ms(20);
        OLED_ShowString(4,1,"    ");
        Delay_ms(20);
        
        WWDG_SetCounter(0x40 | 54);//先经过40ms的延迟再喂狗(防止立刻复位) 同时在窗口看门狗使能位置0,但是不会关闭窗口看门狗,因为启动看门狗之后,看门狗是不能再被关闭的,除非发生复位
    }
}

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

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

相关文章

【23种设计模式】装饰器模式

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

WinSCP 集成 putty(也可以其他Terminal客户端)

putty 安装 官网安装地址 WinSCP集成putty(也可以其他Terminal客户端) 扩展 WinSCP是什么? WinSCP(Windows Secure Copy Protocol)是一个用于 Windows 操作系统的开源的 SFTP(SSH File Transfer Protoc…

【Unity HDRP渲染管线下的WorleyUtilities文件,“Hash”函数】

Unity HDRP内置文件WorleyUtilities WorleyUtilities文件路径如下:文件代码如下然后转译到ShaderLab中:存档:WorleyUtilities文件路径如下: D:…\Library\PackageCache\com.unity.render-pipelines.high-definition@14.0.8\Runtime\Lighting\VolumetricClouds\WorleyUtili…

网络解析(二)

ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为 8,主动请求的应答为 0。 ICMP 相当于网络世界的侦察兵。我讲了两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文; ping 使用查询报文,Traceroute 使用差错报文。 IP和…

C++ 用户学习 Python 的最佳方法

对于很多是一名计算机科学专业的学生而言,很多入门是学习的C和 C,可能熟悉非常基本的 python 语法,以及 C 中相当高级的数据结构。现在想深入学习Python的话,光看很多在线教程可能没法有较大的提升,这里有一些针对C用户…

信息系统项目管理师第四版学习笔记——组织通用治理

组织战略 组织战略是组织高质量发展的总体谋略,是组织相关干系方就其发展达成一致认识的重要基础。组织战略是指组织针对其发展进行的全局性、长远性、纲领性目标的策划和选择。 战略目标是组织在一定的战略期内总体发展的总水平和总任务。它决定了组织在该战略期…

CodePlan

CodePlan论文解读 最近在看老师给的LLM-Agent论文,在这记录一下 CodePlan: Repository-level Coding using LLMs and Planning【论文】 旨在解决储存库级别的coding task,提出一个框架called CodePlan综合多步骤的编辑链,其中每个步骤都导…

华为---PPP协议简介及示例配置

PPP协议简介 PPP是Point-to-Point Protocol的简称,中文翻译为点到点协议。与以太网协议一样,PPP也是一个数据链路层协议。以太网协议定义了以太帧的格式,PPP协议也定义了自己的帧格式,这种格式的帧称为PPP帧。 利用PPP协议建立的二层网络称为…

云耀服务器L实例部署Typecho开源博客系统|华为云云耀云服务器L实例评测使用体验

云耀服务器L实例部署Typecho开源博客系统 文章目录 云耀服务器L实例部署Typecho开源博客系统1. 华为云云耀服务器L实例介绍2. Typecho2.1 Typecho 3. 部署华为云云耀服务器L实例3.1 云耀服务器L实例购买3.1.1 云耀服务器L实例初始化配置3.1.2 远程登录云耀服务器L实例 4. Typec…

基于MATLAB的图像条形码识别系统(matlab毕毕业设计2)

摘要 : 本论文旨在介绍一种基于MATLAB的图像条形码识别系统。该系统利用计算机视觉技术和图像处理算法,实现对不同类型的条形码进行准确识别。本文将详细介绍系统学习的流程,并提供详细教案,以帮助读者理解和实施该系统。 引言…

Git构建分布式版本控制系统

一、版本控制 1、概念: 版本控制(Version Control),也被称为版本管理、源代码管理或代码控制,是一种系统和工具,用于跟踪和管理文件、数据或源代码的不同版本和历史记录,在软件开发、文档管理…

深入理解Huffman编码:原理、代码示例与应用

目录 ​编辑 介绍 Huffman编码的原理 信息理论背景 频率统计 Huffman树 Huffman编码的代码示例 数据结构 权重选择 Huffman编码生成 完整示例 完整代码 测试截图 Huffman编码的应用 总结 介绍 在这个数字时代,数据的有效压缩和传输变得至关重要。Hu…

【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】

【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】 文章目录 【Linux】Ubunt20.04在vscode中使用Fira Code字体【教程】1. 什么是Fira Code字体2. 安装Fira Code字体3. 配置vscodeReference 1. 什么是Fira Code字体 Fira Code:是一种带有编程连字的等宽字体。…

多组试验时正态分布标准差估计公式

本文介绍如何通过多组试验数据来估计正态总体的标准差. 一,各组试验次数相等 设正态总体X~N(μ,σ),其中均值μ和标准差σ未知.今有m组样本,每组样本大小n相等,其试验数据如下:求标准差σ的估计σ. 多组试验时正态分布标准差估计公式 - 百度学术

机器人制作开源方案 | 行星探测车概述

1. 功能描述 行星探测车(Planetary Rover)是一种用于进行科学探索和勘测任务的无人车辆,它们被设计成能够适应各种复杂的地形条件和极端环境,以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能&#xff…

Ubuntu - 查看 IP 地址

要查看 Ubuntu 操作系统中的 IP 地址,可以使用 ip 命令或者 ifconfig 命令。以下是使用这两个命令的示例: 使用 ip 命令: 打开终端。 输入以下命令: ip a 这将显示网络接口信息,包括 IP 地址。通常,IP…

彩虹工具网程序开源未加密版源码_支持插件扩展 支持暗黑模式

2023全新UI彩虹站长在线工具箱系统源码下载 全开源版本 支持暗黑模式 支持高达72种站长工具、开发工具、娱乐工具等功能。本地调用API、自带免费API接口, 是一个多功能性工具程序支持后台管理、上传插件、添加增减删功能。 源码下载:https://download…

谈谈 Redis 主从复制模式

谈谈 Redis 主从复制模式 第一次主从节点同步是全量复制 接下来,我在具体介绍每一个阶段都做了什么。 第一阶段:建立链接、协商同步 执行了 replicaof 命令后,从服务器就会给主服务器发送 psync 命令,表示要进行数据同步。 psync…

推荐一下中国可看到当前就业形势统计的网站

推荐一下中国可看到当前就业形势统计的网站 要查看中国的就业形势统计,你可以考虑以下几个官方和主流的资源网站: 国家统计局 (National Bureau of Statistics of China): 网址:http://www.stats.gov.cn/国家统计局是中国官方发布各种统计数…

Jetpack:011-Jetpack中标题栏

文章目录 1. 概念介绍2. 使用方法2.1 标题与导航2.2 详情菜单 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中进度条相关的内容,本章回中主要介绍 标题栏。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍 我们在本章回…