STM32看门狗研究

STM32看门狗研究stm32看门狗资料

大家好,又见面了,我是你们的朋友全栈君。

本文是通过网上收集到的资料汇总而成,感谢各大牛人的铺路。

萌狗的定义

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

STM32的看门狗

STM32芯片一共有两个看门狗,一个是独立看门狗(IWDG),另一个是窗体看门狗(WWDG)

  • 先来讲讲独立看门狗:
    STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。
  • 独立看门狗有自由运行的递减计数器
  • 独立看门狗的时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
  • 独立看门狗被激活后,则在计数器计数至0x000时产生复位

独立看门狗的配置工作代码:

 1 void IWDG_Init(u8 prer,u16 rlr)
 2 {
 3    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能对寄存器 I 写操作
 4    IWDG_SetPrescaler(prer); //②设置 IWDG 预分频值:设置 IWDG 预分频值
 5    IWDG_SetReload(rlr); //②设置 IWDG 重装载值,注意不能大于0xfff
 6    IWDG_ReloadCounter(); //③按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
 7    IWDG_Enable(); //④使能 IWDG
 8 }
 9 //喂独立看门狗
10 void IWDG_Feed(void)
11 {
12    IWDG_ReloadCounter();//reload
13 }

主逻辑区代码:

 1 delay_init();//延时函数初始化
 2 NVIC_Configuration(); //设置 NVIC 中断分组 2:2 位抢占优先级,2 位响应优先级
 3 KEY_Init(); //按键初始化
 4 IWDG_Init(4,625); //与分频数为 64,重载值为 625,溢出时间为 1s
 5 while(1)
 6 {
 7     if(KEY_Scan(0)==KEY_UP)
 8     {
 9         IWDG_Feed(); //如果 按键按下,则喂狗
10     }
11     delay_ms(10);
12 }
  • 再来看看窗体看门狗
    窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位(WWDG->CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

  • 条件复位
    ─当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
    ─当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。

如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位

看门狗时间计算公式:

窗口看门狗的超时公式如下:

Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;

其中:

Twwdg:WWDG 超时时间(单位为 ms)

Fpclk1:APB1 的时钟频率(单位为 Khz)

WDGTB:WWDG 的预分频系数

T[5:0]:窗口看门狗的计数器低 6 位

窗口看门狗的配置工作代码:

 1 void WWDG_Init(u8 tr,u8 wr,u32 fprer)
 2 {
 3     RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能
 4     WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.
 5     WWDG_SetPrescaler(fprer); //设置 IWDG 预分频值
 6     WWDG_SetWindowValue(wr); //设置窗口值
 7     WWDG_Enable(WWDG_CNT);
 8     //使能看门狗,设置 counter
 9     WWDG_ClearFlag(); //清除提前唤醒中断标志位
10     WWDG_NVIC_Init(); //初始化窗口看门狗 NVIC
11     WWDG_EnableIT(); //开启窗口看门狗中断
12 }
13 //重设置 WWDG 计数器的值
14 void WWDG_Set_Counter(u8 cnt)
15 {
16     WWDG_Enable(cnt); //使能看门狗,设置 counter .
17 }
18 //窗口看门狗中断服务程序
19 void WWDG_NVIC_Init()
20 {
21     NVIC_InitTypeDef NVIC_InitStructure;
22     NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断
23     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2
24     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2
25     NVIC_Init(&NVIC_InitStructure); //NVIC 初始化
26 }
27 void WWDG_IRQHandler(void)
28 {
29     WWDG_SetCounter(WWDG_CNT);
30     //当禁掉此句后,窗口看门狗将产生复位
31     WWDG_ClearFlag();
32     //清除提前唤醒中断标志位
33     LED1=!LED1;
34     //LED 状态翻转
35 }

主逻辑区代码:

 1 int main(void)
 2 {
 3     delay_init();//延时函数初始化
 4     NVIC_Configuration(); //设置 NVIC 中断分组 2
 5     usart1_init();串口1初始化
 6     LED_Init(); //LED 初始化
 7     KEY_Init(); //按键初始化
 8     LED0=0;
 9     delay_ms(500);
10     WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为 7f,窗口寄存器为 5f,//分频数为 8
11     while(1)
12     {
13         LED0=1;
14     }
15 }

使用区别

再来分析一下独立看门狗(IWDG)和窗体看门狗(WWDG)的区别:

(1)独立看门狗没有中断,窗口看门狗有中断

(2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制

(3)独立看门狗只有下限,窗口看门狗又下限和上限

(4)独立看门狗是12位递减的。窗口看门狗是7位递减的

(5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR

功能不重复说明

功能不重复,独立看门狗用于防止系统死机,而窗口看门狗用于保证系统运行的正确性.
比如一个系统有一个工作线程和一个IDLE线程,系统正常运行时,工作线程运行200ms,暂停100ms.必须严格保证此运行时序.
此时就可以在工作线程中启动一个窗口看门狗,在IDLE线程中清狗.
如果不足200ms就进到了IDLE线程,说明工作线程未能达到工作时间,出现了故障,窗口看门狗复位就被被触发.
如果超过300ms还未进入IDLE线程,说明工作线程未能及时完成,也会触发窗口看门狗.

独立看门狗应用就很简单了,系统必须在计数器归零前喂狗,否则看门狗触发,系统复位.

总之就是,窗口看门狗用于保证已知时序的系统正常运行,独立看门狗保证系统不死机,两个看门狗各有其应用场景,所以不重复.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132326.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#使用WebProxy实现代理访问webservice

    C#使用WebProxy实现代理访问webservice1.问题描述标题写的有点含糊不清,不好意思语言表达能力欠佳。。事情是这样的!事情是这样的,在A服务器上有一个webservice,B计算机和C计算机都可以ping通A服务器,但是C计算机的ip备案了而B计算机的ip没有备案,导致我写的一个小程序放在B计算机上调用A服务器的webservice的时候提示我ip非法。那么该如何让这个小程序能在B计算机上正常使用呢?答案是代理服务器!2.w…

    2022年6月21日
    66
  • format(format c)

    a-antemeridiemandpostmeridiemd-dayofmonth(noleadingzero)dd-dayofmonth(twodigit)o-dayofyear(noleadingzeros)oo-dayofyear(threedigit)D-daynameshortDD-…

    2022年4月10日
    50
  • otn与stn网络_mstp和stn的区别

    otn与stn网络_mstp和stn的区别SDH、MSTP、OTN和PTN的区别和联系看了很多人写的关于SDH、PTN和O…SDH、MSTP、OTN和PTN的区别和联系_信息与通信_工程科技_专业资料。首…SDH与MSTP_信息与通信_工程科技_专业资料。一、判断题(共5道小题,共50.0分)1.以字节交错间插方式构成高阶STM-N(N>1)段开销时,第一个STM-1……MSTP、SDH+ATM、OT…

    2022年10月18日
    2
  • 数据结构知识整理

    数据结构知识整理基于严蔚敏及吴伟民编著的清华大学 C 语言版教材并结合网上相关资料整理 http www docin com p 2027739005 html 第一章 绪论 1 数据结构 是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科 2 数据结构涵盖的内容 3 基本概念和术语 数据 对客观事物的符号表示 在计算机科学中是指所有能输入到计算机中并被计算

    2025年7月3日
    4
  • 深度探索JFR – JFR详细介绍与生产问题定位落地 – 3. 各种Event详细说明与JVM调优策略(3)

    深度探索JFR – JFR详细介绍与生产问题定位落地 – 3. 各种Event详细说明与JVM调优策略(3)本文基于OpenJDK113.虚拟机相关Event3.3.JIT即时编译相关JIT即时编译可能会遇到编译后的代码缓存占满,或者因为空间有限或者代码设计问题,导致某些关键方法需要重编译导致性能问题,以及因为代码块过大导致编译失败从而性能有问题,这些问题我们可以通过JFR中相关的Event进行查询。JFR对于Java开发可以完全替换JVM编译日志。额外讲解:JIT相关的知识首先,这里简单介绍下JIT相关的知识(这里我推荐看O’Rerilly上面的Java.

    2022年4月29日
    41
  • Microsoft Visual Studio 2010 正式版下载[含旗舰版序列号](中、英文版)[通俗易懂]

    Microsoft Visual Studio 2010 正式版下载[含旗舰版序列号](中、英文版)[通俗易懂]前日(2010年4月12日),微软正式发布了MicrosoftVisualStudio2010,相信这是个让众多微软开发者们心情激动的一天吧。至于VS是啥米东东之类的就不再解释

    2022年7月20日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号