历史上的今天
今天是:2025年01月15日(星期三)
2020年01月15日 | STM32看门狗研究
2020-01-15 来源:eefocus
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 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线程,说明工作线程未能及时完成,也会触发窗口看门狗.
独立看门狗应用就很简单了,系统必须在计数器归零前喂狗,否则看门狗触发,系统复位.
总之就是,窗口看门狗用于保证已知时序的系统正常运行,独立看门狗保证系统不死机,两个看门狗各有其应用场景,所以不重复.
史海拾趣
|
急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...… 查看全部问答> |
|
目 录 第一篇 低压开关柜二次线路的设计安装、 运行维护总论 ( ) ………………… 第一章 配电网络和配电设备概述 ( ) ………………………………………………… 第二章 配电变压器的设计安装、 运行维护 ( ) …………………………………… ...… 查看全部问答> |
|
我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊… 查看全部问答> |
|
就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS, 但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...… 查看全部问答> |
|
所在公司的一个项目,比较类似于手持gps。 大致上硬件环境就是FPGA的开发板,Altera的2c系列,采用nios的软核cpu。 开发环境就是NIOSII 6.1,c语言。 具体要实现的具体功能已经部分有一些代码,测试功能用。 现在想加操作系统,需要高手帮忙。 ...… 查看全部问答> |
|
内容摘要: 结合红外防盗报警和ZigBee技术这两大热点课题,利用TI公司的单芯片CC2430和RE200B红外传感器,完成了基于ZigBee技术无线红外防盗报警系统的硬件设计和软件开发,解决了现有无线报警系统存在的误报警,成本高等问题。经过对系统的硬件软件电 ...… 查看全部问答> |




