STM32 IWDG 独立看门狗

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

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 会一直亮着。

  • 编程
    50 引用 • 257 回帖 • 3 关注
  • 电子
    4 引用 • 1 关注
  • STM32

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

    5 引用 • 2 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • 自由行
    1 关注
  • Windows

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

    215 引用 • 462 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 41 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • Dubbo

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

    60 引用 • 82 回帖 • 609 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 4 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 374 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖 • 2 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 428 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    140 引用 • 441 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 7 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    533 引用 • 3528 回帖
  • 导航

    各种网址链接、内容导航。

    37 引用 • 168 回帖 • 1 关注
  • gRpc
    10 引用 • 8 回帖 • 55 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 175 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注