STM32看门狗研究

2020-01-15来源: eefocus关键字: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线程,说明工作线程未能及时完成,也会触发窗口看门狗.


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


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

关键字:STM32  看门狗 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485734.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F407IG临时堆栈划分
下一篇:STM32 keil4 extern问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

开发STM32MP1,没有一块好的开发办怎么行
STM32MP1系列的出现吸引了很多STM32的新老用户的关注,但是很多的人都会担心一个问题:以前是基于Cortex M系列MCU惊醒开发,对于cortex-A架构的处理器以及Linux系统都不熟悉。如何高效地从MCU跨越到MPU是大家都关心的话题。 作为ST官方合作伙伴,米尔电子推出了开发套件MYD-YA157C,该套件由核心板MYC-YA157C和底板MYB-YA157C组成。该平台采用STM32MP157系列高性能处理器,提供了高性能显示,千兆以太网,WIFI/蓝牙,RS232/RS485/CAN等丰富接口。贴合应用场景的产品定义,稳定可靠的硬件设计,丰富的软件和学习资源,能帮助大家轻松实现跨越,是一块值得推荐
发表于 2020-01-09
开发STM32MP1,没有一块好的开发办怎么行
stm8s输入捕获
输入捕获,简而言之,即 记录信号到来时刻的CNTR的值,然后把该值传给CCR。下面以PC1为例,代码如下:    TIM1_CR1_DIR = 0;//计数器向上计数    TIM1_IER_UIE = 1;//使能TIM1溢出中断      TIM1_PSCRH = 0x00;    TIM1_PSCRL = 0x05; //配置TIM1为6分频->0.75us记一次数     TIM1_ARRH = 0xFF;     TIM1_ARRL = 0xFF; //自动重
发表于 2020-01-09
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ、写在前面上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程。上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。实例实验效果:1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来实验说明:1.多字节读写实验为什么是从66地址写? 为什么是写入129字节?答案:验证对EEPROM多字节
发表于 2020-01-09
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
STM32系统学习——I2C (读写EEPROM)
I2C 通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层
发表于 2020-01-09
STM32系统学习——I2C (读写EEPROM)
STM8的IAP在线升级
IAP(In Application Program)在线应用编程官方资料(STVD开发环境):例程AN2659,《 AN2659 Application Note.pdf 》要实现在线升级,MCU代码须分为 : bootloader和 用户代码App 两个部分。图1.STM8下IAP程序的存储方式用户启动区域(UBC): (可理解为用户自定义的bootloader的存放区域)包含有复位和中断向量表,它可用于存储IAP及通讯程序。UBC有一个两级保护结构可保护用户代码及数据在IAP编程中免于无意的擦除或修改。这意味着该区域总是写保护的,而且写保护不能通过使用MASS密钥来解锁。它的大小可通过配置option bytes 设置
发表于 2020-01-09
STM8的IAP在线升级
STM8做BUS OFF快慢恢复策略
前言:CAN总线上出现错误会导致CAN控制器进入BUS OFF状态,具体的可以参考CAN的规范。CAN控制器提供自动恢复和手动恢复功能。1.自动恢复自动恢复比较简单,初始化的时候打开自动恢复功能。要求不高的话建议打开,否则CAN BUS OFF一直无法恢复通信。CAN->MCR |= CAN_MasterCtrl_AutoBusOffManagement;/*atuo bus off recovery */2.手动恢复一般车厂要求ECU不能自动恢复,而是先快恢复后慢恢复。常用的就是:先100ms恢复5次,然后是1000ms恢复一次。具体的就是:(1)发生BUS OFF后,立即关闭TX,然后重置CAN控制器(2)快恢复次数+1(
发表于 2020-01-09
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved