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

STM32CubeMX教程24 WDG - 独立窗口看门狗的更多相关文章

  1. 嵌入式02 STM32 实验09 独立/窗口看门狗

    一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂 ...

  2. STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示

    一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料:             ...

  3. STM32之独立看门狗与窗口看门狗总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  4. stm8的独立看门狗与窗口看门狗

    STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数 ...

  5. STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  6. STM8S103之独立看门狗和窗口看门狗

    独立看门狗时钟来源为LSI:窗口看门狗时钟来源为CPU: 窗口看门狗窗口的含义是:喂狗必须在一定的窗口期内完成,不能过早也不能过晚. 总结:防止程序复位,用独立看门狗. 独立看门狗使用的流程:参见库函 ...

  7. 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列

    第35章     WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  8. STM32F103ZET6窗口看门狗

    1.WWDG简介 窗口看门狗(WWDG)通常被用来检测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障. WWDG是一个不断往下递减的计数器.当WWDG的计数器递减到固定 ...

  9. stm32 窗口看门狗学习(一)

    什么是窗口看门狗? 1)独立看门狗                限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗               之所以称为窗口就是因为其 ...

  10. stm32 窗口看门狗 WWDG

    窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,产生一个MCU复位,这个值叫窗口的下限,是固定的值,不能改变 窗口看门狗(WW ...

随机推荐

  1. 云图说 | 华为云医疗智能体智联大健康:AI医学影像

    摘要:华为云医疗智能体面向医学影像领域,提供影像智能标注.算法开发和AI辅助诊断服务. 本文分享自华为云社区<[云图说]第208期 医疗智能体 智联大健康:AI医学影像>,原文作者:阅识风 ...

  2. 应用开发专家一席谈:开发低代码,上手低门槛,AppCube使能Citizen Developer,人人都是开发者

    摘要:让不确定因子变为确定性因子,把复杂留给平台,简单留给开发者,是软件开发效率改进一直努力的方向,也是低代码理念的来源. 本文分享自华为云社区<应用开发专家一席谈:开发低代码,上手低门槛,Ap ...

  3. iOS App 上架流程图文教学

    在上架 App 之前必须先准备好开发者帐号,但申请开发者帐号因法兰克早在之前已经申请好了,故就跳过此步骤,直接从产生凭证到上传 App 开始讲起.首先,要将自己辛苦写好的 App 送审的话,则要依序做 ...

  4. k8s-部署 Kubernetes 集群(kubeadm方式)

    一 机器准备 IP 主机名 角色 配置 安装组件 192.168.198.150 master-1 master 2U2G master组件 etcd kubectl 192.168.198.151 ...

  5. CMake 禁用 MSVC 编译警告 C4819

    warning C4819:该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失 if (win32) add_complie_options(/W4 ...

  6. The 18th Zhejiang Provincial Collegiate Programming Contest 补题记录(ACFGJLM)

    补题链接:Here A. League of Legends 签到题,求和判断即可 ll suma, sumb; void solve() { ll x; for (int i = 1; i < ...

  7. 将Sublime Text打造为轻量级的C++ IDE

    本文较为详细地介绍了在Windows系统下,如何配置Sublime Text的C++编译运行环境.目前实现了了可以在Sublime Text按下快捷键后,调出CMD或者终端来运行C/C++程序,从而解 ...

  8. L3-008 喊山 (30 分) (BFS)

    喊山,是人双手围在嘴边成喇叭状,对着远方高山发出"喂-喂喂-喂喂喂--"的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的"讯号",达 ...

  9. 五、java操作redis

    系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis --demo主方法 package com. ...

  10. C#设计模式10——外观模式的写法

    什么是外观模式? 外观模式(Facade Pattern)又称门面模式,是一种结构型设计模式,它提供了一个统一的接口,用来访问一个子系统中一群功能相关联的接口.外观模式定义了一个高层接口,让子系统更容 ...