一. 看门狗是啥。
首先,它不是真的狗。看门狗(Watchdog)是一种硬件定时器,用于监测程序执行是否正常,并在系统出现故障或死锁时重启系统。在STM32F10xxx中内置了两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引发的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于串口型看门狗)或产生系统复位。
IWDG(独立看门狗):
由专门的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
WWDG(窗口看门狗):
由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
二. IWDG(独立看门狗)
1. 主要性能
- 自由运行的12位递减计数器
- 时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
- 看门狗被激活后,则在计数器计数至0时产生复位,若在未计数到0前进行了喂狗处理(重置计数器),则不会产生复位信号
2. 功能描述
若在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。无论何时,只要在键寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位 。IWDG_PR和IWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。
3. IWDG框图
4. 有关寄存器及计算公式
IWDG_KR(键寄存器)
IWDG_PR(预分频寄存器)
预分频的算法公式是:PSC = 4 * 2 PRER; 其中PRER就是IWDG_PR的值。
IWDG_RLR(重装载寄存器)
计算溢出的时间公式: T out = (PSC * RLR)/ LSI;
PSC是分频系数,RLR计数器重装载值,LSI一般是40KHz。
预分频系数 | 最短时间ms(RLR=1) | 最长时间ms(RLR=4096) |
---|---|---|
/4 | 0.1 | 409.6 |
/8 | 0.2 | 819.2 |
/16 | 0.4 | 1,638.4 |
/32 | 0.8 | 3,276.8 |
/64 | 1.6 | 6,553.6 |
/128 | 3.2 | 13,107.2 |
/256 | 6.4 | 26,214.4 |
打开STM32CubeMX,选择STM32F103C8芯片,配置RCC为外部高速时钟,配置时钟源参数,基础配置完之后开始配置IWDG。
这里选择将 PSC 设置为 32,RLR 设置为1250,LSI为40KHz,可得复位时间间隔为1S。
配置工程文件路径后,生成工程文件。
关于使用IWDG的有关HAL库函数
独立看门狗初始化函数:
HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);
独立看门狗喂狗函数:
HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);
例如:(这个的展示效果可能没有那么好,可以搭配使用串口通信来体会独立看门狗的效果)
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1){
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(400);
HAL_IWDG_Refresh(&hiwdg);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(400);
HAL_IWDG_Refresh(&hiwdg);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(600);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
三. WWDG(窗口看门狗)
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
1. 主要性能
- 可编程的自由运行7位递减计数器
- 条件复位
- 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
- 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。 - 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位。
2. 功能描述
如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’), 并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,也将产生一个复位。
3. 中断条件
当7位递减计数器等于 0x40 时可产生提前唤醒中断。
4. 有关寄存器及计算公式
WWDG_CR(控制寄存器)
WWDG_CFR(配置寄存器)
状态寄存器(WWDG_SR)
计算超时公式:T-out = [ 4096 * 2 WDGTB * (T[5.0] + 1) ] / Fwwdg;(ms)
其中T-out 是WWDG超时时间;
T[5:0] 是WWDG计数器低6位,最大为63;
4096是WWDG固定的预分频系数;
Fwwdg是WWDG的时钟源频率(最大36M);
2 WDGTB是WWDG_CFR寄存器设置的预分频系数值。
WDGTB | 最小超时时间(T[5:0]为0) | 最大超时时间(T[5:0]为63) |
---|---|---|
0 | 113us | 7.28ms |
1 | 227us | 14.56ms |
2 | 455us | 29.12ms |
3 | 910us | 58.25ms |
打开STM32CubeMX,选择STM32F103C8芯片,配置RCC为外部高速时钟,配置时钟源参数,基础配置完之后开始配置IWDG。
开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X4F ,预分频系数为 4 。程序启动后每0.5秒翻转一次LED灯 。在提前唤醒中断服务函数进行喂狗,同时翻转LED灯的状态。
来计算一下配置当前参数可以产生的复位窗口时间。
关于使用IWDG的有关HAL库函数
窗口看门狗初始化函数:
MX_WWDG_Init();
窗口看门狗喂狗函数:
HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);
窗口看门狗中断回调函数:
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg);
举例:在main.c文件中添加以下代码文章来源:https://www.toymoban.com/news/detail-767550.html
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg){
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
HAL_WWDG_Refresh(hwwdg);
}
两只看门狗的使用范畴文章来源地址https://www.toymoban.com/news/detail-767550.html
独立看门狗 | 窗口看门狗 |
---|---|
出现程序跑飞 | 软件逻辑出现错误 |
出现死循环 | 死机,死循环 |
睡眠,休眠不合理 | 软件不按预期代码执行 |
外部主晶振坏掉 | 软件复位需要数据恢复 |
到了这里,关于【STM32笔记】STM32的看门狗详解(独立看门狗和窗口看门狗)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!