【嵌入式系统】独立看门狗原理+看门狗实验分析

简介: 【嵌入式系统】独立看门狗原理+看门狗实验分析

1、看门狗模块概述

在由单片机构成的微机系统中,由于单片机工作常常会受到来自外界电磁场干扰导致程序跑飞,陷入死循环——即程序正常运行被打断,系统无法继续工作。这种情况下会造成系统陷入停滞状态,发生不可预料的后果。因此出于对单片机运行状态进行实时监测的考虑,产生了一种专门用于监测单片机程序运行状态的模块或芯片,称为看门狗。STM32F10xxx内置两个看门狗:独立看门狗(IWDG, Independent WatchDoG)和窗口看门狗(WWDG, Windows WatchDoG),提供了更高的安全性、时间的精确性和使用的灵活性。


image.png

WWDG和IWDG原理有所区别,本篇文章仅对IWDG作分析

2、IWDG原理


image.png

IWDG由独立时钟LSI驱动且处于VDD供电区,因此可在睡眠、停机、待机模式下运行。当IWDG_KR写入0xCCCC时IWDG递减计数器启动,从0xFFFF开始减计数,当计数器计数为0时系统就进行复位。在正常工作状态下,每隔一段时间会向IWDG_KR写入0xAAAA,即将一个寄存在IWDG_RLR的12bits数值装载到IWDG计数器中——可见正常工作下IWDG永远不会触发系统复位;当系统跑飞时将无法正常喂狗,从而一段时间后产生系统复位,维护系统运行稳定。


看门狗溢出时间如下,当计数器第一次重装载后,超过 T o u t T_{out} T

out


不重装载将产生系统复位。在战舰版中,LSI如图2为40kHz,因此令 f L S I f_{LSI} f

LSI


=40即可

T o u t = ( 4 × 2 P r e ) × R L R f L S I T_{out}=\frac{(4×2^{Pre})×RLR}{f_{LSI}}

T

out


=

f

LSI


(4×2

Pre

)×RLR

 


image.png

3、IWDG实验分析

本实验基于STM32NANO(HAL库),结合KEY、LED与IWDG观察看门狗的监视复位功能。

int main(void)
{
    HAL_Init();                       //初始化HAL库    
    Stm32_Clock_Init(RCC_PLL_MUL9);     //设置时钟,72M
    delay_init(72);                     //初始化延时函数
  uart_init(115200);          //初始化串口
    LED_Init();                         //初始化LED 
  KEY_Init();           //初始化按键
  delay_ms(100);                      //延时100ms再初始化看门狗
    IWDG_Init(IWDG_PRESCALER_64,625);   //分频数为64,重载值为625
    LED0=0;
  while(1)
  {
    if(KEY_Scan(1)==WKUP_PRES)    //如果WK_UP按下,喂狗
    {
      IWDG_Feed();          //喂狗
    }
      delay_ms(10); 
  }
}

IWDG_Init(IWDG_PRESCALER_64,625)设置了溢出时间为:

T o u t = 64 × 625 40 m s = 1 s T_{out}=\frac{64×625}{40}ms=1s

T

out


=

40

64×625


ms=1s


即超过1s没有喂狗,系统将执行复位。


LED0=0使用位带操作进行点灯,位带操作点灯的原理可以参考:位带操作原理+LED实验分析while(1)循环内将喂狗函数和WK_UP按键绑定,即按下WK_UP就执行了重装载操作(KEY_Scan(1)即选用支持连按)。IWDG初始化前的延时delay_ms(100)是为了使LED0的闪烁可见:如图4所示,若没有delay(),两次点灯时间间隔很短,无法观察到因为复位导致的LED0灭灯现象。


image.png

下面讲解封装过的独立看门狗初始化函数void IWDG_Init(u8,u16)原理:

IWDG_HandleTypeDef IWDG_Handler;   //独立看门狗句柄
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_Handler.Instance=IWDG;
    IWDG_Handler.Init.Prescaler=prer;  //设置IWDG分频系数
    IWDG_Handler.Init.Reload=rlr;    //重装载值
    HAL_IWDG_Init(&IWDG_Handler);  //初始化IWDG,默认会开启独立看门狗
  HAL_IWDG_Start(&IWDG_Handler);   //启动独立看门狗
}

首先在IWDG头文件中定义了全局的IWDG句柄,句柄定义如下,包含的是IWDG寄存器组基址以及预分频系数、重装载值等资源信息。

typedef struct
{
  IWDG_TypeDef         *Instance;  /*!< Register base address    */
  IWDG_InitTypeDef       Init;      /*!< IWDG required parameters */
}IWDG_HandleTypeDef;

接下来在函数中对这个全局句柄进行初始化,将输入参数Prep、Rlr以及IWDG基址赋给IWDG_Handle,之后使用此句柄进行实质性的IWDG初始化和启动。下面给出了IWDG的初始化封装HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *)中与IWDG配置有关的代码

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
{
  ……
  /* Enable IWDG. LSI is turned on automaticaly */
  __HAL_IWDG_START(hiwdg);
  /* Enable write access to IWDG_PR and IWDG_RLR registers by writing 0x5555 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;
  /* Reload IWDG counter with value defined in the reload register */
  __HAL_IWDG_RELOAD_COUNTER(hiwdg);
  /* Return function status */
  return HAL_OK;
}

大多数配置都是通过宏定义函数进行的,例如

#define WRITE_REG(REG, VAL)   ((REG) = (VAL))
#define IWDG_ENABLE_WRITE_ACCESS(__HANDLE__)
WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_ENABLE)

其中IWDG_KEY_WRITE_ACCESS_ENABLE就是0x5555,即往KR写入0x5555,参照图3知此时取消了RLR与PR的写保护,可以向其中写入预分频因子和重装载值了。


将IWDG初始化并启动后,若不进行喂狗系统将在溢出时间到达后自动复位。IWDG_Feed()是对宏定义函数__HAL_IWDG_RELOAD_COUNTER(hiwdg)的封装,即往KR中写入0xAAAA对计数器进行重装载。


目录
相关文章
|
5月前
|
存储 人工智能 安全
阿里云OpenClaw部署活动,9.9元起快速部署定制AI助理,轻松养虾
阿里云“一键部署,快乐养虾”活动提供低成本、高效率的OpenClaw超级AI助理搭建方案,实现7×24小时全天候服务。用户可通过简单几步快速完成钉钉/飞书/QQ机器人部署,自动处理会议纪要生成、数据汇总等高频重复工作,提升办公效率。方案支持多端消息聚合、主动任务管理及隐私数据本地化存储。活动期间,用户可享9.9元起部署优惠,轻松构建定制化AI助理,推动智能化办公与生活管理升级。
483 1
阿里云OpenClaw部署活动,9.9元起快速部署定制AI助理,轻松养虾
|
存储 固态存储 文件存储
一台电脑最多能接几个硬盘?
电脑硬盘扩展指南:从硬件接口(SATA、M.2、USB)到供电散热,再到操作系统盘符限制,本文全面解析一台电脑最多能接多少硬盘。普通用户适合2-4块硬盘,专业人士可扩展至8块以上,企业服务器则无明确上限。通过RAID阵列或NAS设备,还能突破传统限制,满足海量存储需求。了解这些技巧,助您合理规划存储方案!
|
12月前
|
数据采集 监控 数据可视化
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
本案例讲述了在豆瓣电影数据采集过程中,面对数据量激增和限制机制带来的挑战,如何通过引入爬虫代理、分布式架构与异步IO等技术手段,实现采集系统的优化与扩展,最终支撑起百万级请求的稳定抓取。
628 0
数据量暴涨时,抓取架构该如何应对?——豆瓣电影案例调研
|
12月前
|
Windows
win10系统任务管理器被管理员禁用怎么办?任务管理器选项被禁用?解决办法
本文介绍了任务管理器被管理员禁用的常见问题及解决方法,包括通过注册表删除“DisableTaskMgr”值,并提供系统修复工具下载链接。
1548 0
|
缓存 Ubuntu 安全
Ubuntu 日常使用指南:新手必知的 10 个实用技巧
注意事项:所有操作需谨慎执行,关键数据建议通过 deja-dup 工具备份。本文技巧均测试于Ubuntu 24.04 LTS,不同版本可能存在差异。
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
990 64
|
存储 运维 安全
《VERICUT 9.X电脑配置要求与安装说明(官方)》—— PDF文档
本文档详细介绍了 CGTech Vericut 9.X 的安装指南,涵盖安装前准备、安装流程、系统要求、故障排除、许可证配置及多种接口配置等内容,为用户提供全面的软件安装与配置指导。
1070 3
|
Java Linux Shell
Nacos安装指南
`Nacos`安装指南包括Windows和Linux两部分。在Windows上,下载Nacos服务端安装包,解压到非中文目录,修改配置文件(如需)并启动服务。通过`startup.cmd -m standalone`启动,然后在浏览器访问`http://127.0.0.1:8848/nacos`。Linux安装涉及安装JDK,上传Nacos安装包,解压并启动服务,使用`sh startup.sh -m standalone`命令。Nacos作为Spring Cloud Alibaba的依赖,需要在项目中引入相关依赖。
1538 1
|
XML Java API
30. 【Android教程】吐司提示:Toast 的使用方法
30. 【Android教程】吐司提示:Toast 的使用方法
1196 2
|
前端开发 NoSQL Java
Github开源项目详解--Mall(一)
Github开源项目详解--Mall(一)
531 0

热门文章

最新文章