STM32速成笔记(10)—IWDG

发布者:iota19最新更新时间:2024-03-05 来源: elecfans关键字:STM32  IWDG 手机看文章 扫描二维码
随时随地手机看文章

一、IWDG简介

独立看门狗 (Independent Watchdog, IWDG ),什么是看门狗?字面意思——看门的,有陌生人来,就会叫。实际在嵌入式领域里,看门狗也是这种作用,当软件程序发生故障或者程序跑飞时,看门狗会产生复位信号,复位系统。

二、STM32的IWDG

2.1 STM32的IWDG简介

STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。


独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。

  • • 自由运行的12位递减计数器

  • • 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)

  • • 看门狗被激活后,则在计数器计数至0x000时产生复位

一旦使能IWDG,就无法关闭。只有等到复位之后,才能将IWDG关闭。

2.2 喂狗

通过上面的简介可以知道,独立看门狗实际就是一个12位的递减计数器,当计数器的值递减到0的时候,就会产生复位。但是,如果我们在计数值递减到0之前,重新给计数器赋值,那么就不会再产生复位。这个操作叫做喂狗。

2.3 IWDG框图

图片

IWDG框图

IWDG的框图很好理解,IWDG由一个由独立的RC振荡器提供时钟。经过一个8位的预分频器对时钟信号进行分频。12位递减计数器按照设置好的初始值和输入时钟递减。当递减计数器递减到0时,产生独立看门狗复位。

在产生复位之前,如果将重装载寄存器传递给递减计数器,那么就会重新开始递减,这叫做喂狗。

键寄存器也叫做关键字寄存器,往该寄存器写入不同的值,有不同的作用

  • • 写入 0x5555 ——表示允许访问IWDG_PR和IWDG_RLR寄存器

  • • 写入 0xAAAA ——将重载寄存器的值传递到递减计数器,也就是喂狗

  • • 写入 0xCCCC ——启动独立看门狗功能

中文参考手册中给出了一个时间表

图片

IWDG的溢出时间表

时间的计算方法是,时间 = 重装载寄存器值 / (输入时钟频率 / 4 * 2^预分频系数)

为什么是4 * 2^预分频系数,可以看一下中文参考手册对于预分频寄存器的描述

图片

预分频寄存器描述

三、IWDG配置步骤

  • • 开启寄存器访问(允许访问IWDG_PR和IWDG_RLR寄存器)

  • • 设置IWDG预分频系数和重装载值

  • • 将重装载寄存器的值传递到递减计数器(喂狗)

  • • 开启IWDG

四、IWDG配置程序

44.1 IWDG初始化程序

/*

 *==============================================================================

 *函数名称:IWDG_Init

 *函数功能:初始化IWDG

 *输入参数:pre:预分频系数(0~6);rlr:重装载值(0~0xFFF)

 *返回值:无

 *备  注:独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40(ms)

 *==============================================================================

 */

void IWDG_Init (u8 pre,u16 rlr)

{

    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   // 取消寄存器写保护

    IWDG_SetPrescaler(pre);   // 设置预分频系数 0-6

    IWDG_SetReload(rlr);   // 设置重装载值

    IWDG_ReloadCounter();   // 重装载初值

    IWDG_Enable();   // 打开独立看门狗

}

4.2 喂狗

/*

 *==============================================================================

 *函数名称:IWDG_FeedDog

 *函数功能:喂狗

 *输入参数:无

 *返回值:无

 *备  注:无

 *==============================================================================

 */

void IWDG_FeedDog (void)

{

    IWDG_ReloadCounter();   // 重装载初值

}

五、应用实例

初始化IWDG,配置2s内不及时喂狗就会复位。通过按下按键WK UP喂狗。串口打印复位和喂狗信息。IWDG初始化程序如下


IWDG_Init(4,1250);   // 看门狗初始化,2s不及时喂狗,复位

main函数如下


u8 gKeyValue = 0;   // 记录按键键值变量


int main(void)

{

    Med_Mcu_Iint();   // 系统初始化

    printf("复位系统rn");

    

    while(1)

  {

        gKeyValue = Med_KeyScan();   // 获取按键键值

        

        // WK UP按下

        if (gKeyValue == 1)

        {

            IWDG_FeedDog();   // 喂狗

            printf ("喂狗rn");

        }

    }

}


效果如下

图片

IWDG效果

按下WK UP喂狗,不会产生系统复位。

一旦2s内,未按下WK UP,就会产生系统复位。


关键字:STM32  IWDG 引用地址:STM32速成笔记(10)—IWDG

上一篇:使用STM32点亮一颗LED实验
下一篇:STM32速成笔记(3)—按键检测

推荐阅读最新更新时间:2024-11-09 14:23

STM32 GPIO 寄存器的配置
配置每组IO口的寄存器:(每一组一套寄存器) 1、两个32位的配置寄存器;GPIOx_CRL,GPIOx_CRH 2、两个32位的数据寄存器:GPIOx_IDR,GPIOx_ODR 3、一个32位置位/复位寄存器:GPIOx_BSRR 4、一个16位的复位寄存器GPIOx_BRR 5、一个32位的锁定寄存器GPIOx_LCKR 详解 : CRL和CRH控制IO口,是四个位控制一个口,所以要两个32位的来控制16个口 1、GPIOx_CRL:端口配置低寄存器: 每个口由四位控制,为MODE+CNF联合配置,具体模式在下图中。(输入要与输入对应,输出也要与输出对应) 具体对应输入输出配置表(对上图的详解): 2、GPIOx_
[单片机]
<font color='red'>STM32</font> GPIO 寄存器的配置
stm32外部晶振由8m换成12m系统延时函数如何更改
下面我们就通过简单的三个步骤就可以让你随意的使用4—16MHz之内任何频点的晶振,我们以STM32F10x_StdPeriph_Lib_V3.4.0为例说明。 第一步,打开stm32f10x.h,将 #define HSE_VALUE ((uint32_t)8000000) 修改为: #define HSE_VALUE ((uint32_t)12000000) 第二步,打开system_stm32f10x.c,修改PLL参数,将 RCC- CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC- CFG
[单片机]
依托STM32做开发,菜鸟如何逆袭!
我想说,为了学习单片机而去学习单片机的思路不对。 你问,如何系统地入门学习stm32? 本身就是一个错误的问题。假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习。 你要考虑的是, 我可以用STM32实现什么? 为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多? 当你需要使用STM32某些功能,而51实现不了的时候, 那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi
[单片机]
STM32仿真器运行正常,脱离仿真器后无法运行
调试STM32的程序时,发现程序在仿真器环境下运行一切OK,但是固化程序后,程序在完成初始化后就不运行了。 参照网上一些朋友说的检查复位电路、晶振电路、boot0和boot1管脚电平等等都是正常的。 最后发现是由于调试信息引起的:在程序仿真过程中,使用了printf对数据进行打印调试信息,程序运行到printf函数后就不运行了,将调试信息删除后,程序运行正常。 希望对大家能有帮助。
[单片机]
STM32的三种延时方法的代码实现_纯软件延时, 系统定时器延时, 定时器延时
/* 外部调用: delay_init(72); //系统主频, 单位为MHZ, 仅对 SYSTICK_DELAY 有效 delay_ms(1000); */ #include stm32f10x.h //#define SOFT_DELAY //纯软件延时 //#define SYSTICK_DELAY //系统定时器延时 #define TIMER_DELAY //定时器延时 #ifdef TIMER_DELAY #define TIMER_DELAY TIM4 #define TIMER_DELAY_PERIOD 1000 #de
[单片机]
独立看门狗 IWDG 和 窗口看门狗 WWDG
STM32 内部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。 看门狗的最作用 在启动正常运行的时候,系统不能复位。在系统跑飞(程序异常执行)的情况,系统复位程序重新执行 独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效 IWDG 寄存器与功能原理 键值寄存器 IWDG_KR 重装载寄存器 IWDG_RLR,0~11位有效。具有写保护功能,要操作先取消写保护。 预分频寄存器 IWDG_PR ,0~2位有效。具有写保护功能,要操作先取消写保护 状态寄存器 IWDG_SR,1位有效 独立看门狗功能描述 在键值寄存器(IWDG_KR)中写
[单片机]
应用笔记 | 看似无法唤醒的一种异常现象分析
1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性,被广泛用于各类工业产品中,包括一些需要低功耗需求的应用。 2.问题描述 用户使用STM32G0B1 作为汽车多媒体音响控制器的控制芯片,用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作72 小时实验中,进入STOP 模式后,会出现无法再继续运行的情况(屏幕没有显示输出,外部中断无反应)。 3. 问题重现 通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时,测外部电压(汽车ACC 电源,轿车12V)下降后,立刻进入低功耗模式,然后通过RTC 和外部中断(PC13 下降沿触发
[单片机]
应用<font color='red'>笔记</font> | 看似无法唤醒的一种异常现象分析
使用proteus仿真STM32单片机的注意事项
第1点: 我们用户编写的代码,必须放在 user code begin 和 end 之间;否则,当我们修改stm32cubemx 项目的 配置时,再次生成代码,就会删除之前的代码;正确做法如下图所示: 我们用户编写的代码,必须放在 user code begin 和 end 之间 第2点: 在proteus中,电源需要更改成3.3V,VDDA添加到电源VCC/GND中去;VSSA添加到GND中去;如下图所示: 电源需要改成3.3V 第3点: HAL_Delay(__IO uint32_t Delay)延时函数在stm32f1xx_hal.c里面,该函数能实现ms级别的延时;该函数体前面有一个关键字__weak,该关键字简
[单片机]
使用proteus仿真<font color='red'>STM32</font>单片机的注意事项
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved