stm32F4看门狗——随手笔记

独立看门狗IWDG

在这里插入图片描述
溢出时间=重装载值* 分频系数 * 时钟周期

//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//rlr:自动重装载值,0~0XFFF.
//分频因子=4* 2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).

IWDG函数操作

  • void IWDG_Init(u8 prer,u16 rlr);//IWDG初始化,预分频系数,重装载值
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//rlr:自动重装载值,0~0XFFF.
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
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 "beep.h"
#include "key.h"
#include "iwdg.h"


//ALIENTEK 探索者STM32F407开发板 实验6
//独立看门狗实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司   
//作者:正点原子 @ALIENTEK


int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	LED_Init();				//初始化LED端口
	KEY_Init();		  	//初始化按键
	delay_ms(100);    //延时100ms (为了让眼睛感受到它灭的时间)
	IWDG_Init(4,500); //预分频数为64,重载值为500,溢出时间为1s	
	LED0=0;					  //先点亮红灯
	while(1)
	{
		//不断检测按键是否按下
		if(KEY_Scan(0)==WKUP_PRES)//如果WK_UP按下,则喂狗
		{
			IWDG_Feed();//喂狗
		}
		delay_ms(10);
	};

}

在这里插入图片描述

时钟频率LSI是32k,IWDG_Init(4,500); //预分频数为64,重载值为500,溢出时间为1s根据上表格,PR为4时,预分频数为64,则时钟是32K/64==0.5KHz的计数频率,即一个时钟周期是1/(0.5* 1000)=0.002s=2ms,这时若我们要让最大溢出时间为1s,则设置重装载值为500,则2ms*500=1s

同理,比如要溢出时间为2s,可以是 IWDG_Init(3,2000);也可以是IWDG_Init(4,1000);

在主函数中不断检测按键达到这样的目的:若我们不断按按键,则不断喂狗,最大溢出时间为1s,若没有按键没有喂狗,即超过1s都没有按按键,则会产生复位,则led0会熄灭一下。

窗口看门狗WWDG

它和独立看门狗的区别在于它可以设定喂狗的上限时间
在这里插入图片描述
若在不可喂狗时间(上限时间之前)喂狗,则会产生复位信号

在这里插入图片描述
两种会产生复位的情况:
1、计数器的值大于上窗口的值(上图中T6>W6产生1和启动位1与结果为1)
2、计数溢出还没有喂狗,CNT为3FH,T6位为0,经过或门为1,和动位1与结果为1(如上图笔记)
在这里插入图片描述
另外有一个早期唤醒中断,在计数到0x40的时候产生这个中断,提醒:“你再不喂狗就要复位了!!”的信息,然后便可以在中断处理函数里面喂狗以防止产生复位。

在这里插入图片描述
为什么要窗口看门狗

WWDG函数操作

在这里插入图片描述
在这里插入图片描述
wwdg.c:

#include "wwdg.h"
#include "led.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//看门狗 驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/6/12
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved				
//********************************************************************************
//V1.1 20140504
//增加了窗口看门狗相关函数。
// 

//保存WWDG计数器的设置值,默认为最大. 
u8 WWDG_CNT=0X7F;
//初始化窗口看门狗 	
//tr   :T[6:0],计数器值,初值 
//wr   :W[6:0],窗口值,上窗口值 
//fprer:分频系数(WDGTB),仅最低2位有效 
//Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=42Mhz
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
 
	NVIC_InitTypeDef NVIC_InitStructure;
 
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE); //使能窗口看门狗时钟
	
	WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT. 相与是因为寄存器中计数器只用到了tr中的低7位
	WWDG_SetPrescaler(fprer); //设置分频值/预分频系数
	WWDG_SetWindowValue(wr); //设置窗口值
//	WWDG_SetCounter(WWDG_CNT);//设置计数值
	WWDG_Enable(WWDG_CNT);  //开启看门狗
	
	NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn;  //窗口看门狗中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;  //抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;					//子优先级为3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //使能窗口看门狗
	NVIC_Init(&NVIC_InitStructure);
	
	WWDG_ClearFlag();//清除提前唤醒中断标志位
  WWDG_EnableIT();//开启提前唤醒中断
}



//窗口看门狗中断服务程序 0x40的时候产生该中断
void WWDG_IRQHandler(void)
{
	WWDG_SetCounter(WWDG_CNT); //重设窗口看门狗值
	WWDG_ClearFlag();//清除提前唤醒中断标志位
	LED1=!LED1;//不停喂狗则DS1不停的闪烁
}

main

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "wwdg.h"


//ALIENTEK 探索者STM32F407开发板 实验7
//窗口看门狗实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com
//广州市星翼电子科技有限公司    
//作者:正点原子 @ALIENTEK 

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	LED_Init();				//初始化LED端口
	KEY_Init();		  	//初始化按键
	LED0=0;				   //点亮LED0
	delay_ms(300);//复位后亮300ms
	
	WWDG_Init(0x7F,0X5F,WWDG_Prescaler_8); 	//计数器值为7f,窗口寄存器为5f,分频数为8	   
	
	while(1)
	{
		LED0=1;  //熄灭LED灯
	}
}

实验现象:
本实验, 程序一运行则开启WWDG,并使得DS0亮300ms后关闭,进入死循环。等待WWDG中断的
到来,在中断里面,喂狗,并执行DS1的翻转操作。所以可以看到DS1不停的闪烁,而DS0只在
刚启动的时候闪一下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值