超详细!!新手必看!STM32--独立看门狗IWBG


  

一、看门狗是什么?

   答:看门狗是一个12bit的递减计数器。当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,CPU收到复位信号,系统复位重新运行。在计数没减到0之前,重置了计数器的值的话,那么就不会产生复位信号,CPU收不到复位信号,系统就会继续正常运行,并不会产生复位,这个重置计数器的动作就是我们说的 “喂狗”。

二、看门狗的作用是什么?

答:基本功能就是在发生软件问题和程序跑飞时使系统复位,重新启动。可以用于环境比较恶劣的情况下。

三、看门狗分类以其功能

答:看门狗分为两类:独立看门狗(IWDG)和窗口看门狗(WWDG)。
   窗口看门狗:假如没有定时喂狗,则触发一个中断或产生系统复位(自己决定)。
   独立看门狗:假如没有定时喂狗,只会产生系统复位。
   独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
   窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。

三、原理框图

时钟树框图独立看门狗部分:
   看门狗由内部时钟LSI驱动。虽然图中LSI频率为40kHz,但是LSI的频率不是相对稳定的,LSI的频率范围大概为30Khz~60Khz,所以喂狗需要在这个范围之前喂。在估算的时候,以 32Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差。
在这里插入图片描述
在这里插入图片描述

四、独立看门狗的四个寄存器

(1)预分频寄存器(PR)

在这里插入图片描述

(2)状态寄存器(SR)

RVU位为0时,才能设置重装载值。
PVU位为0时,才能设置预分配。
在这里插入图片描述

(3)重装载寄存器(RLR)

在这里插入图片描述

(4)键寄存器(KR)

写入0xAAAA: 喂狗。
写入0XCCCC:使能看门狗。
写入0X5555: 解除预分频寄存器(PR)和重装载寄存器(RLR)的写保护。
在这里插入图片描述

五、独立看门狗的溢出时间计算公式

在这里插入图片描述
——"Tout"是看门狗溢出时间
——f𝐼𝑊𝐷𝐺是看门狗的时钟源频率
——psc是看门狗预分频系数
——rlr是看门狗重装载值
在这里插入图片描述

六、独立看门狗的配置步骤

伪代码:

独立看门狗初始化
{
   1.打开LSI时钟。
   2.往KR中写入0x5555解除PR和RLR的写保护。
   3.等待PVU为04.设置分频值。
   5.等待RVU为06.设置重载值。0-4095
   7.第一次喂狗--往KR中写入0xAAAA8.往KR中写入0xCCCC使能看门狗。
}

具体代码:

void Idwg_Init(void)
{
    RCC->CSR |=(0x01<<0); //1.打开LSI时钟。
    while(!(RCC->CSR &(0x01<<0)));//等待LSI时钟准备就绪
    
    IWDG->KR = 0x5555;    //2.往KR寄存器里写入0x5555,解放重装载值和分频值的设置权限   
    while((IWDG->SR&(0x01<<0)));//3.等待PVU为0。
    IWDG->PR &=~(0x7<<0) ; //4.设置预分频值为4分频。
    
    while((IWDG->SR&(0x01<<1)));//5.等待RVU为0。
    IWDG->RLR =(15*50-1)&0xfff ; //6.设置重装载值。

    IWDG->KR = 0xAAAA;//7.第一次喂狗--往KR中写入0xAAAA。
    IWDG->KR = 0xCCCC;//8.往KR中写入0xCCCC使能看门狗。
}

计算重装载值对应的超时周期:

LSI 时钟频率:假设 LSI 为 32.768 kHz(STM32 的默认 LSI 时钟频率)。
时钟频率经过预分频器后的频率:32.768 kHz / 4 = 8.192 kHz。
重装载值对应的超时周期:(重装载值 + 1) / 时钟频率 = (749 + 1) / 8.192 kHz = 750 / 8192 ≈ 0.0916秒。
因此,看门狗的超时周期是 大约 0.0916秒(约 91.6 毫秒)。

主函数:
延时时间可以自行调整,查看实验结果。当看门狗计数器从重装载值减为0之前没有按时喂狗,则会系统复位重启。
如下面的延时函数延时时间超过定时喂狗的时间,将会复位重启。

int main()
{
	Idwg_Init();
	printf("重启");
	while(1)
	{
	   IWDG->KR = 0xAAAA;  //按时喂狗,不然会进行复位重启。
	   delay_ms(100); //延时时间可以自行调整,查看实验结果。
	}
}
### STM32 看门狗配置教程 #### 一、看门狗概述 STM32看门狗分为两种:独立看门狗 (Independent Watchdog, IWDG) 和窗口看门狗 (Window WatchDog, WWDG)[^1]。其中,IWDG 是一种基于内部专用低速 RC 振荡器的定时器,能够在主电源 VDD 下持续工作,并能在待机和停止模式下保持活动状态[^4]。 #### 二、硬件准备与环境搭建 为了更好地理解和实践 STM32 看门狗的功能,建议读者已经具备一定的嵌入式系统基础知识,如数字电路、模拟电路等,并熟悉使用 Keil 或者其他 IDE 进行 C/C++ 编程[^2]。此外,还需要安装好 STM32CubeMX 工具用于初始化项目设置以及 HAL 库的支持文件。 #### 三、通过 STM32CubeMX 配置 IWDG 打开 STM32CubeMX 软件后,按照如下方式完成初步配置: - **选择目标设备**:根据实际使用的开发板型号选取对应的 MCU。 - **启用 IWDG 外设**:在 "Peripherals" 栏目找到 Independent Watchdog 并勾选开启选项。 - **调整参数设定**: - 设置预分频系数(Prescaler)以决定计数周期长度; - 设定重装载值(Reload Value),这决定了允许的最大超时时间; - 如果需要的话还可以修改早期唤醒中断(Early Wakeup Interrupt),当剩余时间少于一定比例时触发中断提醒开发者及时刷新计数值; 保存并生成工程模板之后即可进入下一步操作。 #### 四、编写代码实现功能 以下是利用 HAL 库管理 IWDG 的简单实例代码片段: ```c /* 初始化 */ void MX_IWDG_Init(void){ __HAL_RCC_IWDG_CLK_ENABLE(); // 开启 IWDG 时钟 hiwdg.Instance=IWDG; hiwdg.Init.Prescaler=IWDG_PRESCALER_32; /* Prescaler divider set to 32 */ hiwdg.Init.Reload=4095; /* Reload value set to max */ if (HAL_IWDG_Init(&hiwdg)!= HAL_OK){ /* Initialize the watchdog with above parameters */ Error_Handler(); } } /* 定期更新计数器 */ void SystemTickHandler(void){ HAL_IWDG_Refresh(&hiwdg); /* Refreshes the independent watchdog counter */ } ``` 上述代码实现了对 IWDG 的初始化及定期刷新机制,确保应用程序正常运行期间不会意外重启MCU。需要注意的是,在实际应用中应当合理安排 `SystemTickHandler` 函数调用位置,保证其能被频繁执行从而维持有效的“喂狗”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值