STM32 CubeMX 看门狗

2023-05-16

文章目录

  • 看门狗
  • STM32的内置看门狗
  • WWDG-窗口看门狗
  • CubeMX操作步骤
  • 1)使能 WWDG时钟
  • 2)设置窗口值 ,分频数 和计数器初始值
  • 3)开启 WWDG
  • 4)使能中断通道并配置优先级(如果开启了 WWDG中断)
  • 5) 编写中断服务函数
  • 6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_WakeupCallback
  • 结果

看门狗

在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)

简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,

如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)

STM32的内置看门狗

STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。

  • 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
  • 窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

在这里插入图片描述

WWDG-窗口看门狗

窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0x3F 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。

窗口看门狗之所以称为窗口,就是因为其喂狗时间是在一个有上下限的范围内(计数器减到某个值~计数器减到0x3F),在这个范围内才可以喂狗,可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)

在这里插入图片描述

  1. 计数器的初始值
  2. 是我们设置的上窗口(W[6:0]值
  3. 是下窗口值(0x3F)

CubeMX操作步骤

1 选择窗口看门狗
2 选中Activated
3 设置分频值psc、窗口寄存器的值window value、递减计数器刷新值counter
4 还有最后的中断提前唤醒Enable
在这里插入图片描述
在这里插入图片描述

1)使能 WWDG时钟

WWDG不同于 IWDG IWDG有自己独立的 32Khz时钟,不存在使能问题。而 W WDG使用的是 PCLK1的时钟,需要先使能时钟 。方法是 : __HAL_RCC_WWDG_CLK_ENABLE(); //使能窗口看门狗时钟

2)设置窗口值 ,分频数 和计数器初始值

在HAL库中,这三个值都是通过函数 HAL_WWDG_Init来设置的。该函数声明如下:

HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);

该函数只有一个入口参数,就是WWDG_HandleTypeDef结构体类型指针变量。这里我们来看看 WWDG_HandleTypeDef结构体定义:

typedef struct { WWDG_TypeDef *Instance; WWDG_InitTypeDef Init; HAL_LockTypeDef Lock; __IO HAL_WWDG_StateTypeDef State; }WWDG_HandleTypeDef;

该结构体和前面我们讲解的WWDG_HandleTypeDef类似,这里我们就主要讲解成员变量Init,它是 WWDG_InitTypeDef结构体类型,该结构体定义如下:

typedef struct { uint32_t Prescaler; //预分频系数
uint32_t Window; //窗口值
uint32_t Counter; //计数器值
}WWDG_InitTypeDef;

该结构体有3三个成员变量,分别用来设置 WWDG的预分频系数,窗口之以及计数器值。

函数 HAL_WWDG_Init的使用范例如下:

WWDG_HandleTypeDef WWDG_Handler; //窗口 看门狗句柄

WWDG_Handler.Instance=WWDG; //窗口看门狗
WWDG_Handler.Init.Prescaler=WWDG_PRESCALER_8; //设置分频系数为 8 
WWDG_Handler.Init.Window=0X5F; //设置窗口值 0X5F 
WWDG_Handler.Init.Counter=0x7F; //设置计数器值 0x7F 
HAL_WWDG_Init(&WWDG_Handler); //初始化 WWDG

3)开启 WWDG

HAL库中开启 WWDG的函数有两个:

HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg); HAL_StatusTypeDef 

HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);

函数 HAL_WWDG_Start仅仅只是用来开启 WWDG,而函数 HAL_WWDG_Start_IT除了
启动 WWDG,还同时启动 WWDG中断。

4)使能中断通道并配置优先级(如果开启了 WWDG中断)

这一步相信大家已经非常熟悉了,我们这里仅仅列出两行实现代码,如下:

HAL_NVIC_SetPriority(WWDG_IRQn,2,3); //抢占优先级 2,子优先级为 3 
HAL_NVIC_EnableIRQ(WWDG_IRQn); //使能窗口看门狗中断

这里大家要注意,跟串口一样, HAL库同样为看门狗提供了 MSP回调函数HAL_WWDG_MspInit,一般情况下,步骤 1和步骤 4的步骤,是与 MCU相关的,我们均放在该回调函数中。 关于 MSP回调函数的使用方法,前面多次讲解,这里我们就不累赘了。

5) 编写中断服务函数

在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF位清空。窗口看门狗中断服务函数为:

void WWDG_IRQHandler(void);

在HAL库中,喂狗函数为:

HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t cnt);

WWDG的喂狗操作实际就是往 CR寄存器重写计数器值,这里的第二个入口函数就是重写的计数器的值。

6) 重写窗口看门狗唤醒中断处理回调函数 HAL_WWDG_WakeupCallback

跟串口和外部中断 一样, 首先, HAL库定义了一个中断处理共用函数HAL_WWDG_IRQHandler,我们在 WWDG中断服务函数中会调用该函数。同时该函数内部,会经过一系列判断,最后调用回调函数 HAL_WWDG_WakeupCallback,所以提前唤醒中断逻辑我们一般些在回调函数 HAL_WWDG_WakeupCallback中。 回调函数声明为:

void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg);

完成了以上6个步骤之后,我们就可以使用 STM32F4的窗口看门狗了。

结果

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 CubeMX 看门狗 的相关文章

随机推荐

  • 内存飞踩问题的几点思考

    1 程序编译 xff0c 链接后生成二进制可执行程序 二进制可执行文件以elf格式实现排列 可以通过readelf S xxxx查看具体section的划分 xff0c 粗略划分如下图所示 在这些section中 xff0c 代码段是只读的
  • CFS调度算法

    1 CFS调度算法 xff0c 顾名思义就是完全公平调度策略 比方说 xff0c 调度延迟时间是10ms xff0c 存在两个进程A和B xff0c 那么两个进程分别占用CPU的时间是5ms 然而 xff0c 阶级总是存在的 xff0c 毕
  • ARM处理器的异常模式

    1 ARM处理器有各种异常模式 xff0c 用于应对ARM出现的不同状态 出现异常时 xff0c 会随即进入相关的异常向量 xff0c 同时CPSR的寄存器也会设置成具体的模式 例 xff1a 当出现中断时 xff0c 不管是哪种中断 xf
  • 内核态和用户态相关的内存泄漏

    应用程序通过系统调用进入内核态代码 假如内核态代码存在内存泄漏 xff0c 此内存泄漏属于内核态还是用户态 xff1f 查看内核态和用户态的统计信息
  • 为什么在telnet登入界面下没有日志输出?

    1 每个进程的输入输出导向目标都可以在进程号下的fd软链接上查看 如 569号进程的输出目标是 dev console xff0c 即串口 其中0是标准输入 xff0c 1是标准输出 xff0c 2是标准错误输出 2 因此我们只需要查看te
  • 【无标题】

    1 将虚拟地址传入到内核态 xff0c 借助内核态中mm struct结构体的pgd页表基地址成员 xff0c 经过查页表的方式最终获取到物理地址 这种方法虽然很直观 xff0c 但是一会内核态 xff0c 一会用户态 xff0c 操作起来
  • C#串口=>发送和接收

    作用 xff1a 串口发送命令后 xff0c 等待下位机应答帧 代码 xff1a 一旦读取到数据就立即返回给上层 public string TXandRX byte buffer string data 发送 RS485专用 start
  • kprobe功能的代码实现

    1 可以借助 sys kernel debug tracing目录下的文件 xff0c linux提供了kprobes功能 xff0c 抓取内核函数中的入参和返回值 kprobes xff0c 强大的调试工具 sydyh43的博客 CSDN
  • 上位机使用C++通过ADS协议与倍福PLC通信例程-通过变量名方式读写浮点数

    前言 建议初学者先看这一章节内容 xff0c 里面包括一些基础的环境配置和项目建立流程 xff0c 以后开发项目这些流程是通用的 xff0c 务必掌握并熟练 链接 上位机使用C 43 43 通过ADS协议与倍福PLC通信例程 布尔变量的读取
  • 弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)

    下面通过485半双工的通信过程 xff0c 记录USART串口的几个使能位 标志位 说明 xff1a USART IT TC 和 USART IT RXNE是一个常量 xff0c 并不代表 xff08 TC RXNE 这两位 define
  • 机器人视觉检测+跟踪:行人跟随过程中对目标提取特征+匹配

    今天上午也是没有很大的成效 xff0c 一直到下午睡醒 xff08 论好的睡眠的重要性 xff09 xff0c 在一篇帖子中看到一种新的写法 xff0c opencv3将IplImage转换为Mat格式的写法 xff0c 在我们的代码中采用
  • ubuntu firefox打不开网页

    检查ubuntu右上角联网开关是否打开 xff1a 需要勾选Enable Networking 如果能ping通其它主机地址 xff0c 浏览器却上不了网 xff0c 很有可能是dns域名解析的问题 查看域名配置文件 xff1a cat e
  • Java如何利用JNI调用C++(简略介绍及步骤)

    Java如何利用JNI调用C 43 43 xff08 简略介绍及步骤 xff09 文章目录 Java如何利用JNI调用C 43 43 xff08 简略介绍及步骤 xff09 一 原理介绍二 详细步骤步骤一 xff1a 编写Java类步骤二
  • HttpParser解析节点遇到的不解问题

    HttpParser遇到table时 xff0c 解析时 xff0c 直接抽取th或者td xff0c thead和tbody解析或出现异常 比如 lt table gt lt thead gt lt tr gt 相关内容 lt tr gt
  • CMakeLists 理解

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退
  • sip协议之注册说明

    注册是SIP协议中重要的功能 xff0c 所谓注册 xff0c 就是用户A客户端将自己的联系地址告知服务器 xff0c 以便后续有其它用户呼叫用户A时 xff0c 服务器能够将呼叫转接到用户A SIP协议中的联系地址是指由账号 IP POR
  • 9v输入7.4v电路充电IC

    9v输入7 4v电路充电IC 两节串联的锂电池 xff0c 一般电压是7 4V xff0c 最高电压到8 4V xff0c 最低放电到6V左右 如果需要6V 8 4V降压到5V的DC DC降压芯片 xff0c 一般是用FS2953 如果需要
  • Java 和 C++ 语法之间的区别

    main 方法 Java java 的函数必须写在类里 class HelloWorld public static void main String args System out println 34 Hello World 34 复制
  • STM32串口中断接收不定长报文并解析

    文章目录 功能实现背景介绍HAL库的中断接收函数状态机的运用 功能实现背景介绍 本项目中 xff0c 需要使用STM32的USART6串口与FPGA板 xff08 下位机 xff09 通信 xff0c 需要发送和接收数据 xff0c 有报文
  • STM32 CubeMX 看门狗

    文章目录 看门狗STM32的内置看门狗WWDG 窗口看门狗CubeMX操作步骤1 xff09 使能 WWDG时钟2 xff09 设置窗口值 分频数 和计数器初始值3 xff09 开启 WWDG4 xff09 使能中断通道并配置优先级 xff