stm32 窗口看门狗学习(一)
什么是窗口看门狗?
1)独立看门狗
限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
2)窗口看门狗
之所以称为窗口就是因为其喂狗时间是一个“窗口”,不能过早也不能过晚。
STM32F10x 的窗口看门狗中有一个7位的递减计数器,出现下述2种情况之一时产生看门狗复位:
1)当计数器的数值从0x40减到0x3F时 ,这里的0x3F可以看成是窗口的下限;
2)喂狗的时候,如果计数器的值大于某一设定数值(这个数值是窗口的上限),此数值在WWDG_CFR寄存器中配置。
对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗。但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或者说跑乱的程序正好执行了刷新看门狗操作,这样的情况一般的看门狗不好检测;
如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行的情况。
如果非要说窗口看门狗的具体应用,我一时也说不上来,因为没有用过。但是这不妨碍我们做实验学习窗口看门狗。
先看一幅图,直观地认识窗口看门狗。
T[6:0]是一个7位的递减计数器,我们刷新看门狗,就是重载这个计数器;W[6:0]是提前配置好的一个数值,作为窗口的上限;0x3F是窗口的下限,是固定值,程序无法修改。
假如设置T[6:0]的重载值是0x7F, W[6:0]为0x5F, 那么计数器从0x7F递减到0x5F的过程中(也就是T[6:0]大于W[6:0]的时候),是不能喂狗的。如果喂狗就会复位。
当T[6:0]从W[6:0]递减到0x3F的过程中,需要喂狗,不然计数器等于0x3F的时候就会复位。
时间怎么计算?
根据手册,计数器的计数周期 = T_PCLK1 * 2^WDGTB * 4096,
这里WDGTB是预分频系数,取值范围是(0,1,2,3)
假设我们实验中PCLK1的频率是36MHz,WDGTB取3,那么计数器的计数周期
T = (1/(36M))* 8 * 4096(s)= 910.222 us
我们设计一下实验一。
1.实验中PCLK1的频率是36MHz,WDGTB取3;
2.T[6:0]设置为0x7F,W[6:0]设置为0x41; 那么刷新窗口就是(0x41~0x3F), 在(0x7F~0x41)是不允许刷新的;
不允许刷新的时间 = (0x7F - 0x41) * 910.222 us = 56.43 ms
3.我们在在(0x7F~0x41)这段时间刷新,看看是不是复位(预期结果是一定复位)。
<span style="font-size:18px;"><span style="font-size:18px;">//初始化窗口看门狗
//tr :T[6:0],计数器初始值
//wr :W[6:0],窗口上限
//fprer:预分频系数,WDGTB[1:0]
//计数器的计数频率 F_wwdg = PCLK1/(4096*2^fprer). void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能 WWDG_SetPrescaler(fprer);//设置预分频系数 WWDG_SetWindowValue(wr);//设置窗口上限 WWDG_Enable(tr); //设置计数器初值并且使能看门狗 } </span></span>
喂狗的函数是:
<span style="font-size:18px;"><span style="font-size:18px;">void WWDG_SetCounter(uint8_t Counter)</span></span>
看看main函数。
<span style="font-size:18px;">int main(void)
{
delay_init();
uart_init(9600);
LED_Init(); printf("Hello World ! \r\n");
delay_ms(970); WWDG_Init(0x7F,0x41,3);//窗口看门狗初始化
delay_ms(30); //必须小于56.43ms WWDG_SetCounter(0x7F); //喂狗,应该产生复位 while(1)
{
LED0 = !LED0;
delay_ms(300);
} }</span>
看看实验结果。
确实1s左右会重启一次。
如果我们不喂狗,把那行语句注释调
<span style="font-size:18px;">//WWDG_SetCounter(0x7F); //喂狗,应该产生复位</span>
结果是也会复位,但是LED没有闪烁,为什么呢?估计是还没有执行到操作LED的语句的时候就复位了。
<span style="font-size:18px;">//delay_ms(30); </span>
把这句也注释了,就可以看到灯的闪烁。
实验二
1.实验中PCLK1的频率是36MHz,WDGTB取3;
2.T[6:0]设置为0x7F,W[6:0]设置为0x7E; 那么刷新窗口就是(0x7E~0x3F), 在(0x7F~0x7E)是不允许刷新的;
不允许刷新的时间 = (0x7F - 0x7E) * 910.222 us = 0.91 ms
3.我们在在(0x7E~0x3F),这段时间刷新,看看是不是复位(预期结果是不复位)。
<span style="font-size:18px;">int main(void)
{
delay_init(); uart_init(9600);
LED_Init();
delay_ms(200);
LED0=0; //led on
printf("Hello World ! \r\n");
delay_ms(200);
LED0= 1; //led off WWDG_Init(0x7F,0x7E,3); while(1)
{ delay_ms(1);
WWDG_SetCounter(0x7F); //喂狗
} }
</span>
实验结果是不复位,灯不闪烁,串口也不打印。
如果把喂狗的语句注释调,就会看到灯一直在闪烁,串口一直打印,说明一直复位。
上面的代码,喂狗的时间不好掌握,很容易错过窗口。参考网上的例子,有一种查询的方法喂狗。
while(1)
{
if((WWDG->CR & 0x7F) == 0x55)
WWDG_SetCounter(0x7F);
}
今天就说到这里,下次接着玩。
stm32 窗口看门狗学习(一)的更多相关文章
- stm32 窗口看门狗学习(二)
窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...
- STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料: ...
- stm32 独立看门狗学习
STM32F10xxx内置两个看门狗,提供了更高的安全性.时间的精确性和使用的灵活性.两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障. 独立看门狗(IWDG)由专用的低速 ...
- stm32 窗口看门狗 WWDG
窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变 窗口看门狗(WW ...
- STM32窗口看门狗WWDG库函数的一点思考
WWDG当前计数器的值以及激活位和WWDG_CR这个寄存器相关.如下图所示: 而STM32f10x的库函数提供了两种设置WWDG_CR[0:6]位的方式. WWDG_SetCounter方法 #def ...
- MM32看门狗学习(兼容STM32)
MM32看门狗学习(兼容STM32) IWDG独立看门狗 思维导图 IWDG框图与理解 1.独立看门狗分为两个部分,配置寄存器在1.8V供电区,计数器的核心部分在VDD供电区(即使停机/待机模式计数器 ...
- STM32之看门狗(独立与窗口)
广大的互联网网友们,大家早上中午晚上好,我是某某某..对于狗..看过<忠犬八公>的我.无不深深的被狗的义气与灵气所震撼..我也觉得在所有mcu中用看门狗来形容让系统复位的功能是很恰当的.也 ...
- STM32之独立看门狗与窗口看门狗总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
随机推荐
- Java50道经典习题-程序36 移动位置
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 分析:比如有4个数n=4; 1 2 3 4 各个数向后移动2位m=2,变为 1 2 3 4 将最后m个数,即将最后2个数 ...
- http respose status code (记)
1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. · 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.( ...
- docker网络模式----入门docker的难点
众所周知,现在docker是轻量级虚拟化的典型代表!这段时间想要建立一个分布式系统,但是手头上主机没那么多,所以使用docker进行虚拟化,但是在使用的过程中对网络这一部分是一直不太理解,特别找了一篇 ...
- C# 顺序表---增删改查--逆至--删除最小值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- layui下select下拉框不显示或没有效果
Layui会对select.checkbox.radio等原始元素隐藏,从而进行美化修饰处理.但这需要依赖于form组件,所以你必须加载 form,并且执行一个实例.值得注意的是:导航的Hover效果 ...
- c# 大文件分割 复制 Filestream 进度条
大文件分割复制,每次复制100M 也可以复制别的较大数值. 小于1G的小文件就直接复制得了.代码里没写 ,但是很简单 直接写进去就好了,难得是分割复制 所以没写. 好吧 我还是改了 改成小文件也可以复 ...
- jquery - min.js /jquery-1.8.3.min.js引入后报错
解决方法:在“jquery-1.8.3.min.js”文件上,点击鼠标右键,在弹出菜单中选择“myeclipse”->"exclude From Validation",错误 ...
- new types may not be defined in a return type(c++语言编译错误,处理)
在写程序的时候,定义类时要在大括号后面加上: class Point{ public: Point(int a,int b); Point(const Point &p); int getx( ...
- jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)
题面 题解 调了好几个小时啊--话说我考试的时候脑子里到底在想啥-- 首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\) 那么就可以把数列分成三份,\(L+S+R\),其中\ ...
- 解决maven项目中有小红叉的问题
首先在window--perferences--showview中显示problems中查看出错的原因