大家好,又见面了,我是你们的朋友全栈君。
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用
所用工具:
1、芯片: STM32F407ZET6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F1xx/STM32F4xxHAL库
知识概括:
通过本篇博客您将学到:
STM32CubeMX创建看门狗例程
独立看门狗,靠窗看门狗 工作原理
看门狗
在由单片机构成的微型计算机系统中单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog)
简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,
如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)
STM32的内置看门狗
STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。
- 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
- 窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
IWDG-独立看门狗
工程创建
1设置RCC
- 设置高速外部时钟HSE 选择外部时钟源
2配置IWDG
- IWDG时钟预分频系数 4分频
- 计数器重装载值 4095 RLR
超出(溢出)时间计算:
Tout=((4×2^PRER) ×RLR)/LSI时钟频率
对应不同预分频系数的PRER值:
3时钟源设置
- 1选择外部时钟HSE 8MHz
- 2PLL锁相环倍频72倍
- 3系统时钟来源选择为PLL
- 4设置APB1分频器为 /2
32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》
4项目文件设置
- 1 设置项目名称
- 2 设置存储路径
- 3 选择所用IDE
5创建工程文件
然后点击GENERATE CODE 创建工程
配置下载工具
新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行
HAL库独立看门狗函数库讲解:
看门狗初始化函数
代码语言:javascript复制HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)
喂狗函数:
代码语言:javascript复制HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
代码语言:javascript复制举例: HAL_IWDG_Refresh(&hiwdg); //看门狗喂狗
使用该函数定时喂狗即可
WWDG-窗口看门狗
窗口看门狗的定义
窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0x3F 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。
窗口看门狗之所以称为窗口,就是因为其喂狗时间是在一个有上下限的范围内(计数器减到某个值~计数器减到0x3F),在这个范围内才可以喂狗,可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)
- 1计数器的初始值
- 2 是我们设置的上窗口(W[6:0]值
- 3是下窗口值(0x3F)
窗口看门狗计数器的值只有在2和3 之间(上窗口和下窗口之间)才可以喂狗
窗口看门狗中断:
并且窗口看门狗还可以使能中断,如果使能了提前唤醒中断,系统出现问题,喂狗函数没有生效,那么在计数器由减到0x40 (0x3f 1) 的时候,便会先进入中断,之后才会复位,你也可以在中断里面喂狗
WDGG窗口看门狗配置
- 1.点击WWDG
- 2.
- WWDG时钟预分频系数 8
- WWDG上窗口值 0x5F
- WWDG计数器值 : 0x7F
- 设置看门狗提前唤醒中断
- 3
- 使能窗口看门狗中断
其余配置与独立看门狗相同配置即可
HAL库独立窗口狗函数库讲解:
看门狗初始化:
代码语言:javascript复制HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
喂狗:
代码语言:javascript复制HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
看门狗中断处理函数:
代码语言:javascript复制HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg)
功能: 判断中断是否正常,并进入中断回调函数
看门狗中断回调函数:
代码语言:javascript复制 __weak HAL_WWDG_EarlyWakeupCallback(hwwdg);
在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,
看门狗中断运行完成之后,便会进入看门狗的中断回调函数
例程实现:
本例程实现LED点亮延时300ms闪烁
在main.c下方添加中断回调函数
代码语言:javascript复制void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hwwdg);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15); //LED翻转 --闪烁表示喂狗成功
HAL_WWDG_Refresh(hwwdg); //喂狗
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132936.html原文链接:https://javaforall.cn