历史上的今天
返回首页

历史上的今天

今天是: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线程,说明工作线程未能及时完成,也会触发窗口看门狗.


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


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

推荐阅读

史海拾趣

天二科技(EVER OHMS)公司的发展小趣事

面对不断变化的市场需求和技术挑战,天二科技始终坚持持续创新和客户至上的经营理念。公司与客户保持紧密合作,深入了解客户的需求和反馈,不断推出符合市场需求的新产品和解决方案。同时,天二科技还注重培养员工的创新意识和能力,鼓励员工积极参与技术创新和研发工作。这种持续创新和客户至上的经营理念使得天二科技在电子行业中始终保持领先地位。

东软载波(EastSoft)公司的发展小趣事

东软载波公司成立于1993年,自成立之初就专注于电力载波通信技术的研发。公司在1996年开始了电力线载波通信技术的深入研究,经过数年的努力,终于在2000年推出了第一代电力线载波通信芯片。这一成果标志着东软载波在电力载波通信领域取得了重要突破,为其后续发展奠定了坚实的基础。

扬州国芯(Gcore)公司的发展小趣事

近年来,东软载波积极响应国家“一带一路”倡议,重点聚焦沿线国家的低压配用电网、能源互联网建设需求。公司依托成熟的电力物联网通信技术储备及经验,参与多个国家的智能电表项目,推动电网智能化改造。这些项目的成功实施不仅促进了当地电力基础设施的升级换代,也为东软载波在国际市场上树立了良好的口碑。

CT Micro公司的发展小趣事
  1. 创业初期与技术创新

CT Micro公司最初由几位电子工程领域的专家创立,他们看到了微型计算机断层扫描(Micro-CT)技术在电子行业中的巨大潜力。初期,公司面临着资金短缺和技术难题,但他们通过不断研发和创新,成功开发出了一款具有高性价比的Micro-CT设备,迅速获得了市场的认可。

  1. 市场拓展与合作伙伴关系

随着产品的成熟,CT Micro开始积极寻求市场拓展。他们与多家电子制造企业建立了合作关系,为这些企业提供Micro-CT设备的定制服务。通过与这些企业的合作,CT Micro不仅扩大了市场份额,还进一步提升了产品的技术水平和应用范围。

  1. 研发升级与产品迭代

面对日益激烈的市场竞争,CT Micro不断投入研发力量,对Micro-CT设备进行升级和迭代。他们成功推出了多款新型设备,具有更高的分辨率、更快的扫描速度和更低的辐射剂量。这些新产品的推出,进一步巩固了CT Micro在电子行业中的领先地位。

  1. 国际化战略与市场拓展

随着国内市场的饱和,CT Micro开始实施国际化战略。他们积极参与国际展览和研讨会,展示自己的产品和技术实力。同时,他们还在海外设立了销售和服务中心,为国际客户提供更加便捷的服务。通过这些努力,CT Micro成功打开了国际市场的大门。

  1. 社会责任与可持续发展

在快速发展的同时,CT Micro也积极履行社会责任。他们注重环保和可持续发展,采用环保材料和节能技术生产产品。此外,他们还积极参与公益事业,为贫困地区的教育和医疗事业贡献力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

请注意,这些故事框架是虚构的,并不代表CT Micro公司的实际发展情况。如果您需要了解CT Micro公司或类似公司的真实故事,建议您查阅相关公司的官方网站、新闻报道或行业分析报告。

艾为(AWINIC)公司的发展小趣事

2015年7月,艾为电子成功挂牌新三板,迈入了资本市场的新征程。上市以来,艾为电子充分利用资本市场的优势,加快了技术研发和市场拓展的步伐。同时,公司还积极寻求与国内外优秀企业的合作机会,通过引入战略投资者和开展资本运作,为公司的未来发展注入了新的动力。

这五个故事从不同角度展现了艾为电子在电子行业中的发展历程和成就,体现了公司不断追求卓越、创新发展的精神风貌。随着科技的不断进步和市场的不断变化,相信艾为电子将继续保持其竞争优势,为电子行业的发展贡献更多力量。

GWP Group公司的发展小趣事

艾为电子注重与产业链上下游企业的合作,通过协同创新和资源共享,实现共赢发展。例如,艾为与歌尔股份建立了长期合作伙伴关系,双方在声光电射手等领域展开了深度合作,共同推出了多款优秀产品。此外,艾为还与多家ODM厂商和智能硬件企业建立了紧密的合作关系,共同推动产业链的协同发展。

问答坊 | AI 解惑

急需!!! 汽车电子方案!!!

急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...…

查看全部问答>

【藏书阁】最新低压开关柜二次线路设计安装准实务全书

目 录 第一篇 低压开关柜二次线路的设计安装、 运行维护总论 ( ) ………………… 第一章 配电网络和配电设备概述 ( ) ………………………………………………… 第二章 配电变压器的设计安装、 运行维护 ( ) …………………………………… ...…

查看全部问答>

TI关于DC-DC电源芯片有哪些呀

TI关于DC-DC电源芯片有哪些呀 还能提供一些完整的资料吗    集思广益 谢谢大家…

查看全部问答>

问大家关于串口通讯的问题

我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊…

查看全部问答>

急,coredll.dll 这个文件无法找到。。。

请问各位 coredll.dll 这个文件是发在哪个里面,搜遍了整个硬盘也无法找到。。。 急啊。…

查看全部问答>

就我个人经历,大家在无线选型上常会有的一些误区:

就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS,    但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...…

查看全部问答>

急需熟悉uCOS的高手,有报酬

所在公司的一个项目,比较类似于手持gps。 大致上硬件环境就是FPGA的开发板,Altera的2c系列,采用nios的软核cpu。 开发环境就是NIOSII 6.1,c语言。 具体要实现的具体功能已经部分有一些代码,测试功能用。 现在想加操作系统,需要高手帮忙。 ...…

查看全部问答>

请教电子锁问题

想用51做一个电子锁,但是不知道怎么做。希望各位大虾给些思路,最好附上电路图什么的。。…

查看全部问答>

请教144脚FSMC的问题

我现在要接2片8位的SRAM,没有其他用外总线的器件,请问我现在的接法对不对 CPU                  SRAM1 D0-D7              ...…

查看全部问答>

【论文】基于zigbee的无线红外防盗报警系统设计

内容摘要: 结合红外防盗报警和ZigBee技术这两大热点课题,利用TI公司的单芯片CC2430和RE200B红外传感器,完成了基于ZigBee技术无线红外防盗报警系统的硬件设计和软件开发,解决了现有无线报警系统存在的误报警,成本高等问题。经过对系统的硬件软件电 ...…

查看全部问答>