基于正点原子的mini板的独立看门狗的学习

本篇文章将讲述独立看门狗的相关知识,如果只想看代码的话,可以直接翻到最后。

目录

一、独立看门狗的概述

二、独立看门狗实验


一、独立看门狗的概述

(1)为什么需要看门狗?

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生一种专门用于监测单片机程序的运行状态的模块或芯片,俗称“看门狗”。

(2)解决的问题:

(1)在启动正常运行的时候,系统不能复位,在系统跑飞的情况或者程序异常执行的情况,系统复位,程序重新执行。

(3)STM32的内置两个看门狗:

1.独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效(适用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合)

2.窗口看门狗由APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。(最适合那些要求看门狗在精确计时窗口起作用的程序)

(4)独立看门狗功能的描述

1.在键值寄存器(IWDG_KR)中写入0XCCCC,开始启用独立看门狗。此时计数器开始从其复位值0XFFF递减,当计数器值技术到尾值0X000时会产生一个复位信号(IWDG_RESET)。

2.无论何时,只要在键值寄存器IWDG_KR中写入0XAAAA(通常说的喂狗),自动重装载寄存器IWDG_KR中写入0XAAAA(通常说的喂狗),自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。

3.如果程序异常,就无法正常喂狗,从而系统复位。

二、独立看门狗实验

(1)整体思路:

1.取消寄存器写保护(向 IWDG_KR 写入 0X5555) 

在库函数中的实现函数是:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 

2.设置独立看门狗的预分频系数和重装载值 

设置看门狗的分频系数的函数是: 

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 

设置看门狗的重装载值的函数是:

void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值 

设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间(也就是看门狗溢
出时间),该时间的计算方式为: 
Tout=((4×2^prer) ×rlr) /40

3.重载计数值喂狗(向 IWDG_KR 写入 0XAAAA) 

库函数里面重载计数值的函数是: 

IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器 

4.启动看门狗(向 IWDG_KR 写入 0XCCCC)

库函数里面启动独立看门狗的函数是:

IWDG_Enable(); //使能 IWDG

[注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。]

(2)现象:在配置看门狗后,DS0 将常亮,如果 WK_UP 按键按下,就喂狗,只要 WK_UP 不停的按,看门狗就一直不会产生复位,保持 DS0 的常亮,一旦超过看门狗定溢出时间(Tout)还没按,那么将会导致程序重启,这将导致 DS0 熄灭一次。

(5)看门狗实验

在main.c的文件里:

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "led.h"  
#include "key.h"  
#include "wdg.h" 


int main(void)
{			
 	Stm32_Clock_Init(9); 
	delay_init(72);	     
	uart_init(72,9600);  
	LED_Init();		  	
	KEY_Init();       	 
	delay_ms(300);   	
	IWDG_Init(4,625);    	   
	LED0=0;				 
	while(1)
	{
		if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();
		delay_ms(10);
	};
}

在wdg.c里的文件是:

#include "wdg.h"
 

void IWDG_Init(u8 prer,u16 rlr) 
{
	IWDG->KR=0X5555;	 										  
  	IWDG->PR=prer;   
  	IWDG->RLR=rlr;    
	IWDG->KR=0XAAAA;											   
  	IWDG->KR=0XCCCC;	
}

void IWDG_Feed(void)
{
	IWDG->KR=0XAAAA;//reload											   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值