1)独立看门狗没有中断,窗口看门狗有中断
2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制
3)独立看门狗只有下限,窗口看门狗又下限和上限
4)独立看门狗是12位递减的。窗口看门狗是7位递减的
5)独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR
1.看门狗介绍
看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。使用看门狗保证系统正常地运行是非常有必要的。我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。
2 IWDG的特点以及使用
IWDG是一个独立看门狗,具有独立于系统的时钟,与片外看门狗更为相似,使用片内独立的阻容时钟发生电路计时,记录时间为=(时钟频率(40KHz)/ 分频数)*IWDG_SetReload(t),t<0xFFF.也就是说记录的最大设定的复位时间为 (1/40K)*256*0xFFF = 26.2 S。由于IWDG使用的时钟本身不准确,会因为漂移产生一定变化,喂狗时应该给出一定的裕量。另外,这个时钟与系统时钟并无关联,所有也不能与系统进行同步产生中断,一旦定时时间到后就会产生复位信号,系统来不及存储当前运行状态就会重启,可以在要求不高的场合使用。
3. WWDG的特点以及使用
时间为(1/PCLK1)* 4096) * 分频系数(最大为8)*(0x7F – 0x3F)= 58ms.其复位的条件是:
(1)当计数器的数值从0x40减到0x3F
(2)当刷新看门狗时计数器的数值大于窗口上限值时
满足任何一条都可以产生复位信号。通常情况下设置窗口上限值为0x7F,下限值默认为0x40,计数器向下数到0x40就会产生中断,下个910us后变为0x3F就会复位系统。
仔细想想可以发现三个问题。
第一、我们可以发现即使设定了最大值,WWDG最大计时仅仅有58ms,我们在比较大的程序中也没必要运行一小段就添加一个喂狗程序,想使其定时5S或10S的时间再复位系统应该怎样处理呢?
通过实验我找到一种方法,就是在中断函数中再做一个额外计数器,如果计数器没有达到设定值,就重新加载喂狗定时器初值,同时使设定值加1,当计数器达到设定值时,就不加载喂狗定时器初值,这时看门狗定时器就会从从0x40减到0x3F产生系统复位。使用这个方法可以将定时时间拓展到 58ms*额外计数器设定值,定个几十秒都不是问题。
第二,当额外计数器达到设定值时,此时说明程序没有及时复位这个额外计数器,软件或硬件发生了错误,将时系统复位,我们需要存储一些运行过程中的变量,仅仅有不到1ms的时间(从0x40减到0x3F最长大概为910us)怎么够用呢?
这样就先写Wwdg_Feed(0x7F)重新加定时器初值,再对我们的存储函数进行改造,多添加一些Wwdg_Feed(0x7F)函数,使其不至于再减到0x40,存储工作都做好之后,不再喂狗,那么再次发生中断后不再喂狗就会复位系统了。
第三,如果发生复位,如何区分是上电复位还是看门狗复位呢?
在初始化WWDG时候,有一个RCC_GetFlagStatus(RCC_FLAG_WWDGRST)可以用于判断是否发生看门狗复位,如果是重新上电引起的复位这个值当然是系统默认值,如果是看门狗复位的话这个值就会发生变化,这样就可以针对这两种不同状态进行状态恢复。
关键字:stm32 独立看门狗 窗口看门狗
引用地址:
stm32 独立看门狗和窗口看门狗区别
推荐阅读最新更新时间:2024-03-16 16:02
STM32关于优先级设定的理解 NVIC_SetPriority()
Systick模块初始化配置函数(Systick_config)中设定模块中断优先级的函数为: NVIC_SetPriority((SysTick_IRQn, (1 __NVIC_PRIO_BITS) - 1); 参数SysTick_IRQn为systick基址,这个没什么好说的 关键在参数 (1 __NVIC_PRIO_BITS) - 1);这个参数即占先优先级值,其中—NVIC_PRIO_BITS是stm32.h中的宏定义,库函数默认为4,表示用4位表示占先优先级,因为m3内核只有4位用来表示占先优先级和响应优先级,那么响应优先级就剩下0位了,也就是没有响应优先级之分, 按照上式计算若NVIC_PRIO_BIT
[单片机]
STM32 SPI时钟问题
STM32中有SPI1/2/3,关于SPI的时钟问题,要具体看是SPI1还是SPI2/3。SPI1时钟由APB2时钟分频而来,而SPI2/3时钟由APB2时钟分频而来。 APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M,详参时钟树。 SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/3
[单片机]
献给新手们——学习STM32的建议
S3C2440,官方的文档都是英文的,大部分工程师只能去看国内出版的书籍。英文好的同学,请不要以为你很牛,可以只看英文文档。毕竟你是中国人,你最熟悉的,理解最好的还是中文。看英文的速度还是比看中文慢一些,我们要的是最短的时间,而不是追求短时间内记住所有细节。当然,如果是一篇论文,建议看英文原版还是有好处的。 STM32处理器进入国内市场时候,ST官方(或者第三方)的推广工作做的非常好。翻译了大量的英文文档,迎合了国内的很多工程师的思维。所以现在大部分STM32F103xxx的用户datasheet都有中文版。因此可以不用去购买书籍,看电子档即可。当然,有雄厚经济条件的朋友可以购买本书籍哈~ 学习的时候,关注两个比较重要
[单片机]
STM32的LCD12864液晶显示源程序
单片机源程序如下: #include config.h int main(void) { // int i=0,j=0; // int count=0; Stm32_Clock_Init(9);//系统时钟设置 delay_init(72); //延时初始化 //LED_Init(); //初始化与LED连接的硬件接口 Init_12864(); //初始化带字库12864液晶 // Display_string(0,0, 单片机综合设计 ); //显示第1行 // Display_st
[单片机]
基于STM32移植UCGUI图形界面框架(3.9.0源码版本)
一、环境介绍 keil: 5.25 MCU: STM32F103ZET6 UCGUI版本: 3.90(纯源码版本) 3.9.0是源码版本,可以看到全部源码,也方便学习;后续的版本都是提供lib库文件,不再提供源码了。 基于STM32的STemwin移植教程可以看这里: https://blog.csdn.net/xiaolong1126626497/article/details/117933355 https://blog.csdn.net/xiaolong1126626497/article/details/117933355 本篇文章使用的UCGUI资料包下载: UCGUI图形界面库完整资料包(附带S
[单片机]
STM32开发笔记72: 使用命名空间解决类名冲突问题
单片机型号:STM32L053R8T6 在程序设计中,使用了两个类,这两个类都有引脚定义并同名,程序如下: #ifndef E32_400T20S_H_ #define E32_400T20S_H_ #include io.h #include mini_uart.h #ifdef __cplusplus extern C { class CM0:public CIO_Output { public: CM0(void); }; class CM1:public CIO_Output { public: CM1(void); }; class CE32_400t20s:public CMiniUA
[单片机]
STM32笔记——外部中断的配置
一、选择对应芯片 常规操作,这里我们选择F407ZGT6 二、配置sys 选择Serial Wire 三、配置RCC 选择高速外部时钟晶振,系统自动配置相应引脚。 四、配置外部中断引脚 通过查看开发板原理图,找出按键对应引脚 五、设置外部中断引脚 1、上升沿触发(外部中断触发引脚上的电平从低电平跳转到高电平) 2、下降沿触发(外部中断触发引脚上的电平从高电平跳转到低电平) 3、上下边沿均触发 (外部中断触发引脚上有电平变化) 六、开启外部中断 七、配置中断优先级 八、配置时钟 九、生成工程 HAL库GPIO函数库讲解 1、外部中断服务函数 void HAL_GPIO_EXTI_IRQ
[单片机]
STM32单片机对TFTLCD的驱动设计
看了TFTLCD和FSMC(灵活的静态存储控制器)的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D[15: 0]: 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: intmain(void) { u8x=0; u8lcd_id[12];//存放LCDID字符串
[单片机]