STM32 IWDG 独立看门狗

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

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 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Tomcat

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

    162 引用 • 529 回帖 • 1 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 97 关注
  • C

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

    83 引用 • 165 回帖 • 53 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 438 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 562 关注
  • 国际化

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

    7 引用 • 26 回帖 • 2 关注
  • 小说

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

    28 引用 • 108 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 4 关注
  • sts
    2 引用 • 2 回帖 • 147 关注
  • 强迫症

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

    15 引用 • 161 回帖 • 1 关注
  • OnlyOffice
    4 引用 • 28 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 906 回帖 • 189 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 679 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 12 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    368 引用 • 1212 回帖 • 578 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 252 关注
  • 面试

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

    324 引用 • 1395 回帖 • 2 关注
  • 星云链

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

    3 引用 • 16 回帖 • 5 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 682 关注