STM32(八):独立看门狗 (标准库函数)

前言

上一篇文章介绍了STM32单片机中的USART串口通信,这篇文章我们来介绍一下如何用STM32单片机中的独立看门狗来实现检测按键点灯的程序。

一、实验原理

单片机系统会由于受到外界的干扰,而造成程序执行紊乱,系统无法正常运行。为了防止这种情况的发生,产生了一种用于检测程序运行状态的电路或芯片,俗称看门狗(Watchdog)。

1.看门狗的介绍

看门狗(Watchdog)是一种硬件定时器,用于监测程序执行是否正常,并在系统出现故障或死锁时重启系统。看门狗可以分为独立与单片机外部的看门狗芯片和单片机内集成的看门狗外设模块两种,提供了更高的安全性、时间的精确性和使用的灵活性。而STM32F10x内置两个看门狗:IWDG(独立看门狗)WWDG(窗口看门狗)

  • IWDG(独立看门狗)

  由专门的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。

  • WWDG(窗口看门狗)

        由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

看门狗有一个输入信号,也称“喂狗”;有一个输出信号给MCU的复位端。系统运行后启动看门狗计数器,看门狗开始计数,当计数满后(一定时间)未收到清零信号(喂狗),看门狗计数器会溢出,引起看门狗中断,造成系统复位。

而我们主要介绍一下IWDG(独立看门狗)。

2.IWDG(独立看门狗)

独立看门狗(Independent watchdog,IWDG)的时钟系统是由一个12位递减计数器和一个8位的预分频器构成的使用独立40KHZ内部低速LSI RC振荡器提供,可在停止和待机模式下工作。

要想搞清楚IWDG的原理,那么首先还是先要学会看图,原理图如图所示:

工作原理:

  • 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;
  • 此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。
  • 无论何时,只要在键寄存器IWDG_KR中写入0xAAAA(喂狗), IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位 。
  • IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555
值得一提的是,看门狗功能处于VDD供电区,即在停机和待机模式时仍能正常工作。

3.IWDG的寄存器

STM32单片机的IWDG相关的寄存器有:键寄存器IWDG_KR、重装载寄存器IWDG_RLR、预分频寄存器IWDG_PR和状态寄存器IWDG_SR。下面将对其进行简单的说明:

1.键寄存器IWDG_KR

一个控制寄存器,主要有三种控制方式,由位15:0决定。

 2.重装载寄存器IWDG_RLR

一个12位的寄存器,用于存放重装载值,低12位有效,即最大值为4096,这个值的大小决定着独立看门狗的溢出时间。   

计算溢出的时间公式: Tout  = (PSC * RLR)/ LSI
其中,PSC是分频系数,RLR计数器重装载值,LSI一般是40KHz。

 3.预分频寄存器IWDG_PR

允许选择一个预分频因子,该因子决定了从低速内部时钟(LSI)到看门狗计时器的时钟频率。预分频值通过对LSI时钟频率进行分频来降低,从而增长看门狗计时器的计数周期。

预分频的算法公式是:PSC = 4 * 2 PRER

其中PRER就是IWDG_PR的值。

 4.状态寄存器IWDG_SR

提供了有关看门狗重载操作和预分频值更新的实时信息,通过监测PVU和RVU位的状态,软件可以了解看门狗计时器的配置是否已经完成,从而确保看门狗定时器以预期的方式运行。

二、实验步骤

1.引脚初始化

首先是使能预分频寄存器PR和重装载寄存器RLR

IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );

接下来是设置预分频器值和设置重装载寄存器值,并把重装载寄存器的值放到计数器中,具体设置的方法可以看下图

/* 设置预分频器值 */
IWDG_SetPrescaler( prv );
	
/* 设置重装载寄存器值 */
IWDG_SetReload( rlv );
	
/* 把重装载寄存器的值放到计数器中 */
IWDG_ReloadCounter();

其中

  • prv:看门狗时钟预分频值(IWDG_ PR值);
  • rlv:看门狗的重装载值(IWDG_ RLR的值) ; 
  • 溢出时间的计算公式:Tout=((4x2^prv ) * rlv ) /40 

以下为prv所能取到的值

 最后是并使能 IWDG

/* 使能 IWDG */
IWDG_Enable(); 

2.喂狗函数

把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位,当计数器的值减到0的时候会产生系统复位。

void IWDG_Feed(void)
{
	IWDG_ReloadCounter();
}

3.按键检测

key.c文件中加入KEY_lwdg(), IWDG_Feed()是喂狗,如果不喂狗,系统则会复位,LD1则会亮一次,如果在1s时间内准时喂狗的话,则LED1,LED2,LED3会常灭。

ps:这边记得需要将bsp_iwdg.h也加入key.h文件中

void KEY_lwdg(void)
{
	/* 读取按键状态 */
	int key1State = KEYx_Choice(1);
	
   /* 短按按键1 */
	if (key1State == 1)
	{
	IWDG_Feed();
	}

}

三、实操代码

程序分为3个文件:bsp_iwdg.c、bsp_iwdg.h、main.c

1.bsp_iwdg.c 

/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp/wdg/bsp_iwdg.h"

void IWDG_Config(uint8_t prv ,uint16_t rlv)
{	
	/* 使能 预分频寄存器PR和重装载寄存器RLR可写 */
	IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
	
	/* 设置预分频器值 */
	IWDG_SetPrescaler( prv );
	
	/* 设置重装载寄存器值 */
	IWDG_SetReload( rlv );
	
	/* 把重装载寄存器的值放到计数器中 */
	IWDG_ReloadCounter();
	
	/* 使能 IWDG */
	IWDG_Enable();	
}

/**
  * 函数功能: 喂狗
  */
void IWDG_Feed(void)
{
	/* 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
	   当计数器的值减到0的时候会产生系统复位 */
	IWDG_ReloadCounter();
}

2.bsp_iwdg.h

#ifndef __BSP_IWDG_H__
#define	__BSP_IWDG_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>

/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void IWDG_Feed(void);
void IWDG_Config(uint8_t prv ,uint16_t rlv);

#endif /* __BSP_IWDG_H__ */

3.main.c


/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/delay/delay.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/GeneralTIM/bsp_GeneralTIM.h" 
#include "bsp/wdg/bsp_iwdg.h"
/* 函数体 --------------------------------------------------------------------*/
//static uint16_t timecount;
__IO uint16_t timer_count=0;
/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{

/* 初始化板载LED灯 */
  LED_GPIO_Init();
  
  /* 初始化按键 */  
  KEY_GPIO_Init();
  Delay(1000);
  
/* IWDG 1s 超时溢出 */ 
IWDG_Config(IWDG_Prescaler_64 ,625); 
  
  LED1_OFF;
  LED2_OFF;
  LED3_OFF;

  while (1)
  {	
		KEY_lwdg();
    }

}

四、实验效果

独立看门狗

结束语

本文以STM32VET6为例讲解了用STM32单片机中用IWDG(独立看门狗)来实现检测按键点灯的程序。希望对大家有所帮助!如果还有什么问题,欢迎评论区留言,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中&#xff0c;我将讨论一种称为混合模型方差分析的方差分析变体&#xff0c;也称为具有重复测量的 2 因素方差分析。…

python替换占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具&#xff0c;有一个配置文件&#xff0c;希望实现类似shell命令的&#xff0c;定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

word里面没有Acrobat选项

加载项被禁止&#xff0c;选择项里面&#xff0c;没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下&#xff0c;如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上&#xff0c;或者像蜗牛那样在墙面上悠然负重爬行&#xff0c;那会是多么神奇的一幕&#xff01;近日&#xff0c;布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

Java_Mybatis

Mybatis是一款优秀的持久层框架&#xff0c;用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据&#xff1a; 代码演示&#xff1a; UserMapper&#xff1a; Mapper //被调用时会通过动态代理自动创建实体类&#xff0c;并放入IOC容器中…

一文了解JVM面试篇(上)

Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目标类型对应的ja…

什么是TLAB?

这个得从内存申请说起。 一般而言生成对象需要向堆中的新生代申请内存空间&#xff0c;而堆又是全局共享的&#xff0c;像新生代内存又是规整的&#xff0c;是通过一个指针来划分的。 内存是紧凑的&#xff0c;新对象创建指针就右移对象大小size即可&#xff0c;这叫指针加法…

Linux 的权限

目录 Linux 的用户 root 用户 和 普通用户 如何新建普通用户&#xff1f; 如何切换用户&#xff1f; 一开始是以 root 用户登录&#xff1a; 一开始以普通用户登录&#xff1a; 如何删除用户&#xff1f; Linux文件权限 什么是读权限&#xff08; r &#xff09;&#…

数据结构学习笔记

1. 数组 (Array) 定义 数组是一种线性数据结构&#xff0c;用于存储固定大小的相同类型元素集合。每个元素都有一个索引&#xff0c;用于快速访问。 特点 优点&#xff1a;访问速度快&#xff0c;通过索引直接访问O(1)时间复杂度。缺点&#xff1a;大小固定&#xff0c;插入…

Unity 自定义房间布局系统 设计与实现一个灵活的房间放置系统 ——自定义房间区域功能

自定义房间区域功能 效果&#xff1a; 功能&#xff1a; 能够自定义房间的大小一键生成放置区域可控的放置网格点当物体放置到区域内可自动吸附物体是否可放置&#xff0c;放置时如果与其他物体交叉则不可放置&#xff08;纯算法计算&#xff09;管理房间内的物体&#xff0c…

MySQL(二)-基础操作

一、约束 有时候&#xff0c;数据库中数据是有约束的&#xff0c;比如 性别列&#xff0c;你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话&#xff0c;肯定是不行的&#xff0c;人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求&#xff01; 约…

下载HF AutoTrain 模型的配置文件

下载HF AutoTrain 模型的配置文件 一.在huggingface上创建AutoTrain项目二.通过HF用户名和autotrain项目名,拼接以下url,下载模型列表(json格式)到指定目录三.解析上面的json文件、去重、批量下载模型配置文件(权重以外的文件) 一.在huggingface上创建AutoTrain项目 二.通过HF用…

电脑没电关机,wsl和docker又挂了,附解决过程

如题&#xff0c;开了个会没带笔记本电源&#xff0c;点啊弄关机后docker打不开&#xff0c;我以为是docker坏了&#xff0c;结果docker报错&#xff1a; An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

植被变化趋势线性回归以及可视化

目录 植被变化线性回归ee.Reducer.linearFit().reduce()案例:天水市2004-2023年EVI线性回归趋势在该图中,使用了从红色到蓝色的渐变来表示负趋势到正趋势。红色代表在某段时间中,植被覆盖减少,绿色表示持平,蓝色表示植被覆盖增加。 植被变化线性回归 该部分参考Google…

Java(十一)---String类型

文章目录 前言1.String类的重要性2.常用方法2.1.字符串的创建2.2.字符串的比较2.2.1.比较是否引用同一个对象2.2.2.boolean equals(Object anObject) 方法&#xff1a;2.2.3.int CompareTo(String s)2.2.4.int compareToIgnoreCase(String str) 方法&#xff1a; 2.3.字符串的查…

单调栈原理+练习

首先用一道题引出单调栈 码蹄集 (matiji.net) 首先画一个图演示山的情况&#xff1a; 最暴力的做法自然是O(n方)的双循环遍历&#xff0c;这么做的思想是求出当前山右侧有多少座比它小的山&#xff0c;遇见第一个高度大于等于它的就停止。 但是对于我们所求的答案数&#xff…

能不能接受这些坑?买电车前一定要看

图片来源&#xff1a;汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我&#xff0c;买了电车后感觉被骗了&#xff0c; 很多“坑”都是他买车后才知道的。 不提前研究&#xff0c;不做功课&#xff0c;放着我这个老司机不请教&#xff0c; 这个大冤种他不当谁当&…

C# WinForm —— 25 ProgressBar 介绍与使用

1. 简介 用于显示某个操作的进度 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 pbar 开头ContextMenuStrip右键菜单Enabled控件是否可用ForeColor用于显示进度的颜色MarqueeAnimationSpeed进度条动画更新的速度&#xff0c;以毫秒为单位M…