stm32mini看门狗——HAL库

本文详细介绍了STM32的两个看门狗定时器——独立看门狗和窗口看门狗的工作原理、寄存器配置、溢出时间计算以及操作步骤。独立看门狗由内部40KHz低速时钟驱动,不受主时钟影响,而窗口看门狗则有上下限喂狗时间范围。同时提供了相应的库函数和程序示例,帮助理解其使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看门狗概述

看门狗定时器是一个计数器,其基本功能是发生软件问题及程序跑飞后使系统重新启动。看门狗正常启动时自动计数,程序定期将其复位清零,如果系统某处跑飞或者卡死,定时器溢出并进入中断,在定时器中断中执行复位操作,使系统恢复正常工作状态。

stm32有两个看门狗,独立看门狗和窗口看门狗,下面会较为详细地分别讲解两者。

独立看门狗

STM32 的独立看门狗由内部专门的 40Khz(因为使用的是内部RC时钟,所以并不是准确的40Khz) 低速时钟驱动,即使主时钟发生故障,它也仍然有效。其限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。

独立看门狗主要用到下面几个寄存器:

键值寄存器 IWDG_KR 有效位0-15
预分频寄存器 IWDG_PR 有效位0-2 //具有写保护功能,要操作先取消写保护
重装载寄存器 IWDR_RLR 有效位0-11 //具有写保护功能,要操作先取消写保护
状态寄存器 IWDG_SR 有效位0-1 //读取一些看门狗的状态 重装载值更新,预分频值更新

下面放几个手册里的寄存器描述图(对描述图的理解能帮助我们明白如何使用库函数以及使用哪些)

键值寄存器IWDG_KR
在这里插入图片描述

预分频寄存器 IWDG_PR
预分频寄存器

重装载寄存器
重装载
独立看门狗溢出时间计算

Tout =(4*2^prer)*rlr / 40

具体怎么算如果还是没法理解的话可以看看这个博客,讲解的很详细:
stm32系列芯片独立看门狗(IWDG)溢出时间计算原理

独立看门狗操作步骤

取消寄存器写保护
设置独立看门狗的预分频系数,确定时钟
设置看门狗重装载值,确定溢出时间
使能看门狗
应用程序喂狗

程序示例:

iwdg.h文件

#ifndef __IWDG_H__
#define __IWDG_H__
#include "sys.h"

//看门狗初始化
void IWDG_Init(u8 prer, u16 value);

//喂狗
void IWDG_Feed(void);

#endif

iwdg.c文件

#include 
### STM32独立看门狗(HAL)使用教程与示例代码 #### 工作原理概述 独立看门狗(IWDG) 是一种硬件定时器,用于监控系统运行状态。如果程序正常执行,则需要定期刷新 IWDG 的计数器;否则当计数值达到零时会触发复位操作[^2]。 #### 初始化过程 为了在项目中使用 IWDG,需先完成其初始化工作。以下是基于 HAL 的一个典型初始化流程: 1. **定义句柄结构体** 定义 `IWDG_HandleTypeDef` 类型变量作为 IWDG 句柄。 2. **配置预分频系数(Prescaler)** 设置 IWDG 计数器的频率通过调整预分频值实现。例如,在某些情况下可以选用 64 或其他合适的值[^3]。 3. **设定重载寄存器(Reload Register)** 此参数决定了最大允许的时间间隔,在此期间必须重新加载计数器以避免超时事件发生。 4. **调用初始化函数** 利用 `HAL_IWDG_Init()` 函数完成上述参数的应用并启动外设服务。 5. **激活看门狗机制** 调用 `HAL_IWDG_Start()` 方法正式使能该特性。 #### 示例代码展示 下面提供了一段完整的 C 语言源码片段演示如何利用 HAL 管理 STM32 微控制器上的独立看门狗模块: ```c #include "stm32fxxx_hal.h" // 声明全局对象实例化 IWDG_HandleTypeDef iwdg_handler; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ // 初始化HAL层资源 HAL_Init(); // 配置系统时钟 SystemClock_Config(); // GPIO端口初始化 MX_GPIO_Init(); // 独立看门狗初始化 iwdg_handler.Instance=IWDG; iwdg_handler.Init.Prescaler=IWDG_PRESCALER_64; // 设定预分频因子为64 iwdg_handler.Init.Reload=500; // 每次重启前的最大周期(ms) if (HAL_IWDG_Init(&iwdg_handler)!= HAL_OK){ // 执行实际初始化动作 Error_Handler(); // 错误处理逻辑跳转至错误处理器 } HAL_IWDG_Start(&iwdg_handler); // 启动独立看门狗 while(1){ HAL_IWDG_Refresh(&iwdg_handler); // 不断更新看门狗以防溢出引发复位 HAL_Delay(10); // 添加适当延迟时间保持循环节奏平稳 } } /** * @brief 错误处理函数模板 */ void Error_Handler(void){ while(1){} } ``` 以上代码展示了从基本环境搭建到核心功能实现的整体框架设计思路。 #### 注意事项 - 在主循环体内务必记得频繁呼叫 `HAL_IWDG_Refresh()` 来维持活动状态,防止意外停机情况的发生。 - 如果应用程序进入长时间等待模式或者低功耗状态时也要特别留意是否会影响正常的喂狗行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值