【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录

文章目录

    • 00. 目录
    • 01. WDG概述
    • 02. 独立看门狗相关API
      • 2.1 IWDG_WriteAccessCmd
      • 2.2 IWDG_SetPrescaler
      • 2.3 IWDG_SetReload
      • 2.4 IWDG_ReloadCounter
      • 2.5 IWDG_Enable
      • 2.6 IWDG_GetFlagStatus
      • 2.7 RCC_GetFlagStatus
    • 03. 独立看门狗接线图
    • 04. 独立看门狗程序示例1
    • 05. 独立看门狗程序示例2
    • 06. 窗口看门狗相关API
      • 6.1 WWDG_DeInit
      • 6.2 WWDG_SetPrescaler
      • 6.3 WWDG_SetWindowValue
      • 6.4 WWDG_EnableIT
      • 6.5 WWDG_SetCounter
      • 6.6 WWDG_Enable
      • 6.7 WWDG_GetFlagStatus
      • 6.8 WWDG_ClearFlag
    • 07. 窗口看门狗接线图
    • 08. 窗口看门狗程序示例
    • 09. 程序示例代码下载
    • 10. 附录

01. WDG概述

  • WDG(Watchdog)看门狗

  • 看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性

  • 看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计数器)操作时,看门狗硬件电路就自动产生复位信号

  • STM32内置两个看门狗

独立看门狗(IWDG):独立工作,对时间精度要求较低

窗口看门狗(WWDG):要求看门狗在精确计时窗口起作用

02. 独立看门狗相关API

2.1 IWDG_WriteAccessCmd

/*** @brief  Enables or disables write access to IWDG_PR and IWDG_RLR registers.* @param  IWDG_WriteAccess: new state of write access to IWDG_PR and IWDG_RLR registers.*   This parameter can be one of the following values:*     @arg IWDG_WriteAccess_Enable: Enable write access to IWDG_PR and IWDG_RLR registers*     @arg IWDG_WriteAccess_Disable: Disable write access to IWDG_PR and IWDG_RLR registers* @retval None*/
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)
功能:使能或者失能对寄存器 IWDG_PR 和 IWDG_RLR 的写操作
参数:IWDG_WriteAccess:对寄存器 IWDG_PR 和 IWDG_RLR 的写操作的新状态
返回值:

2.2 IWDG_SetPrescaler

/*** @brief  Sets IWDG Prescaler value.* @param  IWDG_Prescaler: specifies the IWDG Prescaler value.*   This parameter can be one of the following values:*     @arg IWDG_Prescaler_4: IWDG prescaler set to 4*     @arg IWDG_Prescaler_8: IWDG prescaler set to 8*     @arg IWDG_Prescaler_16: IWDG prescaler set to 16*     @arg IWDG_Prescaler_32: IWDG prescaler set to 32*     @arg IWDG_Prescaler_64: IWDG prescaler set to 64*     @arg IWDG_Prescaler_128: IWDG prescaler set to 128*     @arg IWDG_Prescaler_256: IWDG prescaler set to 256* @retval None*/
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)
功能:设置 IWDG 预分频值
参数:IWDG_Prescaler:IWDG 预分频值
返回值:

2.3 IWDG_SetReload

/*** @brief  Sets IWDG Reload value.* @param  Reload: specifies the IWDG Reload value.*   This parameter must be a number between 0 and 0x0FFF.* @retval None*/
void IWDG_SetReload(uint16_t Reload)
功能:设置 IWDG 重装载值
参数:IWDG_Reload:IWDG 重装载值
返回值:

2.4 IWDG_ReloadCounter

/*** @brief  Reloads IWDG counter with value defined in the reload register*   (write access to IWDG_PR and IWDG_RLR registers disabled).* @param  None* @retval None*/
void IWDG_ReloadCounter(void)
功能:按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
参数:无
返回值:

2.5 IWDG_Enable

/*** @brief  Enables IWDG (write access to IWDG_PR and IWDG_RLR registers disabled).* @param  None* @retval None*/
void IWDG_Enable(void)
功能:使能 IWDG
参数:无
返回值:

2.6 IWDG_GetFlagStatus

/*** @brief  Checks whether the specified IWDG flag is set or not.* @param  IWDG_FLAG: specifies the flag to check.*   This parameter can be one of the following values:*     @arg IWDG_FLAG_PVU: Prescaler Value Update on going*     @arg IWDG_FLAG_RVU: Reload Value Update on going* @retval The new state of IWDG_FLAG (SET or RESET).*/
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG)
功能:检查指定的 IWDG 标志位被设置与否
参数:IWDG_FLAG:待检查的 I2C 标志位
返回值:IWDG_FLAG 的新状态(SET 或者 RESET)       

2.7 RCC_GetFlagStatus

/*** @brief  Checks whether the specified RCC flag is set or not.* @param  RCC_FLAG: specifies the flag to check.*   *   For @b STM32_Connectivity_line_devices, this parameter can be one of the*   following values:*     @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready*     @arg RCC_FLAG_HSERDY: HSE oscillator clock ready*     @arg RCC_FLAG_PLLRDY: PLL clock ready*     @arg RCC_FLAG_PLL2RDY: PLL2 clock ready      *     @arg RCC_FLAG_PLL3RDY: PLL3 clock ready                           *     @arg RCC_FLAG_LSERDY: LSE oscillator clock ready*     @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready*     @arg RCC_FLAG_PINRST: Pin reset*     @arg RCC_FLAG_PORRST: POR/PDR reset*     @arg RCC_FLAG_SFTRST: Software reset*     @arg RCC_FLAG_IWDGRST: Independent Watchdog reset*     @arg RCC_FLAG_WWDGRST: Window Watchdog reset*     @arg RCC_FLAG_LPWRRST: Low Power reset* *   For @b other_STM32_devices, this parameter can be one of the following values:        *     @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready*     @arg RCC_FLAG_HSERDY: HSE oscillator clock ready*     @arg RCC_FLAG_PLLRDY: PLL clock ready*     @arg RCC_FLAG_LSERDY: LSE oscillator clock ready*     @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready*     @arg RCC_FLAG_PINRST: Pin reset*     @arg RCC_FLAG_PORRST: POR/PDR reset*     @arg RCC_FLAG_SFTRST: Software reset*     @arg RCC_FLAG_IWDGRST: Independent Watchdog reset*     @arg RCC_FLAG_WWDGRST: Window Watchdog reset*     @arg RCC_FLAG_LPWRRST: Low Power reset*   * @retval The new state of RCC_FLAG (SET or RESET).*/
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
功能:检查指定的 RCC 标志位设置与否
参数:RCC_FLAG:待检查的 RCC 标志位
返回值:RCC_FLAG 的新状态(SET 或者 RESET)   

03. 独立看门狗接线图

在这里插入图片描述

04. 独立看门狗程序示例1

main.c

#include "stm32f10x.h"#include "delay.h"
#include "oled.h"int main(void){	//初始化OLED_Init();OLED_ShowString(1, 1, "IWDG TEST");if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET){OLED_ShowString(2, 1, "IWDGRST");delay_ms(500);OLED_ShowString(2, 1, "       ");delay_ms(100); RCC_ClearFlag();}else{OLED_ShowString(3, 1, "RST");delay_ms(500);OLED_ShowString(3, 1, "       ");delay_ms(100); }//写使能IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//设置预分频IWDG_SetPrescaler(IWDG_Prescaler_16);//设置重装载值  1000 = 1 / 40K * 16 * x   x = 2500IWDG_SetReload(2499);//喂狗IWDG_ReloadCounter();//看门狗使能IWDG_Enable();while(1){//喂狗IWDG_ReloadCounter();delay_ms(1800);}return 0;}

05. 独立看门狗程序示例2

main.c

#include "stm32f10x.h"#include "delay.h"
#include "oled.h"
#include "key.h"int main(void){	//初始化OLED_Init();//按键初始化key_init();OLED_ShowString(1, 1, "IWDG TEST");if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET){OLED_ShowString(2, 1, "IWDGRST");delay_ms(500);OLED_ShowString(2, 1, "       ");delay_ms(100); RCC_ClearFlag();}else{OLED_ShowString(3, 1, "RST");delay_ms(500);OLED_ShowString(3, 1, "   ");delay_ms(100); }//写使能IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//设置预分频IWDG_SetPrescaler(IWDG_Prescaler_16);//设置重装载值  1000 = 1 / 40K * 16 * x   x = 2500IWDG_SetReload(2499);//喂狗IWDG_ReloadCounter();//看门狗使能IWDG_Enable();while(1){key_scan();//喂狗IWDG_ReloadCounter();OLED_ShowString(4, 1, "FEED");delay_ms(200);OLED_ShowString(4, 1, "    ");delay_ms(600); }return 0;}

06. 窗口看门狗相关API

6.1 WWDG_DeInit

/*** @brief  Deinitializes the WWDG peripheral registers to their default reset values.* @param  None* @retval None*/
void WWDG_DeInit(void)
功能:将外设 WWDG 寄存器重设为缺省值
参数:无
返回值:

6.2 WWDG_SetPrescaler

/*** @brief  Sets the WWDG Prescaler.* @param  WWDG_Prescaler: specifies the WWDG Prescaler.*   This parameter can be one of the following values:*     @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1*     @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2*     @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4*     @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8* @retval None*/
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)
功能:设置 WWDG 预分频值值
参数:WWDG_Prescaler:指定 WWDG 预分频
返回值:

6.3 WWDG_SetWindowValue

/*** @brief  Sets the WWDG window value.* @param  WindowValue: specifies the window value to be compared to the downcounter.*   This parameter value must be lower than 0x80.* @retval None*/
void WWDG_SetWindowValue(uint8_t WindowValue)
功能:设置 WWDG 窗口值
参数:WindowValue r:指定的窗口值。该参数取值必须在 0x400x7F 之间。
返回值:

6.4 WWDG_EnableIT

/*** @brief  Enables the WWDG Early Wakeup interrupt(EWI).* @param  None* @retval None*/
void WWDG_EnableIT(void)
功能:使能 WWDG 早期唤醒中断(EWI)
参数:无
返回值:

6.5 WWDG_SetCounter

/*** @brief  Sets the WWDG counter value.* @param  Counter: specifies the watchdog counter value.*   This parameter must be a number between 0x40 and 0x7F.* @retval None*/
void WWDG_SetCounter(uint8_t Counter)
功能:设置 WWDG 计数器值
参数:Counter:指定看门狗计数器值。该参数取值必须在 0x400x7F 之间。
返回值:

6.6 WWDG_Enable

/*** @brief  Enables WWDG and load the counter value.                  * @param  Counter: specifies the watchdog counter value.*   This parameter must be a number between 0x40 and 0x7F.* @retval None*/
void WWDG_Enable(uint8_t Counter)
功能:使能 WWDG 并装入计数器值
参数:Counter:指定看门狗计数器值。该参数取值必须在 0x400x7F 之间。
返回值:

6.7 WWDG_GetFlagStatus

/*** @brief  Checks whether the Early Wakeup interrupt flag is set or not.* @param  None* @retval The new state of the Early Wakeup interrupt flag (SET or RESET)*/
FlagStatus WWDG_GetFlagStatus(void)
功能:检查 WWDG 早期唤醒中断标志位被设置与否
参数:无
返回值:早期唤醒中断标志位的新状态(SET 或者 RESET)      

6.8 WWDG_ClearFlag

/*** @brief  Clears Early Wakeup interrupt flag.* @param  None* @retval None*/
void WWDG_ClearFlag(void)
功能:清除早期唤醒中断标志位
参数:无
返回值:

07. 窗口看门狗接线图

在这里插入图片描述

08. 窗口看门狗程序示例

main.c

#include "stm32f10x.h"#include "delay.h"
#include "oled.h"
#include "key.h"int main(void){	//初始化OLED_Init();//按键初始化key_init();//开启WWDG时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);OLED_ShowString(1, 1, "WWDG TEST");if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET){OLED_ShowString(2, 1, "WWDGRST");delay_ms(500);OLED_ShowString(2, 1, "       ");delay_ms(100); RCC_ClearFlag();}else{OLED_ShowString(3, 1, "RST");delay_ms(500);OLED_ShowString(3, 1, "   ");delay_ms(100); }//设置预分频WWDG_SetPrescaler(WWDG_Prescaler_8);//设置窗口值WWDG_SetWindowValue(21 | 0x40);//使能看门狗WWDG_Enable(0x40 | 54);while(1){key_scan();OLED_ShowString(4, 1, "FEED");delay_ms(10);OLED_ShowString(4, 1, "    ");delay_ms(10); //喂狗WWDG_SetCounter(0x40 | 54);}return 0;}

09. 程序示例代码下载

38-独立看门狗.rar

39-窗口看门狗.rar

10. 附录

参考: 【STM32】江科大STM32学习笔记汇总

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

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

相关文章

简单排列组合题(python版)

文章预览: 题目解法一输出结果 解法二输出结果输出结果 题目 有四个数字:1,2,3,4能组成多少个互不相同且无重复的数字的三位数? 各式多少? 解法一 我们粗略看一下这个题既然我们要组成三位数,那我们就循环3层每一层出一个数,并且if语句判…

OD(12)之Mermaid思维导图(Mindmap)

OD(12)之Mermaid思维导图(Mindmap)使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool…

postman传参与返回值切换为左右显示的操作

目录 第一步 点击“Settings”,在下拉框选择“Settings” 第二步 在默认打开的General页面,参照下图改动两处 第一步 点击“Settings”,在下拉框选择“Settings” 第二步 在默认打开的General页面,参照下图改动两处 附上修改后…

字符串函数strstr()详解

一、strstr()函数的作用 字符串函数 strstr() 是 C 语言的一个标准库函数,它的作用是在一个字符串中查找给定字符串的第一个匹配之处,并返回指向该字符串的指针。如果没有找到该字符串,则返回 NULL。1 二、strstr()函数的原型和参数 strst…

c语言求奇数分之一序列前N项和

本题要求编写程序,计算序列 1 1/3 1/5 ... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。 输入样例: 23输出样例: …

opencv中的rgb转gray的计算方法

转换原理 在opencv中,可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下, import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队

本系列文章跟随《MetaGPT多智能体课程》(https://github.com/datawhalechina/hugging-multi-agent),深入理解并实践多智能体系统的开发。 本文为该课程的第四章(多智能体开发)的第二篇笔记。主要是对MetaGPT中Team组件…

【Django】执行查询—检索对象

检索对象 检索全部对象 >>> all_entries Entry.objects.all()通过过滤器检索指定对象 通过添加过滤条件精炼原始 QuerySet。两种最常见的精炼 QuerySet 的方式是: filter(**kwargs) 返回一个新的 QuerySet,包含的对象满足给定查询参数。 ex…

【Tomcat】在 linux 上实现 Catlina.log 自动分割,防止文件过大

背景描述 catalina.out即标准输出和标准出错,所有输出到这两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,所以我们需要借助其他工具进行切割&…

MySQL:快照读和当前读

mysql读取数据实际上有两种读取模式:当前读和快照读 快照读:快照读的执行方式是生成 ReadView,直接利用 MVCC 机制来进行读取,并不会对记录进行加锁。当前读:每次读取的都是当前最新的数据,但是读的时候不…

剑指offer面试题22 栈的压入弹出序列

考察点 辅助栈知识点 题目 分析 这道题目要求输入俩个序列,第一个序列表示栈的压入顺序,要求判断第二个序列是否是该栈的弹出顺序。遇到这类题目思维一定要往辅助栈上靠,因为关于栈的考点其实就是这个。这种题目的解题思路就是归纳&#x…

「Python系列」Python pyecharts模块

文章目录 一、pyecharts安装二、pyecharts应用三、pyecharts图表类型四、pyecharts特点与功能特点:功能: 五、相关链接 一、pyecharts安装 要安装 Python 的 pyecharts 模块,你可以使用 pip,这是 Python 的包管理工具。请按照以下…

Payment Without Change

题目链接&#xff1a;Problem - 1256A - Codeforces 解题思路&#xff1a; 题目的大致意思就是手中的硬币数拿出若干枚正好等于s&#xff0c;分三种情况 .如果n > s && b < s,输出no .如果b > s,输出yes .如果n * (a < (s / n) ? a : (s / n)) b >…

数据结构(C语言版)02---链表

链表&#xff1a; 声明&#xff1a;LNode* LinkList在链表里面这两个是等价的; #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct LNode{Elemtype data;struct LNode* next; }LNode,*LinkList; 链表打印函数&#xff1a; //打印v…

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享&#xff0c;但开发者需要自行负责并确保AR场景的完整性&#xff0c;自行负责虚拟物体的创建与销毁。为简化同步操作&#xff0c;RealityKit 内建了同步机制&#xff0c;RealityKit 同步机制基于 Multipeer Connectivi…

Python标准库sys常用函数、方法及代码实战解析【第108篇—标准库sys常用函数】

Python标准库sys常用函数、方法及代码实战解析 在Python的标准库中&#xff0c;sys 模块是一个常用而强大的工具&#xff0c;它提供了与Python解释器交互的函数和变量。本文将介绍sys模块的一些常用函数和方法&#xff0c;并通过实际的代码实例来解析它们的用法。 1. sys.argv…

C语言统计文件夹下所有文件数量/C语言删除文件夹下所有文件

代码解法不唯一&#xff0c;欢迎在评论区留下你的实现方式和想法&#xff0c;我会将好的解法更新到文章中&#xff01;&#xff01; 在C语言中&#xff0c;可以使用标准库中的函数来完成对文件夹中文件数量的判断和删除操作。下面是使用POSIX标准的代码示例&#xff0c;这段代…

Kafka是如何防止消息丢失的

Kafka通过一系列机制来防止消息丢失&#xff0c;主要包括以下几个方面&#xff1a; 生产者端&#xff08;Producer&#xff09;保证&#xff1a; 同步发送&#xff1a;生产者默认是异步发送消息的&#xff0c;但如果希望保证消息不丢失&#xff0c;可以选择将异步发送改为同步…

2024.2.19

1.TCP模型 服务器端 #include <myhead.h> #define SER_IP "192.168.199.129" #define SER_PORT 8899int main(int argc, const char *argv[]) {//1.创建用于连接的套接字文件int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket error"…

P1331 海战

难度&#xff1a;普及- 题目背景 在峰会期间&#xff0c;武装部队得处于高度戒备。警察将监视每一条大街&#xff0c;军队将保卫建筑物&#xff0c;领空将布满了 F-2003 飞机。 此外&#xff0c;巡洋船只和舰队将被派去保护海岸线。不幸的是&#xff0c;因为种种原因&#x…