stm32 独立看门狗IWDG实验

STM32的独立看门狗由40KHz低速时钟驱动,即使主时钟故障仍能工作。看门狗通过IWDG_KR、IWDG_PR和IWDG_RLR寄存器进行配置,计数器递减,溢出时触发复位。通过库函数如IWDG_Enable()、IWDG_SetPrescaler()和IWDG_ReloadCounter()进行设置和喂狗操作。实验部分涉及硬件IO口和按键交互。
摘要由CSDN通过智能技术生成

目录

一,简介

 二,寄存器介绍

 三,溢出时间

四,库函数部分


一,简介

1)STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然
有效。独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是
在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看
门狗对时间的要求不是很精确,所以,时钟有些偏差。
2)在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗(第一步,启动看门狗);

此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。

无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA(称为喂狗), IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位。

 二,寄存器介绍

健值寄存器IWDG_KR 0~15位有效

预分频寄存器IWDG_PR  0~2位有效 (具有写保护功能)

重装载寄存器IWDG_RLR 0~11位有效(具有写保护功能)

状态寄存器IWDG_SR 0~1位有效

(IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向
IWDG_KR 寄存器中写入 0x5555。 将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新
被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。)

 健值寄存器IWDG_KR

预分频寄存器IWDG_PR

 重装载寄存器IWDG_RLR

 状态寄存器IWDG_SR

 

 三,溢出时间


Tout=((4× 2^prer) × rlr) /40
其中 Tout 为看门狗溢出时间(单位为 ms); prer 为看门狗时钟预分频值(IWDG_PR 值)范围为 0~7; rlr 为看门狗的重装载值(IWDG_RLR 的值);

(注意,由于看门狗时钟不是准确值,所以不能太晚喂狗不然可能会复位!!!)

四,库函数部分

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 重装载值

3)重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)
IWDG_ReloadCounter(void); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器(喂狗)

4) 启动看门狗(向 IWDG_KR 写入 0XCCCC)
IWDG_Enable(); //使能 IWDG

 注意 IWDG 在一旦启用,就不能再被关闭。想要关闭,只能重启。

五,实验部分

1)硬件部分

使用了指示灯 DS0 ,WK_UP按键和独立看门狗

需要 2 个 IO 口,一个用来输入喂狗信号,另外一个用来指示程序是否重启。WK_UP 键喂狗,DS0 来指示程序重启。

2)软件部分

a)工程文件

 b)代码

IWDG.C

#include "IWDG.H"

void IWDG_Init(u8 prer,u16 rlr) //分频和重装载值
{
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	IWDG_SetPrescaler(prer);
	IWDG_SetReload(rlr);
	IWDG_ReloadCounter();//喂狗
	IWDG_Enable();
}

IWDG.h

#ifndef  __IWDG_H__
#define  __IWDG_H__
#include "sys.h"

void IWDG_Init(u8 prer,u16 rlr);

#endif 

main.c

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "LED.H"
#include "iwdg.h"
int main(void)
 {	
		delay_init();	    	 //延时函数初始化	  
		LED_Init();		  	 	//初始化与LED连接的硬件接口
		KEY_Init();          	//初始化与按键连接的硬件接口
		
		delay_ms(200);
		LED0=0;					//点亮LED
	  IWDG_Init(4,625);
	while(1){
		if(KEY_Scan(0)==WKUP_PRES)
		{
			IWDG_ReloadCounter();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值