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的天使开发者疯狂打call

    摘要:2020年初新冠突发,在这场抗疫的战斗中,让我们深刻体会到,疫情与每一个人息息相关.有这样一群来自华中科技大学的师生项目团队,他们利用AI技术,助力全球抗疫,他们是怎么做的呢?让我们一起来看看吧 ...

  2. 开源遇上华为云——DataX for HuaweiCloud OBS

    摘要:欢迎越来越多的开发者加入,与华为云一起不断成长,繁荣开源生态. 本文分享自华为云社区<开源遇上华为云--DataX for HuaweiCloud OBS>,作者:华为云社区精选. ...

  3. 华为云企业级Redis:助力VMALL打造先进特征平台

    摘要:当电商平台对AI算法模型的需求越来越多,特征数据平台的统一建设是不少开发团队头疼的事情.因为只有通过统一的特征数据存储,才能改变原有的"数据孤岛",解决生产重复造轮子的窘境. ...

  4. that the pod didn't tolerate, 2 Insufficient cpu.

    K8S Pod 一直处于 Pending 状态 有几个原因可以阻止 Pod 运行,但我们将描述三个主要问题: 调度问题:无法在任何节点上调度 Pod. 镜像问题:下载容器镜像时出现问题. 依赖性问题: ...

  5. 【python爬虫】 request模块介绍 http协议版本区别 双token认证 携带cookie的两种方式 requests.session的使用 post请求携带数据编码格式 request.text编码问题 下载图片,视频

    目录 上节回顾 今日内容 1 爬虫介绍 2 request模块介绍 3 request发送get请求 4 request携带参数 5 url编码解码 6 携带请求头 http协议版本之间的区别 7 发 ...

  6. PS CJ34预算转借

    一.CJ34,输入发出预算和接收预算的WBS 二.调用BAPI "-----------------------------------------@斌将军----------------- ...

  7. 关于 Serverless 应用架构对企业价值的一些思考

    作者:寒斜 前言 对于企业方而言,最关心的核心诉求就是如何能获取更多的营收,更高的利润,通俗点说就是如何赚更多的钱:企业赚钱的方式主要是通过出售企业服务,当用户购买更多的企业服务,企业赚的钱就越多:而 ...

  8. kafka集群七、java操作kafka(有密码验证)

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...

  9. MySQL驱动扯后腿?Spring Boot用虚拟线程可能比用物理线程还差

    之前已经分享过多篇关于Spring Boot中使用Java 21新特性虚拟线程的性能测试案例: Spring Boot 3.2虚拟线程搭建静态文件服务器有多快? Spring Boot 虚拟线程与We ...

  10. 如何通过canvas实现电子签名

    想要实现一个电子签名,可以支持鼠标签名,还能类似书法效果线条有粗有细,同时可以导出成图片. 一.实现连贯的划线 1)首先需要注册鼠标下压.鼠标放开.鼠标移出和鼠标移动事件,通过鼠标下压赋值downFl ...