当前位置:网站首页>STM32看门狗研究
STM32看门狗研究
2022-06-29 10:43:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
本文是通过网上收集到的资料汇总而成,感谢各大牛人的铺路。
萌狗的定义
单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 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.cn/132326.html原文链接:https://javaforall.cn
边栏推荐
- 软件工程导论——第五章——总体设计
- Micro blog comment architecture design
- 在日本的 IT 公司工作是怎样一番体验?
- When a technician becomes a CEO, what "bugs" should be modified?
- Follow Me Study HCIE-Big Data-Data Mining 第一章 数据挖掘介绍 模块一
- 什么?漫画居然能免费看全本了,这还不学起来一起做省钱小能手
- Object 类——万类之父
- 【每日3题(1)】判断国际象棋棋盘中一个格子的颜色
- The necessary operation for those big guys to fly 666 inadvertently at the bash command line terminal
- Qt学习01 GUI程序原理分析
猜你喜欢

安全 创新 实践|海泰方圆受邀参加“数字时代的网信创新与价值共创”技术交流研讨会

When a technician becomes a CEO, what "bugs" should be modified?

Live broadcast by technical experts from China Kuwait Fangde: how to build a private cloud platform based on openstack and CEPH| Issue 27

【每日3题(1)】判断国际象棋棋盘中一个格子的颜色

Qt学习01 GUI程序原理分析

Pipeline aggregations pipeline aggregations - parent-2

行业分析| 快对讲,楼宇对讲

适合小白的树莓派opencv4.0安装

(JS) filter out keys with value greater than 2 in the object

Qt学习05 Qt Creator工程介绍
随机推荐
QT learning 16 parent-child relationships between QT objects
Qt学习16 Qt 对象间的父子关系
Evaluation of IP location query interface Ⅱ
Go 单元测试入门实践
毕业季·进击的技术er - 职场打工人
(JS) catch errors (exceptions)
Take another picture of cloud redis' improvement path
The Chinese Computational Linguistics Conference and the national knowledge atlas and Semantic Computing Conference are in full swing
Qt学习05 Qt Creator工程介绍
(JS) responsibility chain mode
Online sql to htmltable tool
巴比特 | 元宇宙每日必读:HTC 宣布推出首款元宇宙手机,售价约2700元人民币,都有哪些新玩法?...
After 22 years in office, the father of PowerShell will leave Microsoft: he was demoted by Microsoft for developing PowerShell
Qt学习15 用户界面与业务逻辑的分离
【高并发】2.8万字的Callable和Future面试知识点总结,看完我直接面进了字节跳动,原谅我有点飘了(中)
Safety innovation practice | Haitai Fangyuan was invited to participate in the technical exchange Seminar on "network information innovation and value co creation in the digital age"
稳定币风险状况:USDT 和 USDC 安全吗?
分布式缓存之Memcached
Xuetong denies that the theft of QQ number is related to it: it has been reported; IPhone 14 is ready for mass production: four models are launched simultaneously; Simple and elegant software has long
Course design for the end of the semester: product sales management system based on SSM