目录
本文基于正点原子的教程,算是自己的一种理解吧!为了让大家更能理解,就省略了一些配置过程以及寄存器的详细介绍,感兴趣的同学可以去看开发手册或者教学视频。谢谢大家了!
学习目标
本节我们来学习有关独立看门狗的知识,我觉得这节知识有点好玩,因为是之前学51时没有接触过的东西。我觉得独立看门狗就像是一个偷东西的游戏,但是主人家里养了一条狗,为了避免惊动其他人,你必须每隔一段时间去喂狗,不然就会惊动其他人,导致游戏重开。(不怎么玩游戏,不知道是不是真有这样的一个游戏)好了,我们接下来开始讲解独立看门狗吧!
内容
介绍
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”。
通俗介绍
相信大家不喜欢看上面的介绍,其实上面的介绍用通俗的语言来讲的话相当于这个游戏的前景提要:
每个人家里都有可能进小偷,造成我们的财产损失以及生命安全或者不可预料的后果,所以为了防止这样的事情发送,于是有人便在家里养了一条狗……
功能介绍
看门狗的功能
- 在启动正常运行的时候,系统不能复位。
- 在系统跑飞和程序异常执行的情况,系统复位,程序重新执行。
通俗功能介绍
相信大家也不喜欢看上面的介绍,其实上面的介绍用通俗的语言来讲的话相当于这个游戏中狗的作用:
- 当你不偷东西时,狗不会叫,游戏一直进行。
- 当你偷东西时,狗就会叫,吸引其他人过来,游戏失败,重来。
看门狗概述
这是关于看门狗的概述,因为我们今天只讲独立看门狗,所以这一段话就不做介绍,其实用通俗的话来理解,两者基本一样,就是窗口看门狗是看门狗这款游戏的困难模式。
STM32内置两个“看门狗”:独立看门狗和窗口看门狗,用来监测和解决由软件错误引起的故障,当计时器达到给定的超时值时,触发一个中断或产生系统复位,从而提供了更高的安全性、时间的精确性和使用的灵活性。
独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。独立看门狗适合用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。
窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来监测应用程序非正常的过迟或过早操作。窗口看门狗适合于那些要求看门狗在精确计时窗口起作用的程序。
独立看门狗功能描述
在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA, 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。
通俗功能描述
很抱歉给大家看这么多官方定义,于是我们再次使用我们的游戏去理解这段话,不过在这之前,我们需要简单理解一下寄存器在游戏中的作用。
寄存器:相当于游戏的设置功能,我们可以自行设置游戏的参数,相当于开挂,程序员开个挂应该比较正常吧!(doge)
独立看门狗功能:
模式选择:
在键值寄存器(IWDG_KR)中写入0xCCCC,说明选择要偷的人家里有狗的模式。然后这个时候,狗是吃饱的(复位值0xFFF),但是狗会饿,饿的受不了了(尾值0x000)。就会叫,游戏失败!
喂狗方法:
只要在键值寄存器IWDG_KR中写入0xAAAA,我们就完成了一波喂狗操作。
寄存器
各个寄存器我就不一一介绍了,介绍多了反而繁琐,感兴趣的同学可以去看开发手册,上面非常详细。 但每个寄存器大概是干什么的,我已经在下面标注出来了。
配置(游戏初始化)
好了,我们接下来就来到了配置(游戏初始化)环节 ,在这之前,还是有必要介绍一下如何设置狗饿所需的时间。
超时时间配置
Tout,就是狗饿所需的时间。我们结合代码来讲解一下。比如你想设置1秒狗就会饿,那么可以这样设置:(后面会介绍,别急)
IWDG_Init(3,1000); //与分频数为32,重载值为1000,溢出时间为1s
配置步骤
- 取消寄存器写保护(向 IWDG_KR 写入 0X5555)
- 设置独立看门狗的预分频系数和重装载值
- 重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
- 启动看门狗(向 IWDG_KR 写入 0XCCCC)
- 应用程序喂狗(向 IWDG_KR 写入 0XAAAA)
这个就是游戏初始化了,设置有狗的模式,设置时间,开始游戏,就完了!应该不难,所以,我们马上开始我们的游戏。
代码
#include "iwdg.h"
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写,选择有狗的模式
IWDG_SetPrescaler(prer); //设置IWDG分频系数,通过参数传递,选择时间
IWDG_SetReload(rlr); //设置IWDG装载值,同样是选择时间
IWDG_ReloadCounter(); //reload,先喂一下狗
IWDG_Enable(); //使能看门狗,开始游戏
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload,喂狗
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "iwdg.h"
int main(void)
{
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED端口
KEY_Init(); //初始化按键
delay_ms(500); //延时100ms
IWDG_Init(3,1000); //与分频数为32,重载值为1000,溢出时间为1s
LED1=0; //先点亮绿灯
while(1)
{
if(KEY_Scan(0)==KEY0_PRES)//如果WK_UP按下,则喂狗
{
IWDG_Feed();//喂狗
}
delay_ms(10);
};
}
运行结果
要实现的功能就是,让绿灯一直亮,一旦熄灭,说明游戏失败!
独立看门狗
总结
这是博主第一次使用这种类比游戏的思路来写文章,如果大家觉得好玩或者有收获的话,还希望可以帮我点一个免费的赞,激励博主继续更文,好了,谢谢大家的阅读!
已经把窗口看门狗的文章更出来了,感兴趣的同学可以去看看尝试把窗口看门狗当成游戏中的困难模式来理解