一、独立看门狗

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。

看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示

MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。

在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000

时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR

中的值就会被重新加载到计数器中从而避免产生看门狗复位 。

IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入

0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。

只要对以上三个寄存器进行相应的设置,我们就可以启动 STM32 的独立看门狗,启动过程可以按如下步骤实现(独立看门狗相关的库函数和定义分布在文件

stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中) :

1)取消寄存器写保护(向 IWDG_KR 写入 0X5555)

通过这步,我们取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR

的值。这在库函数中的实现函数是:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

2)设置独立看门狗的预分频系数和重装载值

设置看门狗的分频系数的函数是:

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值

设置看门狗的重装载值的函数是:

void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为:

Tout=((4×2^prer) ×rlr) /40

其中 Tout 为看门狗溢出时间(单位为 ms) ;prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;rlr

为看门狗的重装载值(IWDG_RLR 的值) ;

比如我们设定 prer 值为 4, rlr 值为 625,那么就可以得到 Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是

1s,只要你在一秒钟之内,有一次写入 0XAAAA 到

IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的

40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)

库函数里面重载计数值的函数是:

IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。 即实现独立看门狗的喂狗操作。

4) 启动看门狗(向 IWDG_KR 写入 0XCCCC)

库函数里面启动独立看门狗的函数是:

IWDG_Enable(); //使能 IWDG

通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开

IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。

/**

* 初始化独立看门狗

* prer:分频数:0~7(只有低 3 位有效!)

* 分频因子=4*2^prer.但最大值只能是 256!

* rlr:重装载寄存器值:低 11 位有效.

* 时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).

*/

void IWDG_Init(u8 prer,u16 rlr)

{

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /*

使能对寄存器IWDG_PR和IWDG_RLR的写操作*/

IWDG_SetPrescaler(prer); /设置IWDG预分频值:设置IWDG预分频值/

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

IWDG_ReloadCounter(); /按照IWDG重装载寄存器的值重装载IWDG计数器/

IWDG_Enable(); /使能IWDG/

}

/**

* 喂独立看门狗

*/

void IWDG_Feed(void)

{

IWDG_ReloadCounter(); /reload/

}

/**

*main函数

*/

void main(void)

{

NVIC_Configuration();//优先级配置

IWDG_Init(4,625);//初始化独立看门狗,分频数为64,重装载值为625,溢出时间计算为:64*625/40=1000ms=1s

while(1)

{

delay_ms(500);//0.5秒喂一次狗

IWDG_Feed();//喂狗

}

}

二、窗口看门狗

窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位

(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU

复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU

复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

小总结:

1、有个7位递减计数器(WWDG->CR),就这个计数器和窗口计数器(WWDG->CFR)决定什么时候喂狗。狗喂早了,复位——“早”体现在

计数器值(tr)>窗口值(wr),也就是计数器值还没有减到窗口值以下;

2、当 0x40 < 计数器值(tr) < 窗口值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适;

3、当 计数器的值

从0x40变到0x3F的时候,将产生看门狗复位;当然在要产生复位的前一段时间,如果开启了提前唤醒中断,那么就会进入中断,在中断函数里,我们需要及时喂狗,否则会产生复位;

4、据网上资料介绍,在这个中断里面一般不进行喂狗,一般是系统去世前的“遗嘱”,比如存储重要的数据等。这个就需要根据个人需要设计。

库函数中用中断的方式来喂狗的方法,窗口看门狗库函数相关源码和定义分布在文件stm32f10x_wwdg.c 文件和头文件

stm32f10x_wwdg.h 中。步骤如下:

1)使能 WWDG 时钟

WWDG使用的是 PCLK1 的时钟,需要先使能时钟。方法是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

2)设置窗口值和分频数

设置窗口值的函数是:

void WWDG_SetWindowValue(uint8_t WindowValue);

这个函数就一个入口参数为窗口值,很容易理解。

设置分频数的函数是:

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

这个函数同样只有一个入口参数就是分频值。

3)开启 WWDG 中断并分组

开启 WWDG 中断的函数为:

WWDG_EnableIT(); //开启窗口看门狗中断

接下来是进行中断优先级配置,使用 NVIC_Init()函数即可。

4)设置计数器初始值并使能看门狗

这一步在库函数里面是通过一个函数实现的:

void WWDG_Enable(uint8_t Counter);

该函数既设置了计数器初始值,同时使能了窗口看门狗。

5)编写中断服务函数

在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F

的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。

完成了以上 5 个步骤之后,我们就可以使用 STM32 的窗口看门狗了。

static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大. */

/**

* 初始化窗口看门狗

* tr :T[6:0],计数器值

* wr :W[6:0],窗口值

* fprer:分频系数(WDGTB),仅最低2位有效

* Fwwdg=PCLK1/(4096*2^fprer).

*/

void WWDG_Init(u8 tr,u8 wr,u32 fprer)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); /WWDG时钟使能/

WWDG_SetPrescaler(fprer); /设置IWDG预分频值/

WWDG_SetWindowValue(wr); /设置窗口值/

WWDG_CNT=tr&WWDG_CNT; /* 初始化WWDG_CNT. */

WWDG_Enable(WWDG_CNT); /*使能看门狗 , 设置 counter . */

WWDG_ClearFlag(); /清除提前唤醒中断标志位/

WWDG_NVIC_Init();/* 初始化窗口看门狗 NVIC */

WWDG_EnableIT(); /* 开启窗口看门狗中断 */

}

/**

* 窗口看门狗中断服务程序

*/

void WWDG_NVIC_Init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; /WWDG中断/

/* 抢占2,子优先级3 */

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

NVIC_Init(&NVIC_InitStructure);/* NVIC初始化*/

}

/**

* 重设置WWDG计数器的值

*/

void WWDG_Set_Counter(u8 cnt)

{

WWDG_Enable(cnt); /*使能看门狗 , 设置 counter . */

}

/**

* 看门狗中断服务程序

*/

void WWDG_IRQHandler(void)

{

WWDG_Set_Counter(WWDG_CNT);

WWDG_ClearFlag(); /清除提前唤醒中断标志位/

LED1 = ~LED1; /*LED状态翻转 */

}

小总结,一般工程都会使用两个看门狗,一个是独立看门狗,主要用于在代码跑飞之后复位使用,一个是窗口看门狗,主要用于在复位前对于一些重要数据进行保存。

---------------------------------------------------------------------------------------------------------------------------------------------------

stm32相关的学习资料

(时钟系统)

http://www.makeru.com.cn/live/1392_1082.html?s=45051

STM32中断系统

http://www.makeru.com.cn/live/3523_1745.html?s=45051

基于STM32串口应用

http://www.makeru.com.cn/live/1758_490.html?s=45051

(stm32直流电机驱动)

http://www.makeru.com.cn/live/1392_1218.html?s=45051

红外线人流感应器

http://www.makeru.com.cn/live/15971_2624.html?s=45051

智能温控小风扇

http://www.makeru.com.cn/live/15971_2625.html?s=45051

超声波雷达测距仪

http://www.makeru.com.cn/live/15971_2626.html?s=45051

系统移植(告别裸奔)

http://www.makeru.com.cn/live/1392_450.html?s=45051

大佬给总结的单片机看门狗详解很有用相关推荐

  1. STM32—看门狗详解入门(独立看门狗、窗口看门狗)

    目录 一.什么是看门狗? 二.独立看门狗IWDG 1.特点.本质及原理 2.配置 3.main.c代码 三.窗口看门狗WWDG 1.特点.本质及原理 2.配置 3.main.c代码 四.独立看门狗与窗 ...

  2. STM32看门狗详解

    看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位 独立看门狗(IWDG): 时钟来源:内部低速时钟(LSI),所以用看门狗时不需要配 ...

  3. STM32 看门狗详解

    目录 1.IWDG 1.1 独立看门狗简介 1.2 独立看门狗的特点 1.3 独立看门狗功能描述 1.4 硬件看门狗 1.5 寄存器访问保护 1.6 调试模式 2.WWDG 2.1 简介 2.2 窗口 ...

  4. 单片机看门狗c语言,单片机看门狗程序

    /*此程序实现单片机"看门狗"WDT的功能*/ #include"p18f458.h" unsignedlongi; /*系统初始化子程序*/ voidinit ...

  5. 单片机看门狗c语言,单片机看门狗程序 -解决方案-华强电子网

    *此程序实现单片机"看门狗"WDT的功能*/ #include"p18f458.h" unsignedlongi; /*系统初始化子程序*/ voidiniti ...

  6. STC单片机看门狗验证程序

    STC单片机看门狗验证程序 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sfr WDT_ ...

  7. STC89系列单片机看门狗的使用及应用程序

    转载:STC89系列单片机看门狗的使用及应用程序 "看门狗"概念及其应用在由单片机构成的系统中,由于单片机的工作有可能会受到来自外界电磁场的干扰,造成程序的跑飞,从而陷入死循环,程 ...

  8. 单片机看门狗工作原理

    刚学习单片机的萌新都听说过单片机看门狗,但是对于其工作原理并不是很清楚,今天这篇文章将为大家介绍单片机看门狗工作原理,一起来了解一下吧! 一.单片机看门狗是什么 在由单片机组成的微型计算机系统中,单片 ...

  9. STC15单片机-看门狗介绍

    什么是看门狗 在工业控制/ 汽车电子/航空航天等需要高可靠性的系统中,为了防止"系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作",通常是引进看门狗,如果 ...

最新文章

  1. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
  2. sql server 2000 版本查询
  3. 【mysql】mysql的数据库主从(一主一从)
  4. 受控组件和不受控组件的区别
  5. Docker容器导入导出
  6. 建立Win32 Console Project时会出“error LNK1123” 错误
  7. win10禁止数字签名
  8. 工作2年跳槽阿里,面试官会问哪些?(免费领取Java面试题)
  9. flutter环境配置详解及开发第一个项目
  10. iOS中使用自定义字体, 动态下载字体
  11. Java学习资料(一)——Java书籍
  12. matplotlib绘制正弦曲线
  13. 全球45个最热门免费下载电子图书的网站
  14. 如何将PDF文档进行翻译?PDF文档翻译简单方法介绍
  15. eclipse导入python文件夹_eclipse+pydev 怎么导入已有的python项目
  16. LaTeX中如何使图片插入紧跟在当前文字之后
  17. 基于ASP.NET通用后台管理系统模板
  18. 利用JavaAPI访问HDFS的文件
  19. 女生适合学数据分析吗?过来人告诉你
  20. 2022年计算机软件水平考试信息安全工程师(中级)练习题及答案

热门文章

  1. Ubuntu启动错误——Kernel panic - not syncing VFS unable to mount root fs on unknown-block 0 0
  2. java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥
  3. JavaScript系列—Object.assign()介绍以及原理实现
  4. [Unity][blender]在blender中新建标准两足人形骨骼模型动作导入到Unity中
  5. 2022年Java秋招面试必看的 | Linux 面试题
  6. 微信小程序——点击不同的标签,弹出显示不同的内容
  7. 1.4 Illustrator的三种屏幕模式
  8. Vue过滤器:第二天
  9. Android 添加Flutter 项目依赖
  10. Android gradle统一依赖版本:Composing builds