历史上的今天
今天是:2024年08月29日(星期四)
2019年08月29日 | STM32F429 >> 15. IWDG_独立看门狗
2019-08-29 来源:eefocus
STM32 有两个看门狗,一个是独立看门狗,另一个是窗口看门狗
独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
IWDG 功能框图

①. 独立看门狗时钟
独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,即使主时钟发生故障它仍然有效。LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我们一般取 40KHZ。
②. 计数器时钟
递减计数器的时钟由 LSI 经过一个 8 位的预分频器得到,我们可以操作预分频器寄存器 IWDG_PR 来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256,256],计数器时钟CK_CNT= 40/ (4*2^PRV)(PRV 是预分频器寄存器的值),一个计数器时钟计数器就减一。
③. 计数器
独立看门狗的计数器是一个 12 位的递减计数器,最大值为 0XFFF,当计数器减到 0 时,会产生一个复位信号:IWDG_RESET,让程序重新启动运行,如果在计数器减到 0 之前刷新了计数器的值的话,就不会产生复位信号,重新刷新计数器值的这个动作我们俗称喂狗。
④. 重装载寄存器
重装载寄存器是一个 12 位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间 Tout = (4*2^prv) / 40 * rlv (s) ,prv 是预分频器寄存器的值,rlv 是重装载寄存器的值。
⑤. 关键字(密钥)寄存器
键寄存器 IWDG_KR 可以说是独立看门狗的一个控制寄存器,主要有三种控制方式,往这个寄存器写入下面三个不同的值有不同的效果。
键值 键值作用
0xAAAA 把RLR 的值重装载到CNT
0x5555 PR 和RLR 这两个寄存器可写
0xCCCC 启动IWDG
通过写往键寄存器写 0XCCC 来启动看门狗是属于软件启动的方式,一旦独立看门狗启动,它就关不掉,只有复位才能关掉。
⑥. 状态寄存器
状态寄存器 SR 只有位 0:PVU 和位 1:RVU 有效,这两位只能由硬件操作,软件操作不了。
RVU:看门狗计数器重装载值更新,硬件置 1 表示重装载值的更新正在进行中,更新完毕之后由硬件清 0。
PVU: 看门狗预分频值更新,硬件置‘1‘指示预分频值的更新正在进行中,当更新完成后,由硬件清 0。
所以只有当 RVU/PVU 等于 0 的时候才可以更新重装载寄存器/预分频寄存器。
独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。
由于看门狗属于单片机内部资源,并且配置非常简单,故程序也非常简短,其初始化程序为:
bsp_iwdg.c
/**
******************************************************************************
* @file bsp_iwdg.c
* @author Waao
* @version V1.0.0
* @date 15-Feb-2019
* @brief This file contains some board support package's functions for the IWDG.
*
******************************************************************************
* @attention
*
* None
*
******************************************************************************
*/
#include "bsp_iwdg.h"
/**
* @brief Configure the IWDG and enable it.
* @param None
* @retval None
*/
void iwdg_Config(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_32);
IWDG_SetReload(0xFFF);
IWDG_Enable();
}
我的程序中使用按键触发中断喂狗:
stm32f4xx_it.c
void KEY1_IRQHandler(void)
{
LED_GREEN;
IWDG_ReloadCounter();
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
在该程序中,每次按下按键都可以喂狗,使计数器重新开始计数,否则计数器为零时程序将重启(复位)
史海拾趣
|
现在的无线通信依赖大量的独立设备,每种设备都有自己的协议并在一个固定的频段上工作。因为这些设备彼此不能通信,所以它们一起创造的无线环境工作效率非常低。此外,每种设备的发射和接收都有可能对其它设备产生干扰,尤其是当高功率发射器与高灵 ...… 查看全部问答> |
|
凡是学电的,总是避不开模电。 上学时老师教的知识,毕业时统统还给老师。毕业后又要从事产品设计,《模电》拿起又放下了 n 次,躲不开啊。毕业多年后,回头望,聊聊模电的学习,但愿对学弟学妹有点帮助。 通观整本 ...… 查看全部问答> |
|
S3C2410上有两个串囗,一个接了超级终端,一个接了MC55,在S3C2410装了一个LINUX系统,如何在超级终端上操作MC55,我那个MC55模块没有串囗接囗的,MC55串囗只有接了S3C2410的一个串囗,请问能在LINUX系统下用超级终端直接操作MC55吗… 查看全部问答> |
|
大家好,我是一个菜鸟。导师让我做一个在windows mobile 6.0 上开发一个蓝牙程序。只需要能搜到设备,传输文件即可。我在vs2005上的模拟器上看到有蓝牙,那个到底该怎么用呀?我电脑上面需要安装什么蓝牙驱动呀?… 查看全部问答> |
|
我做一个键盘鼠标驱动,开了一个线程采集数据.在CPU不忙时能几个毫秒采集一次,CPU很忙时,特别是打开media play进,采集间隔一下子就变成了几十毫秒.我的线程优先级用cesetthreadpriority曾经提到过0,还是不起作用,不知道还需要设置什么? 各位帮帮忙, ...… 查看全部问答> |
|
Wavecom猫在Windows自带的超级终端可正常发送短信,可使用串口编程方式发送短信时失败?为啥?? Wavecom猫在Windows自带的超级终端可正常发送短信,可使用串口编程方式发送短信时失败?为啥??我试验了好几天了,每次用Windows自带的超级终端就可以,一旦换到用Vc++串口编程方式就失败。用PortMan监视数据也没找到失败的原因?有做过碰到过钉子 ...… 查看全部问答> |
|
嗯.欢迎大家以来来讨论.或者给我一些建议. 我现在准备做一个激光器的项目.医疗用的那种.以前不是写的很多.现在正在research阶段. GUI 我倒是写过一些.之前用uc/gui,不过我个人认为有的东西uc/gui实现有的时候有些麻烦.而且这次我需要最少7种语言的 ...… 查看全部问答> |
|
C2000晒晒 + Piccolo MCU experimenter kits 外加大量资料下载! 不多说,看图!东西是前段时间买的,最近一直忙别的,这个还是没开封的呢!同时也买了个350W通信电源,准备把它改成数控的。就用C2000控制!顺便给大家提供些资料,共同学习! [ 本帖最后由 phimas 于 2011-11-25 22:16 编辑 ]… 查看全部问答> |
|
大家好,小弟有个白痴级问题,ti的c2000系列与c2400以及2800有什么关系?如果ucosii移植到c2400的版本,能直接在c2000系列的tms320f28069芯片上运行吗?谢谢各位大牛!!!… 查看全部问答> |




