STM32之独立看门狗(IWDG)和窗体看门狗(WWDG)

发布者:BlissfulHeart最新更新时间:2016-06-07 来源: eefocus关键字:STM32  独立看门狗  窗体看门狗 手机看文章 扫描二维码
随时随地手机看文章
  之前有很风靡的游戏,名字叫《看门狗》。该游戏用了很新的引擎技术,打造出了一个辽阔庞大的世界,内容是玩家Aiden·Pearce(主角)是一名精通黑客技术的高手,当时的世界是处于所有物品都被置了电子设备控制,整个城市都在依赖着他们,主人公决定利用自己的技术为这个世界惩奸除恶。

    STM32之独立看门狗(IWDG)和窗体看门狗(WWDG)

    这个游戏以极高的自由度、出色的游戏质量与丰富的游戏内容被业界公认为开启次世代游戏的大门之作,该游戏被IGN评为年度最佳射击游戏(下载地址:http://down.ali213.net/pcgame/WatchDogs.html  有机会一定玩玩。)

 

二     开门见山:


 

    下面言归正传,在工作中用的STM32需要使用看门狗技术:

     看门狗通俗解释:

           单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。

 

 

三   庐山面目:


 

    STM32芯片一共有两个看门狗,一个是独立看门狗(IWDG),另一个是窗体看门狗(WWDG)

    ①先来讲讲独立看门狗:

               STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然
          有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是
          在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看
          门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

      独立看门狗的配置工作代码:   

 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 重装载值
 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 复位。这表明递减计数器需要在一个有限的时间窗口中被刷
新。

 

看门狗时间计算公式:

窗口看门狗的超时公式如下:
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 }    

 

功能:

通过 LED0(DS0)来指示是否正在初始化。而 LED1(DS1)用来指示是否发生了中
断。我们先让 LED0 亮 300ms,然后关闭以用于判断是否有复位发生了。在初始化 WWDG 之
后,我们回到死循环,关闭 LED1,并等待看门狗中断的触发/复位。

 四   泛泛而谈:


 

再来分析一下独立看门狗(IWDG)和窗体看门狗(WWDG)的区别:

 

(1)独立看门狗没有中断,窗口看门狗有中断
 
(2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制
 
(3)独立看门狗只有下限,窗口看门狗又下限和上限
 
(4)独立看门狗是12位递减的。窗口看门狗是7位递减的
 
(5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR
 
 
  End!
关键字:STM32  独立看门狗  窗体看门狗 引用地址:STM32之独立看门狗(IWDG)和窗体看门狗(WWDG)

上一篇:stm32 USART 串口通信操作寄存器+库函数
下一篇:STM32F10x 学习笔记7独立看门狗IWDG 模块

推荐阅读最新更新时间:2024-03-16 14:56

STM32移植U8g2图形库的方法 实现OLED图形显示
之前的文章,介绍过ESP8266在Arduino IDE环境中使用U8g2库,实现OLED上的各种图形显示。 本篇,介绍一下U8g2库如何移植到STM32上,进行OLED的图形显示。 本次的实验硬件为: STM32:型号为最常见的STM32F103C8T6 OLED:0.96寸OLED,IIC接口(如果是SPI接口,文中也有对应的修改介绍) 1 U8g2简介 U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD,并支持如SSD1306等多种类型的OLED驱动。 U8g2源码的开源库地址:https://github.com/olikraus/u8g2 2 移植步骤 首先下载U8g
[单片机]
<font color='red'>STM32</font>移植U8g2图形库的方法 实现OLED图形显示
STM32看门狗的使用
为什么使用看门狗 事情很简单先前做的一款采集数据的产品不知道为何异常,陷入死循环然后“死机”,分析了很多次,没发现原因,但是每次重新上点后就能正常采集到数据。后来找到了解决方法:看门狗!目的是当程序走入死循环或者硬件异常时,可以自动复位,这样就可以得到跟重新上电后差不多的效果了。 使用的平台:stm32f103系列单片机 使用的烧写调试模式:Jlink SWD 模式。 使用STM32官方模板库。 ST系列单片机看门狗分为两种: 1.独立看门狗,2.窗口看门狗。 独立看门狗: 可参看RM(reference Manual)的Independent watchdog (IWDG) 当然,只是简要查看
[单片机]
<font color='red'>STM32</font><font color='red'>看门狗</font>的使用
stm32固件库中GPIO的工作模式
固件库中GPIO的工作模式 总结一下可分为三种工作模式 输入模式、输出模式、复用模式 1、输入模式 1.1上拉输入:默认电平上拉 1.2下拉输入:默认电平下拉 1.3浮空输入:电平不确定完全由外部输入决定,多用于按键开关 1.4模拟输入:用于ADC采集(模数转换Analog-to-digital conversion) 在输入模式的时候,输出模式是被禁止的 2、输出模式 2.1推挽模式:双mos管轮流工作通过GPIOx_ODR可控制I/O输出高低电平 2.2开漏输出:只有N-MOS管工作PMOS管保持关闭,GPIOx_ODR可控制I/O输出高电平(N-MOS导通)和高阻态(N-MOS不导通);一般只用于IIC ,SMB
[单片机]
<font color='red'>stm32</font>固件库中GPIO的工作模式
stm32定时器的ETR、CH1N、CH2N、CH3N
一、CH1N、CH2N、CH3N是高级定时器才有的引脚,是CH1、CH2、CH3的互补引脚,用来做三相电机控制的。 二、ETR 首先定时器的时钟来源有4种: 1、内部时钟(CK_INT) 2、外部时钟模式1:外部输入引脚 3、外部时钟模式2:外部触发输入ETR 4、内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 其中的第3种就是ETR,即把外部信号接到ETR引脚上,当ETR引脚上有上升沿或下降沿,就会触发定时器计数。 使用步骤: 1、TIMx_SMCR寄存器中的ETF 用来设置滤波器。 2、TI
[单片机]
<font color='red'>stm32</font>定时器的ETR、CH1N、CH2N、CH3N
基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函数
经本人刻苦钻研,将51单片机上用的矩阵键盘扫描程序移植到了stm32上,同时也做了很大的改进,最大的改进莫过于消抖这块了。以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序被搁置,显然,程序的实时性大打折扣,今天便在此让新手们别delay,从此走进一个崭新的扫描消抖世界!(本人也是新手——爱钻研的新手哈!^_^) //stm32矩阵键盘翻转扫描法(PB口的低8位) //将此矩阵键盘扫描程序放在定时器中断服务程序里 //每10ms进入一次中断服务程序 s8 scan_MatrixKey(void) { #define PORT GPIOB- IDR u8 colum
[单片机]
STM32FSMC机制FlaSh存储器扩展
  STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。   STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优势,可根据
[单片机]
STM32FSMC机制FlaSh存储器扩展
IAR stm32 printf重定向设置
在MDK中重定向的问题,各种教程。其实在IAR中是相似的,我是从野火的教程中复制的代码。 (1)在IAR中需要添加一个宏(_DLIB_FILE_DESCRIPTOR)。 (2)在USART1.c(根据自己的情况)文件中对fputc函数进行重定义就可以。 解释:这个宏是哪里来的?为什么要是重定义fputc()而不是别的函数? 在stdio.h文件中可以找到答案。
[单片机]
IAR <font color='red'>stm32</font> printf重定向设置
STM32 FSMC操作SRAM的步骤简析
本次操作的SRAM的型号是IS62WV51216,是高速,8M位静态SRAM。它采用ISSI(Intergrated Silicon Solution, Inc)公司的高性能CMOS技术,按照512K个字(16)位进行组织存储单元。其具有高性能、低功耗特点。为方便用户扩展SRAM的存储空间,为用户有提供了两个片选引脚;此外,含有两个字节控制信号UB和LB,可方便用户按字节访问SRAM或按字访问SRAM。IS62WV51216具有45ns/55ns访问速度,因为是全静态操作,因此无需外部时钟和刷新要求。 IS62WV51216功能框图 IS62WV51216有地址译码器、数据IO、控制逻辑和存储阵列四部分构成。地址译码器将1
[单片机]
<font color='red'>STM32</font> FSMC操作SRAM的步骤简析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved