一、STM32 的IWDG简介

2.1 看门狗原理

看门狗本质上就是一种计数器,和我们现实生活中一炷香现象、沙漏现象等是同理的,计数器一般有两种做法,一种是递增,超过固定阀值报警;一种是递减,通常值降到0时报警。后面一种比较贴切生活场景,因此较常用,STM32的独立看门狗(Independent Watchdog,IWDG)就是采用后面这一种做法。

如下图所示,假设我们设定一个初始值RL,设定一个计数变量V在开始时等于RL,然后每经过一个时钟周期就减1,如果减到为0值时,触发报警。如果在V值降为0前,重新设定一下V值等于RL,然后V值又重新计算,从而又争取到一段时间,定期去反复设定V值(喂狗),保持V值不降为0,就能一直保持正常态势。

STM32中的看门狗有两种,一个是独立看门狗(Independent Watchdog,IWDG),就是本博文要分析学习的,另一种是窗口看门狗wwdg(window Watchdog,WWDG)。

1.2 STM32独立看门狗时钟计算

Iwdg由独立时钟(内部低速时钟LSI)计时,所以不受系统硬件影响的系统故障探测器。主要用于监视硬件错误。而wwdg由系统时钟计时,如果系统时钟不走了,它也就失去作用了,主要用于监视软件错误。

前面提到看门狗的计数是每经过一个时钟周期减1,那么时钟周期CT是如何获得计算呢。STM32内,IWDG依赖于内部低速时钟LSI,采用该时钟的频率来计时。频率是单位时间内完成周期性变化的次数,是描述周期运动频繁程度的量,常用符号f或ν表示,单位为秒分之一。为了纪念德国物理学家赫兹的贡献,人们把频率的单位命名为赫兹,简称“赫”,符号为Hz。

而时钟周期CT和频率成反比,即f=1/CT(其中f为频率,CT为时钟周期)。

在STM32CubeMX上,我们开启IWDT后,用户可以设置的数值依次是计数时钟分频值,窗口值及重装载值,其中计数时钟分频值取值是固定的枚举值(2<n<8),即4、8、16、32、64、128、256,而窗口值及重装载值的设置范围12bit的数据,即0X000~0XFFF,如下图所示:

而IWDG的最终输出时钟频率是直接依赖于LSI,MCU芯片的内部低速时钟是多少,它就是多少。

那么,看门狗时钟频率=LSI(内部低速时钟)的频率F/计数时钟分频值P;

如上述两图设置的数值,RL=4095,F=32KHz,P=32,那么时钟周期:

ct = 1s/f32KHz/32=1000ms/32000HZ/32=1ms,也就大概一个时钟周期是1毫秒,喂狗要求在4095*1ms以内。

1.3 STM32的IWDT使用注意

需要注意的是,看门狗的时钟计算不是精确的,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。另外应该还注意到窗口值的存在,通常窗口值和重装载值一致的,如果Window参数(WV)与Window寄存器值相同,只需重新加载计数器值即可退出,具有精确时基函数。否则修改窗口寄存器。这将自动重新加载看门狗计数器:

窗口计数值WV决定什么时候喂狗。狗喂早了,复位就“早”,即在重装载值(V)>窗口值(WV),也就是计数器值还没有减到窗口值以下,当 0x0 < 计数器值(V) < 窗口值(WV) 时,这时候最适合喂狗了,也只有在这时候喂狗才合适。

另外IWDG可以通过软件或硬件启动(可通过选项字节配置),由于是低速内部时钟(LSI)计时,因此即使主时钟发生故障,IWDG仍保持活动状态。并IWDG是在VDD电压域中实现,在STOP(停止)和STANDBY(待机)模式下仍可正常工作(IWDG重置可将CPU从STANDBY唤醒)。RCC控制状态寄存器中的IWDGRST标志可用于通知何时发生IWDG重置。

二、IWDG工程创建

2.1 创建工程及配置IWDG

本文采用的是STM32L496VGT6-ali开发板,是基于前面工程的.ioc在CubeIDE开发平台创建了新工程,并移植了前面工程已经实现的按键、LED灯及lpuart1串口调试功能,可参考前面博文:

假设已经完成了按键、LED灯及lpuart1串口调试功能后,双击.ioc文件打开cubeMX界面,配置IWDG,如下图所示,开启IWDG并设置参数32、4095,另外IWDT时钟频率是32KHz。

配置很简单,完成配置后,单击保存或生成代码按钮,输出生成代码。

2.2 IWDG的HAL实现源码分析

cubeMX会为IWDG在Core/Inc和Core/Src生成独立看门狗的头文件及源文件,实现源码也很简单,定义独立看门狗句柄(IWDG寄存器)及初始化函数MX_IWDG_Init。

在MX_IWDG_Init函数中,只做了两件事,将在cubeMX上配置的参数传递给IWDG参数缓存区及实例化IWDG寄存器,调用HLA看门狗初始化函数(HAL_IWDG_Init)实现真正的初始化。

在stm32L4xx_HLA_iwdg.c驱动文件中,HAL_IWDG_Init函数内,首先对cubeMX上配置参数的合理性诊断,然后开启IWDG和使能写入访问,将已经缓存的配置参数写入IWDG寄存器,并检查设置是否合理,在HAL_IWDG_DEFAULT_TIMEOUT内完成寄存器更新,最后设置计数器值V等于重装载值RL,开启真正计数。

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
{uint32_t tickstart;/* Check the IWDG handle allocation */if (hiwdg == NULL){return HAL_ERROR;}/* Check the parameters */assert_param(IS_IWDG_ALL_INSTANCE(hiwdg->Instance));assert_param(IS_IWDG_PRESCALER(hiwdg->Init.Prescaler));assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload));assert_param(IS_IWDG_WINDOW(hiwdg->Init.Window));/* Enable IWDG. LSI is turned on automatically */__HAL_IWDG_START(hiwdg);/* Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers by writing0x5555 in KR */IWDG_ENABLE_WRITE_ACCESS(hiwdg);/* Write to IWDG registers the Prescaler & Reload values to work with */hiwdg->Instance->PR = hiwdg->Init.Prescaler;hiwdg->Instance->RLR = hiwdg->Init.Reload;/* Check pending flag, if previous update not done, return timeout */tickstart = HAL_GetTick();/* Wait for register to be updated */while ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u){if ((HAL_GetTick() - tickstart) > HAL_IWDG_DEFAULT_TIMEOUT){if ((hiwdg->Instance->SR & IWDG_KERNEL_UPDATE_FLAGS) != 0x00u){return HAL_TIMEOUT;}}}/* If window parameter is different than current value, modify windowregister */if (hiwdg->Instance->WINR != hiwdg->Init.Window){/* Write to IWDG WINR the IWDG_Window value to compare with. In any case,even if window feature is disabled, Watchdog will be reloaded by writingwindows register */hiwdg->Instance->WINR = hiwdg->Init.Window;}else{/* Reload IWDG counter with value defined in the reload register */__HAL_IWDG_RELOAD_COUNTER(hiwdg);}/* Return function status */return HAL_OK;
}

同样,在stm32L4xx_HLA_iwdg.c驱动文件中,HLA库提供了喂狗函数HAL_IWDG_Refresh,需要我们在规定时间内(由在cubeMX上配置的参数和时钟频率来决定),使用中调用该函数喂狗,就可以防止看门狗复位。

/*** @brief  Refresh the IWDG.* @param  hiwdg  pointer to a IWDG_HandleTypeDef structure that contains*                the configuration information for the specified IWDG module.* @retval HAL status*/
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{/* Reload IWDG counter with value defined in the reload register */__HAL_IWDG_RELOAD_COUNTER(hiwdg);/* Return function status */return HAL_OK;
}

2.3 IWDG使用

本文在IWDG使用设计是,通过按键输入触发不再喂狗,这时是否系统复位,通过lpuart1调试信息确认是否成功。

在main.c文件中,引入按键、LED灯及串口驱动头文件。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "../../ICore/key/key.h"
#include "../../ICore/led/led.h"
#include "../../ICore/print/print.h"
#include "../../ICore/usart/usart.h"
/* USER CODE END Includes */

在main.c文件中,extern声明IWDG寄存器句柄。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern IWDG_HandleTypeDef hiwdg;
/* USER CODE END 0 */

在main主函数中,初始化串口,开启中断接收。

/* Initialize all configured peripherals */MX_GPIO_Init();MX_LPUART1_UART_Init();MX_IWDG_Init();
/* USER CODE BEGIN 2 */ResetPrintInit(&hlpuart1);HAL_UART_Receive_IT(&hlpuart1,(uint8_t *)&HLPUSART_NewData, 1); //再开启接收中断HLPUSART_RX_STA = 0;//uint8_t wdt_flag = 1;    //是否继续喂狗标记printf("app restart now!\r\n");/* USER CODE END 2 */

在main主函数中,实现喂狗功能。

  /* USER CODE BEGIN WHILE */while (1){if(KEY_2()){wdt_flag = 0;printf("IWDG_Refresh stop!\r\n");}if(wdt_flag){HAL_IWDG_Refresh(&hiwdg);HAL_Delay(10);//等待}Toggle_led1();/* USER CODE END WHILE */

三、编译及测试

3.1 编译

编译通过

下载程序

3.2 测试

打开串口工具,连接上串口,观察窗口日志输出情况,按键KEY2测试如下:

测试成功,不在喂狗时,等待一、两秒系统重启。

cubeIDE开发, stm32独立看门狗IWDG的CubeMX配置及HAL库底层实现分析相关推荐

  1. STM32CubeIDE开发(十), stm32的CRC计算CubeMX配置及HAL库底层实现分析

    一.stm32的CRC 1.1 CRC的简介及MCU关联说明 STM32的CRC(Cyclic Redundancy Check,循环冗余校验)计算单元使用一个固定的多项式发生器,从一个32位的数据字 ...

  2. STM32—独立看门狗(IWDG)

    STM32-独立看门狗(IWDG) 独立看门狗(IWDG) STM32-独立看门狗(IWDG) 独立看门狗(IWDG) IWDG 简介 IWDG 功能框图剖析 独立看门狗时钟 计数器 重装载寄存器 键 ...

  3. STM32 - 独立看门狗IWDG - 使用注意事项+代码

    一.包含头文件 #include "stm32f10x_iwdg.h" 二.设置 独立看门狗 的超时时间 1.配置代码 /** 设置 IWDG 的超时时间* Tout(ms) = ...

  4. 【STM32】stm32独立看门狗(IWDG)

    stm32独立看门狗(IWDG) 0x01 IWDG简介 0x02 IWDG主要性能 0x03 IWDG寄存器配置 0x01 IWDG简介 STM32F10xxx内置两个看门狗,(独立看门狗和窗口看门 ...

  5. stm32专题三十四:独立看门狗 IWDG

    独立看门狗简介 IWDG结构框图 (1)独立看门狗时钟 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供, 即使主时钟发生故障它仍然有效,非常独立. LSI 的频率一般在 30~60KHZ 之间, ...

  6. STM32 独立看门狗实验

    一.STM32 独立看门狗简介 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 ...

  7. STM32F103五分钟入门系列(十三)独立看门狗IWDG

    参考:STM32F103五分钟入门系列(十三)独立看门狗IWDG 作者:自信且爱笑' 发布时间:2021-07-31 19:50:28 网址:https://blog.csdn.net/Curnane ...

  8. STM32F1笔记(六)独立看门狗IWDG

    STM32F1内置了两个看门狗,独立看门狗IWDG和窗口看门狗WWDG,可以用来检测和解决由软件错误引起的故障. IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 ...

  9. STM32独立看门狗(宠物狗)

    一.前言 ······在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系 ...

最新文章

  1. 大小端字节序介绍以及判断当前环境字节序的程序【C语言】
  2. 做产品16年,我有9条心得--百度贴吧前负责人
  3. 数据科学之基石:数据科学家必须掌握的10个统计学概念
  4. 就业丨得益于AI,这五个行业岗位需求将呈现显著增长趋势
  5. FD.io/VPP — QoS — Policer CLI
  6. html画圆中有个正方形,这样画圆内接正方形,非常简单!
  7. python按列输出字符_如何根据条件在Pandas中构建新列(新列应输出字符串)
  8. Java Instanceof
  9. I - 滑雪 POJ - 1088(深搜,记忆化搜索)
  10. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析
  11. linux解压tz zip,TZ 文件扩展名: 它是什么以及如何打开它?
  12. 计算机组装过程英文版,计算机组装与维护试题及答案(国外英文资料).doc
  13. linuxc线程信号-pthread_cond_wait理解
  14. 阿里云服务器从购买,备案,安装部署中遇到的一些坑
  15. qt实现抽屉效果,类似qq的好友功能
  16. 2020,ToB 生态全景解读
  17. Project(8)——收货地址——增加 --- 省市区数据处理
  18. H3C S5820V2_5830V2交换机IRF2堆叠后升级方法
  19. PayPal 今天 Reopen?
  20. 简体字与繁体字互相转换

热门文章

  1. 01-初识sketch-sketch优势
  2. 服务器修改内网IP地址
  3. VMware NAT 模式配置端口映射
  4. 点击“加入QQ群”链接打开电脑QQ扫码后发现登录地点不是本地
  5. SVM中KKT条件介绍
  6. 【我的Android进阶之旅】繁体字的标点符号应该是居中还是在左下角?
  7. 用Python做命令行地址簿
  8. Android:简易的单词本(一)
  9. 毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0
  10. 文档查看器(Open XML)格式工具