第十二章 STM32单片机看门狗编程及其应用
- 格式:pdf
- 大小:286.57 KB
- 文档页数:23
STM32F103V IWDG 独立看门狗操作最近编写一个程序,因为需要考虑到可靠性,所以需要在程序了添加看门狗功能。
查了下STM32 的相关资料,于是利用下库文件来实现IWDG 独立看门狗操作。
首先需要调用库文件#include “stm32f10x_iwdg.h”再配置下看门狗相关参数//////////独立看门狗IWDG 设置////////////////////////////////////void WatchDog_int(void)// 独立看门狗IWDG 设置{/* Enable write access to IWDG_PR and IWDG_RLR registers */ IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* IWDG counter clock: 32KHz(LSI) / 32 = 1KHz */ IWDG_SetPrescaler(IWDG_Prescaler_32); //独立看门狗预分频为32 /* Set counter reload value to 1000 */ IWDG_SetReload(1000);//设置IWDG 重装载值范围为0~0x0FFF;/* Reload IWDG counter */ IWDG_ReloadCounter();//按照重装载的寄存器的值来重装载IWDG 计数器/* Enable IWDG (the LSI oscillator will be enabled by hardware) */ IWDG_Enable();//使能独立看门狗}在主程序中实现喂狗的程序如下:///////////主程序//////////////////int main(void){ RCC_Configuration(); //时钟配置NVIC_Configuration();//中断配置GPIO_Configuration();//GPIO 配置WatchDog_int();// 独立看门狗IWDG 设置/* 检查是否看门狗复位*/if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) { printf(“WatchDog Reset\r\n”); speakertest(); RCC_ClearFlag();//清除标志位} else {;}}。
stm32看门狗原理stm32看门狗原理解析什么是看门狗•看门狗(Watchdog)是一种用于监控嵌入式系统运行状态的设备或模块。
•它可以定时检测系统是否正常运行,并在异常情况下采取相应措施,比如重启系统。
•stm32看门狗是一种特殊的硬件单元,用于监控stm32微控制器的运行状态。
看门狗的工作原理•stm32看门狗是通过一个可配置的定时器和一个计数器实现的。
•看门狗的计数器会在系统启动时开始计数,超过预设的阈值时,看门狗将产生一个复位信号。
•在正常的系统运行过程中,我们需要定期喂狗,也就是重置看门狗的计数器。
如果超过计数器范围内指定的时间没有重置,看门狗就会认为系统发生故障。
•当看门狗检测到系统异常时,它会强制将stm32芯片重新启动,使系统恢复到初始状态。
stm32看门狗的配置方法•首先,我们需要在stm32的初始化代码中启用看门狗模块。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // 使能看门狗时钟WWDG_SetPrescaler(WWDG_Prescaler_8); // 设置预分频器的分频系数为8WWDG_SetWindowValue(127); // 设置看门狗的窗口值WWDG_Enable(80); // 启动看门狗并设置计数器初值为80•上述代码会启用stm32看门狗模块,并进行一些基本的参数配置。
•接下来,在系统的运行过程中,我们需要定期喂狗,以防止系统异常。
WWDG_SetCounter(80); // 重置看门狗计数器•上述代码会重置看门狗计数器,确保系统正常运行时不会触发看门狗的复位信号。
看门狗的注意事项•为了确保系统的正常运行,需要根据系统的需求合理设置看门狗的参数,包括预分频器、窗口值和计数器初值等。
•设置过小的参数可能会导致误触发看门狗的复位信号,系统频繁重启。
•设置过大的参数可能无法及时检测到系统异常,系统在故障时无法及时恢复。
STM32 独立看门狗IWDG 与窗口看门狗WWDG独立看门狗Iwdg 有独立时钟(内部低速时钟LSI---40KHz),所以不受系统硬件影响的系统故障探测器。
主要用于监视硬件错误。
窗口看门狗wwdg 时钟与系统相同。
如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。
一,独立看门狗看门狗定时时限= IWDG_SetReload()的值/ 看门狗时钟频率看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数1.STM32独立看门狗IWDG 的时限定为280 微秒。
这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。
/* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) --------------------------------------- ----------------------*//* Enable write access to IWDG_PR and IWDG_RLR registers */IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */IWDG_SetPrescaler(IWDG_Prescaler_32);/* Set counter reload value to 349 */IWDG_SetReload(349);/*该参数允许取值范围为0 – 0x0FFF */* Reload IWDG counter */IWDG_ReloadCounter();/* Enable IWDG (the LSI oscillator will be enabled by hardware) */IWDG_Enable();2.独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动;因此,即使主时钟发生故障它也仍然有效。
STM32之窗⼝看门狗简介:跟独⽴看门狗⼀样,也是⽤来检测软件可能出现的错误,不⼀样的是,当独⽴看门狗计数器的值减到0时会产⽣复位,在减到0之前喂狗防⽌复位。
窗⼝看门狗:在某⼀值到0x40之间喂狗才不会产⽣复位,其他情况均会产⽣复位信号,这个某⼀个值称之为窗⼝上限。
计数器数值由看门狗控制寄存器决定可以看出计数器占7位,最⼤值为0x7f功能框图:1.PCLK1默认为36MHz2.PCLK1经过分频器分频⽣成CNT_CK给计数器提供时钟从图中可以看出CNT_CK=PCLK1/4096/(2^WDGTB)3.计数器,见最上⾯第1 2张图,当计数器最⾼位T6由1变为0时,产⽣复位4.设置窗⼝上限值,见配置寄存器,窗⼝上限值不得⼤于计数器最⼤值,不得⼩于窗⼝下限值超时时间计算:超时时间指计数器值减到窗⼝下限下⼀个数值即0x3f所花时间最短超时时间在计数器的值为0x40的时候,最长超时时间在计数器值为0x7f的时候当WDGTB为0时,CNT_CK=36M/4096/1=8789.0625Hz 计数器减⼀次所花时间为 1/8789.0625(s) 最短超时时间=(0x40-0x3f)*/8789.0625约等于113us最长超时时间=(0x7f-0x3f)/8789.0625 约等于7.28ms相关函数:上⾯中的中断函数使能是当计数器从0x40减到0x3f时产⽣的,这个中断称为死前中断。
实验:设置计数器值和窗⼝上限值都为0x7f配置死前中断,在中断中喂狗,并且LED2反转main函数中,LED1⼀直点亮原理图:看门狗头⽂件和源⽂件:#ifndef _WWDG_H#define _WWDG_H#include "stm32f10x.h"void WWDG_Config(void);#endif#include "wwdg.h"static void LED1_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_SetBits(GPIOC,GPIO_Pin_1);//默认熄灭}//中断优先级配置static void WWDG_NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStruct);}void WWDG_Config(void){WWDG_NVIC_Config();LED1_GPIO_Config();RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启看门狗时钟 WWDG_SetPrescaler(WWDG_Prescaler_8);//设置分频系数WWDG_SetWindowValue(0x7f);//设置窗⼝上限值WWDG_SetCounter(0x7f);//设置计数器值WWDG_EnableIT();//使能中断WWDG_Enable(0x7f);//开启看门狗}void WWDG_IRQHandler(void){WWDG_ClearFlag();WWDG_SetCounter(0x7f);//设置计数器值//LED2反转if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_1)==SET)GPIO_ResetBits(GPIOC,GPIO_Pin_1);elseGPIO_SetBits(GPIOC,GPIO_Pin_1);//默认熄灭}mian⽂件:#include "stm32f10x.h"#include "wwdg.h"static void LED0_GPIO_Config(void);int main(void){LED0_GPIO_Config();WWDG_Config();while(1);}static void LED0_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_ResetBits(GPIOC,GPIO_Pin_0);//默认点亮}。
引言概述:
单片机的看门狗(二)是在第一篇文章中讨论的单片机看门狗的延伸,本文将深入探讨单片机看门狗的使用场景、工作原理、设置参数、使用注意事项以及常见问题等方面的内容。
单片机看门狗是一种重要的硬件设备,在系统稳定性和可靠性方面起到关键作用,因此了解和掌握单片机看门狗的相关知识是非常有必要的。
正文内容:
一、单片机看门狗的使用场景
1.1实时系统
1.2长时间运行的设备
1.3类似于操作系统的应用
二、单片机看门狗的工作原理
2.1看门狗定时器
2.2看门狗计数器
2.3看门狗复位信号
三、单片机看门狗的设置参数
3.1看门狗定时器的预分频和计数器
3.2看门狗复位信号的触发条件
3.3看门狗溢出时间的设置
四、单片机看门狗的使用注意事项
4.1错误的看门狗设置
4.2看门狗溢出时间过短
4.3看门狗溢出时间过长
五、单片机看门狗的常见问题及解决方法
5.1看门狗复位问题
5.2看门狗延时问题
5.3看门狗定时器设置问题
总结:
单片机看门狗是一项重要的硬件设备,它在保证系统稳定性和可靠性方面起到关键作用。
本文从使用场景、工作原理、设置参数、使用注意事项以及常见问题等方面深入探讨了单片机看门狗的相关知识。
在实际应用中,我们应该根据具体情况,合理设置单片机看门狗的参数,避免错误的配置导致系统异常。
同时,我们也要注意单片机看门狗的溢出时间,不要设置过短或过长,以免影响系统的正常运行。
通过深入了解和掌握单片机看门狗的相关知识,我们可以更好地应用它,提高系统的稳定性和可靠性。
STM32学习笔记---WWDG窗⼝看门狗实验继做了SYSTICK实验后,继续进⾏第8个实验-WWDG窗⼝看门狗实验,本实验通过设置窗⼝看门狗WWDG间断时间来中断来定期的检查是否出错,在WWDG中断函数中加⼊了流⽔灯⽤来测试是否运⾏了看门狗程序中断,⽤PB5-LED1通过窗⼝看门狗间断时间来闪烁,编程⼯程⼤致和USART实验过程差不多,先是开启系统时钟,然后GPIO端⼝时钟,然后复⽤功能时钟AFIO,然后各个模块⽤的的时钟,,呵呵,之后进⼊各个模块初始化,设置,编写⼦程序,中断的话,要在中断函数中填写某模块的中断触发处理函数,重要的是在CONFG.H函数中开启模块的声明,差不多是这样的了。
以下为WWDG函数主要部分://WWDG窗⼝看门狗设置初始化void WWDG_Config(void){//软件看门狗初始化RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8); //时钟8分频4ms// (PCLK1/4096)/8= 244 Hz (~4 ms)WWDG_SetWindowValue(65); //计数器数值WWDG_Enable(127); //启动计数器,设置喂狗时间// WWDG timeout = ~4 ms * 64 = 262 msWWDG_ClearFlag(); //清除标志位WWDG_EnableIT(); //启动中断}*****************************************************void WWDG_IRQHandler(void){WWDG_SetCounter(0x7F); //更新计数值WWDG_ClearFlag(); //清除标志位switch(WWDGFLAG){case 0:GPIO_SetBits(GPIOB, GPIO_Pin_5);break;case 1:GPIO_ResetBits(GPIOB, GPIO_Pin_5);break;default:break;}WWDGFLAG=!WWDGFLAG;}以下为WWDG函数结果部分:。
STM32之窗⼝看门狗(WWDG)题外话:本⼈感觉今年⽐去年“蛋定”了,做事更沉稳,学习更踏实(从去年开始就把考试成绩看的不重要了),不是为了学习⽽学习,⽽且做事更负责任了。
再接再厉。
前⼏天学习STM32的两条狗,先学习了宠物狗(IWDG),和其它MCU差不多,不多说了。
学到警⽝(WWDG)的时候,问题来了,没有IWDG那么好理解了,看了半天没有搞懂是怎么回事,计数器值、窗⼝值、在什么时候喂狗、什么时候产⽣中断等等,⼀头雾⽔。
经过两天的推敲,个⼈理解如下:1、有个7位递减计数器(WWDG->CR),就这个计数器和窗⼝计数器(WWDG->CFR)决定什么时候喂狗。
狗喂早了,复位——“早”体现在计数器值(tr)>窗⼝值(wr),也就是计数器值还没有减到窗⼝值以下;2、当 0x40 < 计数器值(tr) < 窗⼝值(wr) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适;3、当计数器的值从0x40变到0x3F的时候,将产⽣看门狗复位;当然在要产⽣复位的前⼀段时间,如果开启了提前唤醒中断,那么就会进⼊中断,在中断函数⾥,我们需要及时喂狗,否则会产⽣复位;4、据⽹上资料介绍,在这个中断⾥⾯⼀般不进⾏喂狗,⼀般是系统去世前的“遗嘱”,⽐如存储重要的数据等。
这个就需要根据个⼈需要设计。
下⾯择取部分程序,可以根据程序说明,计算出喂狗的时间,⼤家注意推敲,欢迎交流!u8 WWDG_CNT = 0x7F;void WWDG_Init(u8 tr, u8 wr, u32 fprer){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能WWDG_CNT = tr & WWDG_CNT; // 初始化WWDG_CNTWWDG_SetPrescaler(fprer); // 设置IWDG预分频值WWDG_SetWindowValue(wr); // 设置窗⼝值WWDG_Enable(WWDG_CNT); // 使能看门狗, 设置 counterWWDG_ClearFlag(); // 清除提前唤醒中断标志位WWDG_NVIC_Init(); // 初始化窗⼝看门狗 NVICWWDG_EnableIT(); // 开启窗⼝看门狗中断}void WWDG_IRQHandler(void){WWDG_ClearFlag(); // 清除提前唤醒中断标志位LED1 = !LED1; // LED1 状态翻转printf("进⼊中断!\r\n");}int main(void){u8 tr, wr;delay_init();NVIC_Configuration(); // 设置NVIC中断分组2:2位抢占优先级, 2位响应优先级LED_Init();KEY_Init();uart_init(9600);LED0 = 0;delay_ms(300);WWDG_Init(0x7F, 0x5F, WWDG_Prescaler_8); // 计数器值为7f, 窗⼝寄存器值为5f, 分频数为8 while(1){LED0 = 1;wr=WWDG->CFR&0X7F; // 窗⼝值tr=WWDG->CR&0X7F; // 计数器值if(tr<wr) // 计数器值tr必须⼩于窗⼝值wr时才能喂狗,在之前喂狗则太早,会产⽣看门狗复位 {WWDG_SetCounter(WWDG_CNT);printf("正在喂狗!\r\n");}}}实践出真知!试验现象:DS0(红灯)先亮,再灭,DS1⽆变化。
STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。
看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。
看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。
看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU 复位,此时本来运行的程序终止重新启动单片机(发生了故障)。
在使用了看门狗之后,在正常运行的程序中加入喂狗的程序,即采用定时器的方式每隔一段时间进行一次喂狗重置计数装载值,这样,只要程序正常运行,没有出现故障或软件错误,就会不断的定时喂狗,从而不会使计数值达到超时值产生复位。
一、独立看门狗IWDG:1、IWDG主要性能1)自由运行的递减计数器2)时钟由独立的RC振荡器提供(可在停止和待机模式下工作)3)看门狗被激活后,则在计数器计数至0x000时产生复位2、IWDG功能描述在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。
当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位。
void IWDG_ConfiguraTIon(void)。
STM32F0 独立和窗口看门狗的功能解析概述
对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0 看门狗的功能,F0 的看门狗有两种:独立和窗口看门狗。
两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能。
准备工作
对于看门狗的编程,建议大家准备F0 的参考手册和数据手册,方便查阅相关知识,没有的请到ST 官网或到我360 云盘下载。
今天总结的软件工程是基于“TIM基本延时配置详细过程”修改而来,因此需要将该软件工程下载准备好。
我每次都是提供整理好的软件工程供大家下载,但是,如果你是一位学习者,建议自己亲手一步一步操作。
STM32F4系列MCU独立看门狗IWDG的应用
为了提搞系统的可靠性,STM32F4系列MCU有一个独立看门狗(IWDG)和一个窗口看门狗(WWDG)。
今天做的实验是关于独立看门狗的。
独立看门狗使用的时钟源是内部低速振荡器LSI。
因为LSE可能没接,HSE可能坏点,HSE耗着的时候HSI却观点了。
诸多原因,LSI是最好的独立看门狗时钟。
【IWDG主要特性】
1、独立的向下计数器
2、内部RC振荡器作为时钟源
3、当计数器值减到0时,复位MCU 【IWDG配置步骤】
1、设置KR寄存器,为向PR和RLR写入数据做准备。
向KR写入0x5555使能写入PR 和RLR
2、写入预分频值和重装载值。
预分频是对LSI进行分频,重装载值是每次重新计数的开始值。
3、向KR写入0xAAAA,使能计数。
4、向KR写入0x5555,重新开始计数。
否则计数到0就会reset。
【代码实现】
本实验依赖于前面的LED实验。
实验第一步的现象是LED反复闪烁。
第二步现象是LED 亮一下后熄灭。
第一部分:
int main()
{
NVIC_Config();
LED_Init();
LEDOn(LED1);
delay_ms(500);
LEDOff(LED1);。
STM32F103系列单片机最实用看门狗的详细资料概述为什么使用看门狗事情很简单先前做的一款采集数据的产品不知道为何异常,陷入死循环然后“死机”,分析了很多次,没发现原因,但是每次重新上点后就能正常采集到数据。
后来找到了解决方法:看门狗!目的是当程序走入死循环或者硬件异常时,可以自动复位,这样就可以得到跟重新上电后差不多的效果了。
使用的平台:stm32f103系列单片机使用的烧写调试模式:Jlink SWD 模式。
使用STM32官方模板库。
ST系列单片机看门狗分为两种:1.独立看门狗,2.窗口看门狗。
独立看门狗:可参看RM(reference Manual)的Independent watchdog (IWDG)当然,只是简要查看下RM中的介绍(至于寄存器的操作,我们可以略过,因为我们使用库的开发,但是基本流程一定要了解!)。
在这里我们要抓住几个关键点:a、stm32f10x系列有两个看门狗,看门狗主要用于检测由于软件出错的问题,并触发系统自动复位,或者触发一个中断(窗口看门狗才有)。
b、独立看门狗的时钟源为LSI,尽管主时钟出错,它还是能保持激活状态。
窗口看门狗的时钟源为APB1时钟,并且可以修改分频值。
c、独立看门狗:有独立时钟(内部低速时钟LSI),所以不受系统硬件影响的系统故障探测器。
主要用于监视硬件错误。
精确度要求比较低。
d、窗口看门狗:时钟与系统相同。
如果系统时钟不走了,这个狗也就失去作用了,主要用于监视软件错误。
精确度要求更高。
看门狗原理简介:有某个寄存器按照时钟源不断的递减(有只狗,不断的消耗能量),当该。
STM32单片机的独立看门狗和窗口看门狗的特点及用法解析1.看门狗介绍看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。
使用看门狗保证系统正常地运行是非常有必要的。
我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。
看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。
STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。
2.IWDG的特点以及使用IWDG是一个独立看门狗,具有独立于系统的时钟,与片外看门狗更为相似,使用片内独立的阻容时钟发生电路计时,记录时间为=(时钟频率(40KHz)/ 分频数)*IWDG_SetReload (t),t《0xFFF.也就是说记录的最大设定的复位时间为(1/40K)*256*0xFFF = 26.2 S。
由于IWDG使用的时钟本身不准确,会因为漂移产生一定变化,喂狗时应该给出一定的裕量。
另外,这个时钟与系统时钟并无关联,所有也不能与系统进行同步产生中断,一旦定时时间到后就会产生复位信号,系统来不及存储当前运行状态就会重启,可以在要求不高的场合使用。
3.WWDG的特点以及使用WWDG具有一个独立的7位定时器,使用系统时钟,可以产生系统中断。
其定时最时间为(1/PCLK1)* 4096)* 分频系数(最大为8)*(0x7F –0x3F)= 58ms.其复位的条件是:(1)当计数器的数值从0x40减到0x3F(2)当刷新看门狗时计数器的数值大于窗口上限值时满足任何一条都可以产生复位信号。
通常情况下设置窗口上限值为0x7F,下限值默认为0x40,计数器向下数到0x40就会产生中断,下个910us后变为0x3F就会复位系统。