STM32CubeMX教程24 WDG - 独立窗口看门狗

这篇具有很好参考价值的文章主要介绍了STM32CubeMX教程24 WDG - 独立窗口看门狗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、准备材料

开发板(正点原子stm32f407探索者开发板V2.4)

STM32CubeMX软件(Version 6.10.0)

野火DAP仿真器

keil µVision5 IDE(MDK-Arm)

ST-LINK/V2驱动

XCOM V2.6串口助手

逻辑分析仪nanoDLA

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板的独立看门狗(IWDG)和窗口看门狗(WWDG)并了解其功能实现

3、WWDG实验流程

3.0、前提知识

STM32F407拥有两个看门狗,分别为独立看门狗和窗口看门狗,这两个看门狗的作用都是监控程序运行,程序死机或跑飞就使系统复位,值得注意的是,一旦开启看门狗就无法停止,除非系统复位

窗口看门狗的结构不复杂,其结构框图上描述了有关窗口看门狗的所有内容,首先WDG的时钟来自于PCLK1(STM32F407最高42MHz)的4096次分频后再进行可选的1/2/4/8分频,其内部有一个7位的递减计数器T[6:0],还有一个WWDG_CFR配置寄存器,该寄存器位6:0包含了用于与递减计数器进行比较的窗口值W[6:0]

当出现以下两种情况时会产生窗口看门狗复位操作

  1. 当看门狗激活(WDGA=1)且T6位由1变为0时(也即T[6:0]<0X3F时)

  2. 当看门狗激活且T[6:0]>W[6:0]时用户写WWDG_CR寄存器的值(也即刷新T[6:0]值)

如下所示为窗口看门狗逻辑框图 (注释1)

通过上述的描述,可知窗口看门狗要想不产生复位操作,必须将其计数器的计数值控制在W[6:0]和0x3F之间才能喂狗(刷新T[6:0]值),当 “计数器的值小于0x3F” 或者 “当计数器的值T[6:0]>W[6:0]时用户喂狗” 都会产生Reset操作,这也是为什么叫窗口看门狗的原因,如下图所示为窗口看门狗的工作时序图(注释1)

窗口看门狗可设置的参数只有三个

WWDG counter clockprescaler (时钟分频):可以设置为1/2/4/8分频

WWDG window value (窗口W[6:0]值):可设置范围T[6:0]~127

WWDG down-counter reload value (递减计数器重装值):可设置范围63-127(7位最大值127且不能小于0x3F)

注意本实验由于独立看门狗较为简单,所以选择将独立/窗口看门狗放在一篇文章里,但是读者复现实验的时候应该分开做,不要同时启用窗口看门狗和独立看门狗(不是不可以同时启用,而是对于本实验例子同时启用不方便理解)

另外需要提醒的是,独立/窗口看门狗只要被初始化就会自动启动,用户只需喂狗即可

3.1、CubeMX相关配置

3.1.0、工程基本配置

打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号)选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示

开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示

详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”

3.1.1、时钟树配置

由于窗口看门狗递减定时器为7位且递减到0x3F就会产生复位,因此最大计数值也才127-63=64,因此其时钟频率尽可能低一点,否则超时时间太短,实验现象不太好观察,这里将PCLK1设置为了21MHz,具体时钟配置如下图所示

3.1.2、外设参数配置

本实验需要初始化开发板上GREEN_LED和RED_LED,具体配置步骤请阅读“STM32CubeMX教程2 GPIO输出 - 点亮LED灯”

本实验需要初始化开发板上KEY2用户按键,具体配置步骤请阅读“STM32CubeMX教程3 GPIO输入 - 按键响应”

本实验需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”

单击Pinout & Configuration页面左边的System Core的WWDG进入窗口看门狗的设置,在Mode中勾选Activated,在下方配置其分频系数为8,窗口值为90,计数器重装值为最大值127,具体配置如下图所示

现在我们来计算一下窗口看门狗的超时时间

首先PCLK1设置为了21MHz,然后该时钟经过4096次分频,在经过设置的8分频得到的频率为640.869140625Hz

则其超时时间可以计算得到为(127-63)/640.869140625≈0.09986s≈99.86ms

其不允许喂狗的时间可以计算得到为(127-90)/640.869140625≈57.734ms

即当窗口定时器被初始化启动后,如果在57.734ms-100ms之间没有进行喂狗操作,那么窗口看门狗将超时导致程序复位

3.1.3、外设中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选Window watchdog interrupt全局中断,然后选择合适的中断优先级即可

3.2、生成代码

3.2.0、配置Project Manager页面

单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示

详细Project Manager配置内容读者可以阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节

3.2.1、外设初始化调用流程

在生成的工程主函数main()中调用MX_WWDG_Init()函数对WWDG参数配置,并调用了HAL_WWDG_Init()初始化函数

在HAL_WWDG_Init()函数中对WWDG做了初始化,并调用了HAL_WWDG_MspInit()函数对WWDG的时钟、中断优先级和中断使能做了配置

WWDG具体初始化调用流程如下图所示

3.2.2、外设中断调用流程

在STM32CubeMX中勾选了WWDG的中断后,会在stm32f4xx_it.c文件中出现串口看门狗中断服务函数WWDG_IRQHandler()

该中断服务函数WWDG_IRQHandler()调用了HAL库WWDG中断统一管理函数HAL_WWDG_IRQHandler()

最终在HAL_WWDG_IRQHandler()函数中调用了早期唤醒回调函数HAL_WWDG_EarlyWakeupCallback(),该函数为虚函数,需要用户重新实现

WWDG具体中断调用流程如下图所示

3.2.3、添加其他必要代码

在wwdg.c中重新实现早唤醒回调函数HAL_WWDG_EarlyWakeupCallback(),当递减计数器递减到0x40,下次递减即将产生看门狗复位时,就会进入到该早唤醒回调函数中,但是该函数只能执行一个时钟节拍,然后系统就复位了,因此该函数内部执行不了复杂的程序,笔者这里也只是输出了一个字符‘1’,源代码如下

/*早唤醒回调函数*/
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
    printf("1\r\n");
}

在主函数中初始化完毕拉低PF9引脚,主循环中延时喂狗,并闪烁GREEN_LED,当系统喂狗及时,用户就可以看到GREEN_LED闪烁,当喂狗不及时,系统反复复位,就看不到GREEN_LED闪烁

源代码如下

/*主循环外代码*/
printf("Reset\r\n");
HAL_GPIO_WritePin(RED_LED_GPIO_Port,RED_LED_Pin,GPIO_PIN_RESET);
 
 
/*主循环内代码*/
HAL_Delay(70);
//HAL_Delay(40);
HAL_WWDG_Refresh(&hwwdg);
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port,GREEN_LED_Pin);

4、常用函数

/*独立看门狗喂狗函数*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
 
/*窗口看门狗喂狗函数*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
 
/*窗口看门狗早唤醒中断回调函数*/
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)

5、烧录验证

将程序修改为延时110ms,烧录程序,单片机上电后通过串口可以发现每隔一段时间都会发生进入早唤醒中断和复位操作,此时开发板上只有RED_LED被点亮,GREEN_LED呈现熄灭状态,使用逻辑分析仪捕获PF9引脚的电平,可以发现复位间隔时间大概为99ms,与我们设置预期的99.864ms大致一致,如下图所示为串口输出数据和逻辑分析仪捕获PF9引脚电平图

使用PF9引脚的状态来判断复位时间间隔不太严谨,因此我们将WWDG的参数做修改二次测试,分频不变仍为8,窗口值修改为80,重装值修改为100,此时通过计算可知递减到63大约需要57.734ms,将程序修改为延时70ms,然后使用逻辑分析仪再次捕获PF9引脚的电平,可以发现复位间隔时间大概为57ms,经过这两次测试,可知虽然不严谨但可以验证,如下图所示为逻辑分析仪捕获的PF9引脚电平图

WWDG复原回原来参数,分频8,窗口值90,重装值127,将程序修改为延时70ms,然后烧录程序,单片机上电后通过串口可以发现不会频繁的输出复位信息,也不会进入早唤醒中断回调函数中,此时开发板上RED_LED被点亮,GREEN_LED呈现闪烁状态,证明喂狗比较及时,没有产生窗口看门狗复位

6、IWDG实验流程简述

6.0、前提知识

独立看门狗很简单,本质就是一个12位的递减计数器,当递减到0之后就产生看门狗复位操作,其时钟来源于单片机内部的LSI RC(32KHz)且不可更换,该内部RC震荡产生的时钟信号频率误差较大,因此在设置看门狗复位时间时最好留有余量,如下图所示为其时钟来源

独立看门狗可设置的参数只有两个

IWDG counter clockprescaler (时钟分频):可以设置为4/8/16/.../256分频

IWDG down-counter reload value (递减计数器重装值):可设置范围0-4095(12位)

当其重装值设置为最大值4095,根据时钟分频的不同,看门狗的超时时间也不同,最长可达32.768s,最短只有0.512s,具体超时时间如下表所示

6.1、CubeMX相关配置

只需在Pinout & Configuration页面左边功能分类栏目System Core中单击其中IWDG,在Mode中勾选Activated,最后在下方配置两个参数即可,时钟使用LSI配置不可调,IWDG无中断,具体步骤如下图所示

6.2、添加其他必要代码

程序初始化完毕后拉低PF9引脚,在主循环中实现按键响应,按下KEY2按键执行喂狗操作

源代码如下

/*主函数初始化完后将PF9引脚拉低*/
HAL_GPIO_WritePin(RED_LED_GPIO_Port,RED_LED_Pin,GPIO_PIN_RESET);
 
/*主循环中程序/
/*按键KEY2被按下*/
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
{
    HAL_Delay(50);
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
    {
        printf("Now feed the dog\r\n");
        HAL_IWDG_Refresh(&hiwdg);
        while(!HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin));
    }
}

6.3、实验现象

烧录程序,单片机上电后通过串口可以发现每隔一段时间都会发生复位操作,当按下KEY2按键在该间隔时间内喂狗,就不会产生复位操作,而一旦停止喂狗,超时后又会产生复位操作,具体如下图所示

当单片机复位后会首先执行一系列初始化操作,然后手动将PF9引脚设置为低电平(该引脚默认为高),直到由于没有喂狗产生看门狗复位为止,通过逻辑分析仪捕获PF9引脚的电平,可以发现其两次复位间隔时间与我们所设置预期的看门狗超时时间大致一致,具体如下图所示

7、注释详解

注释1:图片来源于 STM32F4xx 参考手册 RM0090文章来源地址https://www.toymoban.com/news/detail-823653.html

到了这里,关于STM32CubeMX教程24 WDG - 独立窗口看门狗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32-WDG看门狗

    目录 简介 独立看门狗  键寄存器 窗口看门狗 特点 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障,当计数器达到给定的超时值时,触发一个中断(仅适用于窗

    2024年03月15日
    浏览(73)
  • STM32--WDG看门狗

    WDG看门狗(Watchdog Timer)是一种常见的硬件设备,在STM32F10系列中,有两种看门狗,分别是独立看门狗和窗口看门狗,可以 用来监测系统的运行状态,并在系统出现故障或停止运行时采取相应措施 ,以确保系统的稳定性和可靠性。 WDG看门狗一般采用一个 计时器 和一个 喂狗机

    2024年02月08日
    浏览(69)
  • STM32F4X 独立看门狗 IWDG

    我们都知道,当一个嵌入式在运行过程中发生死机或者程序跑飞的情况的时候,我们一般都是要手动进行开关机或者复位,让程序能够重新运行。但是当一个嵌入式系统被安装到一些特殊位置时,如果发生了死机又不能及时进行手动复位,这时候就需要看门狗了。看门狗的作

    2024年02月11日
    浏览(65)
  • STM32---IWDG(独立看门狗),超详细,小白入

    写在前面 :本节我们学习STM32中一个很有趣的东西——看门狗,其实在我上大学的时候,当时还没有系统学习STM32的时候,就听到过看门狗这个词语,当时老师上课不断在说看门狗,只是觉得很有意思。但是没有真正了解过,今天同大家一起学习看门狗的内容。看门狗并不难

    2024年01月19日
    浏览(46)
  • STM32独立看门狗IWDG和休眠(低功耗)共存那些事儿

    1.寄存器写入标志位方法为主要手段 2.看门狗初始化放在标志位判断后方 3.合理利用单片机复位,标志位复位后不会丢失的特点 4.不同系列单片机寄存器不一样 调试进入断点时不管停留多久,都不会触发看门狗 论坛TM32在休眠模式下怎么使用看门狗? 现在你只有2个办法: 1)使

    2024年02月12日
    浏览(46)
  • STM32-窗口看门狗WWDG剖析与实例

            窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位(WWDG-CR 的第六位)变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数

    2024年01月19日
    浏览(48)
  • 【STM32】基础知识 第十六课 窗口看门狗 WWDG 深入浅出

    在嵌入式开发中, 可靠性和稳定性是至关重要的. 这就是为什么许多单片机, 比如 STM32, 提供了窗口看门狗 (Window Watchdog, WWDF) 的功能. WWDG 是一种硬件定时器, 其目的在于防止软件错误导致的系统故障. WWDG 是通过监控软件运行的正常新, 并在检测到异常情况时自动重启系统, 从而

    2024年02月16日
    浏览(33)
  • 【正点原子STM32连载】第十五章 窗口看门狗实验 摘自【正点原子】APM32F407最小系统板使用指南

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 本章介绍APM32F407窗口看门狗(WWDT)的使用,窗口看门狗与独立看门狗一样能够帮助CPU在进入错误状

    2024年02月12日
    浏览(43)
  • STM32软件模拟实现IIC写入和读取AT24C02(STM32CubeMx配置)

    IIC:Inter Integrated Circuit,集成电路总线,是一种 同步 串行 半双工 通信总线。 在使用IIC时分为硬件IIC以及软件IIC,下图为两者的区别: 在使用IIC前先来了解一下IIC总线结构图,即下图: 从图中可以看出IIC有两个双向信号线,一根是数据线SDA,一根是时钟线SCL,并且都接上拉

    2024年02月04日
    浏览(58)
  • HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备

    编码电机测速 HAL库版 0.96\\\'OLED的使用 HAL库版STM32双轮自平衡车(一) ———代码思路和PID的简单介绍 HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备 HAL库版STM32双轮自平衡车(三) ———代码精讲 HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

    2024年02月05日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包