一、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,就会产生系统复位。
-
寄存器
+关注
关注
31文章
5377浏览量
121394 -
STM32
+关注
关注
2274文章
10929浏览量
357995 -
IWDG
+关注
关注
0文章
21浏览量
5258 -
rc振荡器
+关注
关注
3文章
48浏览量
9629 -
独立看门狗
+关注
关注
0文章
24浏览量
3912
发布评论请先 登录
相关推荐
STM32CubeMX看门狗iwdg定时
STM32_H750_IWDG 精选资料分享
STM32F103独立看门狗IWDG使用笔记 精选资料分享
STM32使用IWDG死机
使用HAL_IWDG库让IWDG工作,为什么无法在IWDG_Reset之前刷新看门狗?
STM32各模块学习笔记
STM32看门狗WWDG和IWDG的区别是什么
![<b class='flag-5'>STM32</b>看门狗WWDG和<b class='flag-5'>IWDG</b>的区别是什么](https://file.elecfans.com/web1/M00/50/EE/o4YBAFr9PcaAVNbaAACH9a2OCmM863.png)
如何解决STM32在擦除内部FLASH时间过长导致IWDG复位的问题
![如何解决<b class='flag-5'>STM32</b>在擦除内部FLASH时间过长导致<b class='flag-5'>IWDG</b>复位的问题](https://file.elecfans.com/web1/M00/83/E9/o4YBAFxNK8CAY8TqAAK9HMaJO9U925.png)
STM32擦除内部FLASH时间过长导致IWDG复位
![<b class='flag-5'>STM32</b>擦除内部FLASH时间过长导致<b class='flag-5'>IWDG</b>复位](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
MCU学习笔记_IWDG独立看门狗
![MCU学习<b class='flag-5'>笔记</b>_<b class='flag-5'>IWDG</b>独立看门狗](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【MCU】基于STM32CubeMX 实现独立看门狗 IWDG
![【MCU】基于<b class='flag-5'>STM32</b>CubeMX 实现独立看门狗 <b class='flag-5'>IWDG</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32核心笔记
![<b class='flag-5'>STM32</b>核心<b class='flag-5'>笔记</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论