STM32 IWDG 独立看门狗

本贴最后更新于 2387 天前,其中的信息可能已经事过景迁

STM32 独立看门狗简介

在学习 STM32 的看门狗的之前要先了解什么是** 看门狗 **。   

看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间 CPU 应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到 0 就认为程序没有正常工作,强制整个系统复位。

在我看来看门狗就是用来监听程序是否正常执行,如果不正常就会整个程序就会自动复位。人(程序)定时喂狗,当喂狗的人(程序)死了,狗为了活命于是救活了(程序)人,人(程序)复活后又继续喂狗。

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

独立看门狗有几个主要的寄存器:

1.键值寄存器(IWDG_KR)

低 16 位寄存器。软件必须每隔一定时间写入 0xAAAA,否则,当计数器减到 0 时,程序会自动复位。

  • 写入 0x5555 表示允许访问 IWDG_PRIWDG_RLR 寄存器。
  • 写入 0xCCCC 时启动看门狗工作(若选择了硬件则不受此命令限制)。

在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗,此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 (一般不会为 0 为 0 时程序跑飞)时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键值寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位(程序运行正常)

2.预分频寄存器(IWDG_PR)

该寄存器用来设置看门狗时钟的分频系数,最低为 4(000),最高位 256(111),该寄存器是一个 32 位的寄存器,但是只用最低 3

3.重装载寄存器(IWDG_RLR)

更具选择的预分频和最长喂狗时间设置重装载寄存器值**(最长喂狗时间=((4×2^ 预分频系数) × 重装载值) /40 ms)。现在假设我们必须在 1 秒内喂狗否则就认为程序跑飞。当预分频系数为 4 时(预分频因子为 64)根据上面的公式可以得到重装值为:625**

iwdg.h

#ifndef IWDG_IWDG_H_
#define IWDG_IWDG_H_
 
#include <stm32f10x.h>
 
void IWDG_INIT(uint32_t prer, uint32_t rlr);
void IWDG_INIT_REG(uint32_t IWDG_Prescaler, uint32_t Reload_Value);
 
#endif /* IWDG_IWDG_H_ */

iwdg.c

#include "iwdg.h"

 
#include <stm32f10x_iwdg.h>
#include <sys/_stdint.h>
 
void IWDG_INIT(u8 IWDG_Prescaler, u16 Reload) {
 
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//取消寄存器写保护
    IWDG_SetPrescaler(IWDG_Prescaler);//预分频寄存器
    IWDG_SetReload(Reload);
    IWDG_ReloadCounter(); //从重装值加载
    IWDG_Enable();
}
 
//最长喂狗时间=((4×2^预分频系数) ×重装载值) /40 ms
void IWDG_INIT_REG(uint32_t IWDG_Prescaler, uint32_t Reload_Value){
 
    IWDG->KR = IWDG_WriteAccess_Enable;  //键值寄存器 开始启用独立看门狗
    IWDG->PR = IWDG_Prescaler;           //预分频寄存器
    IWDG->RLR = Reload_Value;            //重装载寄存器 重新装载
    IWDG->KR = 0xaaaa;                   //oxaaaa
    IWDG->KR = 0xcccc;
}

main.c

#include <stm32f10x.h>

#include <stm32f10x_gpio.h>

#include <stm32f10x_iwdg.h>

#include  <stm32f10x_rcc.h>

 

#include "delay/delay.h"
#include "iwdg/iwdg.h"
#include "led/led.h"
 
#define LED_0 GPIO_Pin_15
#define KEY_0 GPIO_Pin_0
 
//初始化LED
void LED_Init(){
 
    GPIO_InitTypeDef GPIO_Init_type;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_Init_type.GPIO_Mode           = GPIO_Mode_Out_PP;
    GPIO_Init_type.GPIO_Pin            = GPIO_Pin_All;
    GPIO_Init_type.GPIO_Speed          = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_Init_type);
    GPIO_SetBits(GPIOB, GPIO_Pin_All);
 
    GPIO_Init_type.GPIO_Mode         = GPIO_Mode_IPU;
    GPIO_Init_type.GPIO_Pin           = KEY_0;
    GPIO_Init(GPIOB, &GPIO_Init_type);
}
 
int main(int argc, char **argv) {
 
    delay_init();
    LED_Init();
    delay_ms(200);
    GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction) 0);
    IWDG_INIT(IWDG_Prescaler_64, 625); //1s喂一次 最长喂狗时间=( 64 ×重装载值) /40 ms
 
    while (1)
    {
        if (!GPIO_ReadInputDataBit(GPIOB, KEY_0)){
            delay_ms(20);
            if (!GPIO_ReadInputDataBit(GPIOB, KEY_0)){
                IWDG_ReloadCounter();//向键值寄存器写0xAAAA 重装载操作
            }
        }
    }

}

**程序效果:**如果不按下按键 LED 会每隔 1200ms 闪烁一次,如果在 LED 亮着的时候按下按键 LED 会一直亮着。

  • 编程
    53 引用 • 266 回帖 • 3 关注
  • 电子
    4 引用 • 1 关注
  • STM32

    STM32 系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的 ARM Cortex®-M0,M0+,M3, M4 和 M7 内核。按内核架构分为不同产品: 主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)

    9 引用 • 2 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1706 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 387 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    223 引用 • 474 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    7 引用 • 40 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 604 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23003 引用 • 92509 回帖 • 2 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 637 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8442 引用 • 38442 回帖 • 154 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 5 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 102 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 3 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    354 引用 • 1823 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 548 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 627 关注
  • 自由行
    4 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 354 关注