STM32单片机——看门狗(独立看门狗窗口看门狗)

news2024/11/28 3:30:03

STM32单片机——看门狗(独立看门狗&窗口看门狗)

  • 独立看门狗(IWDG)
    • 独立看门狗本质相关概念
    • 独立看门狗实验
      • CubeMX工程配置
      • HAL库程序设计
      • 固件库程序设计
  • 窗口看门狗(WWDG)
    • 独立看门狗本质相关概念
    • 窗口看门狗实验
      • CubeMX工程配置
      • HAL库程序设计
      • 固件库程序设计
  • 独立看门狗与窗口看门狗的异同

  • 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)

独立看门狗(IWDG)

  • 参考博文:外部中断实验&独立看门狗实验

独立看门狗本质相关概念

  • 独立看门狗概念
      独立看门狗工作在主程序之外,能够完全独立工作,它的时钟是专用的低速时钟(LSI),由VDD 电压供电, 在停止模式和待机模式下仍能工作

  • 独立看门狗本质
      独立看门狗本质是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即 IWDG_RESET 。
      如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。

  • 独立看门狗框图

  • 独立看门狗时钟
      独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。启用IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz
      LSI经过一个8位的预分频器得到计数器时钟。

  • 预分频寄存器

    分频系数算法

    prer是IWDG_PR 的值

  • 溢出计算时间公式

独立看门狗实验

  • 需求:开启独立看门狗,溢出时间为1秒,使用按键1进行喂狗

CubeMX工程配置

  • 配置时钟及时钟树
    1. 采用外部高速晶振
    2. 时钟树配置
  • 独立开门狗配置
    1. 启动独立看门狗
    2. 参数设置(分频系数和重装载值)
  • 打开串口通信
    1. 配置异步通信模式
    2. 串口波特率及参数配置

HAL库程序设计

HAL_UART_Transmit(&huart1,(unsigned char *)"hello world\r\n",strlen("hello world\r\n"),200);		//while(1) 之前运行,每1秒溢出,重复程序

//按键喂狗  使得程序继续运行
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == KEY1_Pin)
	{
			HAL_IWDG_Refresh(&hiwdg);
	}
}

固件库程序设计

  • IWDG独立看门狗操作库函数
    void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
    void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);	//设置预分频系数:写PR
    void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
    void IWDG_ReloadCounter(void);//喂狗: 写0xAAAA到KR
    void IWDG_Enable(void);//使能看门狗: 写0xCCCC到KR
    FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新
    
  • 独立看门狗操作步骤
    1.取消寄存器写保护:IWDG_WriteAccessCmd();
    2.设置独立看门狗的预分频系数,确定时钟:IWDG_SetPrescaler();
    3.设置看门狗重装载值,确定溢出时间:IWDG_SetReload();
    4.使能看门狗:IWDG_Enable();
    5.应用程序喂狗:IWDG_ReloadCounter();
  • iwdg.c 独立看门狗程序设计
    //初始化独立看门狗
    //prer:	分频数:0~7(只有低3位有效!)
    //分频因子=4*2^prer.但最大值只能是256!
    //rlr:重装载寄存器值:低11位有效.
    //时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
    void IWDG_Init(u8 prer,u16 rlr) 
    {	
     	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//使能对寄存器IWDG_PR和IWDG_RLR的写操作,取消写保护
    	
    	IWDG_SetPrescaler(prer);	//设置IWDG预分频值:设置IWDG预分频值为64
    	
    	IWDG_SetReload(rlr);		//设置IWDG重装载值
    	
    	IWDG_ReloadCounter();		//按照IWDG重装载寄存器的值重装载IWDG计数器   加载寄存器
    	
    	IWDG_Enable();																//使能看门狗
    }
    //喂独立看门狗
    void IWDG_Feed(void)
    {   
     	IWDG_ReloadCounter();			//重载计数值						   
    }
    
  • 主函数设计
    int main(void)
    {	
    	delay_init();	    	 //延时函数初始化	
    	LED_Init();
    	KEY_Init();
    	delay_ms(1000);			//看得到灭
    	IWDG_Init(4,625);		//预分频数64, 重载值为625, 溢出时间为1s	   
    	LED1=0;					//点亮LED0
    	while(1)
    	{
    		//按键进行对独立看门狗喂狗
    		if(KEY_Scan()==KEY1_PRES)
    		{
    			IWDG_Feed();		//如果KEY1按下,则喂狗
    		}
    		delay_ms(10);
    	}
    }
    

窗口看门狗(WWDG)

  • 参考博文:窗口看门狗实验&定时器基本原理

独立看门狗本质相关概念

  • 什么是窗口看门狗?
      窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。
      窗口看门狗的本质是一个能产生系统复位信号提前唤醒中断的6位计数器。
    产生复位条件:

    1. 当递减计数器值从 0x40 减到 0x3F 时复位(即T6位跳变到0)

    2. 计数器的值大于 W[6:0] 值时喂狗会复位。

    产生中断条件: 当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。
    在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗。

  • 窗口看门狗工作原理

  • WWDG框图

  • 控制寄存器

  • 配置寄存器

  • 状态寄存器

  • 超时时间计算

    1. Tout是WWDG超时时间(没喂狗)
    2. Fwwdg是WWDG的时钟源频率(最大36M)
    3. 4096是WWDG固定的预分频系数
    4. 2^WDGTB是WWDG_CFR寄存器设置的预分频系数值
    5. T[5:0]是WWDG计数器低6位,最多63

窗口看门狗实验

  • 需求:
      开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8 。程序启动时点亮 LED1 ,500ms 后熄灭。在提前唤醒中断服务函数进行喂狗,同时翻转 LED2 状态。

CubeMX工程配置

  • 配置时钟及时钟树
    1. 采用外部高速晶振
    2. 时钟树配置
  • 窗口开门狗配置
    1. 开启窗口看门狗及参数设置
    2. 开启提前唤醒中断
  • LED灯配置(略)

HAL库程序设计

  • main.c主函数设计
    int main(void)
    {
    	HAL_Init();
    	SystemClock_Config();
    	MX_GPIO_Init();
    	HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
    	HAL_Delay(500);
    	MX_WWDG_Init();		
    	while (1)
    	{
    		HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
    		HAL_Delay(500);
    	}
    }
    
  • 提前唤醒中断函数喂狗
     void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    {
    		HAL_WWDG_Refresh(hwwdg);		//喂狗
    		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
    }
    

固件库程序设计

  • 窗口看门狗配置过程
    1.使能看门狗时钟:RCC_APB1PeriphClockCmd();
    2.设置分频系数:WWDG_SetPrescaler();
    3.设置窗口值:WWDG_SetWindowValue();
    4.开启提前唤醒中断并分组(可选):
    WWDG_EnableIT();
    NVIC_Init();
    5.使能看门狗:
    WWDG_Enable();
    6.喂狗:WWDG_SetCounter();
    7.编写终端服务函数:WWDG_IRQHandler();

  • wwdg.c 窗口看门狗程序设计

    //保存WWDG计数器的设置值,默认为最大. 
    u8 WWDG_CNT=0x7f; 
    //初始化窗口看门狗 	
    //tr   :T[6:0],计数器值 
    //wr   :W[6:0],窗口值 
    //fprer:分频系数(WDGTB),仅最低2位有效 
    //Fwwdg=PCLK1/(4096*2^fprer). 
     
    void WWDG_Init(u8 tr,u8 wr,u32 fprer)										//设置计数器初值、窗口值、预分频系数
    { 
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);	//WWDG时钟使能
     
    	WWDG_CNT=tr&WWDG_CNT; 			//初始化WWDG_CNT.  位运算:与
    	WWDG_SetPrescaler(fprer);		//设置IWDG预分频值
    	WWDG_SetWindowValue(wr);		//设置窗口值
    	WWDG_Enable(WWDG_CNT);			//使能看门狗 ,	设置 counter .           
    	WWDG_ClearFlag();				//清除提前唤醒中断标志位 
    	WWDG_NVIC_Init();				//初始化窗口看门狗 NVIC
    	WWDG_EnableIT(); 				//开启窗口看门狗中断
    } 
    //重设置WWDG计数器的值
    void WWDG_Set_Counter(u8 cnt)		//为了和寄存器保持一制,重新包装了一下
    {
        WWDG_Enable(cnt);//使能看门狗 ,	设置 counter .	 
    }
    //使能提前唤醒中断
    void WWDG_NVIC_Init()
    {
    	NVIC_InitTypeDef NVIC_InitStructure;
    	NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    			//WWDG中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //抢占2,子优先级3,组2	
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	 		//抢占2,子优先级3,组2	
     	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
    	NVIC_Init(&NVIC_InitStructure);																//NVIC初始化
    }
    
  • 主函数程序初始化

    int main(void)
    {	
    	delay_init();	    	 //延时函数初始化	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	LED_Init();
    	LED1=0;							//点亮LED0
    	delay_ms(1000);	  
    	WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8	
      	while(1)
    	{
    			LED1 = 1;
    			delay_ms(40);
    	}
    }
    
  • 提前唤醒中断服务函数

    void WWDG_IRQHandler(void)		//窗口看门狗 中断服务函数
    {
     
    	WWDG_SetCounter(WWDG_CNT);	//当禁掉此句后,窗口看门狗将产生复位
    	WWDG_ClearFlag();			//清除提前唤醒中断标志位
    	LED1=!LED1;					//LED状态翻转
    }
    

独立看门狗与窗口看门狗的异同

对比点独立看门狗窗口看门狗
时钟源独立时钟,LSI (40KHz) ,不精确PCLK1或PCLK3,精确
复位条件递减计数到0窗口期外喂狗或减到0x3F
中断没有中断计数值减到0x40可产生中断
递减计数器位数12位(最大计数范围:4096 ~ 0)7位(最大计数范围:127~63)
应用场合防止程序跑飞,死循环,死机检测程序时效,防止软件异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

购物H5商城架构运维之路

一、引言 公司属于旅游行业,需要将旅游,酒店,购物,聚合到线上商城。通过对会员数据进行聚合,形成大会员系统,从而提供统一的对客窗口。 二、业务场景 围绕更加有效地获取用户,提升用户的LTV&a…

mysql 半同步复制模式使用详解

目录 一、前言 二、mysql主从架构简介 2.1 mysql主从复制架构概述 2.2 为什么使用主从架构 2.2.1 提高数据可用性 2.2.2 提高数据可靠性 2.2.3 提升数据读写性能 2.3 主从架构原理 2.4 主从架构扩展 2.4.1 双机热备(AB复制) 2.4.2 级联复制 2…

驱动开发,基于中断子系统完成按键的中断驱动,引入中断底半部

一.引入linux内核中断目的 引入linux内核中断之前,内核访问设备要不断轮询访问; 引入linux内核中断便于内核对设备的访问,当设备事件发生后主动通知内核,内核再去访问设备; 二.linux内核中断实现过程框图 根据软…

STM32F103RCT6学习笔记2:串口通信

今日开始快速掌握这款STM32F103RCT6芯片的环境与编程开发,有关基础知识的部分不会多唠,直接实践与运用!文章贴出代码测试工程与测试效果图: 目录 串口通信实验计划: 串口通信配置代码: 测试效果图&#…

2007-2021年31省市财政环保支出占比数据(含原始数据+计算过程+测算结果)

2007-2021年31省市财政环保支出占比数据(含原始数据计算过程测算结果) 1、时间:2007-2021年 2、来源:整理自国家统计局和统计年鉴 3、指标:财政环境保护支出、财政一般预算支出、环保支出占比 4、计算公式&#xf…

【jmeter】jmeter引用变量,变量值传递失败

最近在用jmeter做接口测试的时候,发现有个变量,参数值一直没有传递进来,导致request的时候,请求体里面一直是${}变量的形式。 后来经过排查发现,是因为我在定义用户变量的时候,在这个now后面多加了一个空格…

leetcode25 K个一组反转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部…

【SMBghost CVE-2020-0796漏洞复现】

目录 一、漏洞原理 二、复现过程 三、防护 一、漏洞原理 最近在做内网渗透的时候发现一大批可以利用的win系统资产,其中这些资产中对于445的开放限制不多;对于smb3.1版本的window系统存在可被利用的漏洞,即永恒之黑漏洞。SMBv3.1没有正确处…

Python爬虫:动态获取页面

动态网站根据用户的某些操作产生一些结果。例如,当网页仅在向下滚动或将鼠标移动到屏幕上时才完全加载时,这背后一定有一些动态编程。当您将鼠标指针悬停在某些文本上时,它会为您提供一些选项,它还包含一些动态.这是是一篇关于动态…

problen(5)ubuntu版本问题

浅浅记录一下这段时间的血和泪吧,大概耗时快一个月了吧,终于解决了...... 因为需要开启pwn之旅,需要在Ubuntu上安装一些东西,就是下面的一条命令: sudo pip3 install pwntools -i Simple Index(显示不太好了…

mybatis-plus报错:Invalid bound statement (not found)

mybatis报错:Invalid bound statement (not found)的原因很多,但是正如报错提示一样,找不到xml中的sql语句,报错的情况分为三种: 第一种:语法错误 Java DAO层接口 public void delete(Param("id&qu…

网站登录界面制作(three.js 3D特效背景)+ boostrap导航栏实现 + jQuery移动窗口【附加源代码】

网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现 文章目录 网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现前言登录界面效果图主页面效果图:主页面源代码 前言 学过Web前端的许多小伙伴都会面…

计算机三级信息安全技术九十道选择题

1、Windows7操作系统中,配置IPSec时支持的身份验证方法不包括 A、Kerberos协议 B、 数字证书 C、预共享密钥 D、 会话密钥 答案: D 解析: 2、企业销售商用密码产品时,应向国家密码管理机构申请,必需具备的条件是…

MHA、MQA、GQA区别和联系

2023 年7月,Meta发布了其最新版本LLaMA 2,其中 LLama2 的注意力机制使用了GQA,那么什么是GQA呢?和标准的MHA有什么区别呢?关于 LLM 更多信息,可参考笔者文章:AIGC入门 - LLM信息概览 本文将介绍…

携手并进 | 云畅科技与华商智造院签署战略合作协议

9 月 15 日,云畅科技与华商智造院的签约仪式顺利举行,湖南华商智造院董事长郭平、湖南华商智造院董事兼副总经理秦宇琳、湖南华商智造院湘江新区总经理郭蕊、云畅科技董事长兼 CEO 蔡鑫莹、云畅科技联合创始人兼 CMO 徐智峰等出席活动,共同见…

Kafka 杂谈

概览 什么是 Kafka? 这里先给出结论,我不太希望在解释概念 X 的时候,说到「为了了解 X,我们需要先了解一下 Y」,阅读的人思绪会被迁到另一个地方。既然小标题里说了要解释什么是 Kafka,那么我们就只说什么…

兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场

项目说明 兔兔答题是用户端基于uniapp开发支持多端适配,管理端端采用TypeScriptVue3.jselement-plus,后端采用THinkPHP6PHP8Golang开发的一款在线答题应用程序。 问题反馈 线上预览地址 相关问题可以通过下方的二维码,联系到我。了解更多 …

15.状态模式(State)

UML 意图:允许一个对象在其内部状态改变时改变它的行为,使得对象看起来好像修改了它的类型一样。 Context:定义客户感兴趣的接口; 维护一个ConcreteState子类的实例,这个实例定义当前的状态。 State:定义一…

FPGA原理与结构(0)——目录与传送门

一、 简介 FPGA的设计和软件设计不同,我们所设计的RTL代码最终还是要落实到硬件底层来进行实例化,因此理解硬件底层的内容是很有意义的。 二、可编程逻辑块CLB 可配置逻辑块CLB(Configurable Logic Block)是xilinx系类FPGA的基本…