嵌入式系统学习笔记之“独立看门狗”——STM32(九)

目录

一、实验目的

二、实验原理

2.1独立看门狗(IWDG)简介

2.2独立看门狗应用场合

2.3独立看门狗时钟

三、独立看门狗相关寄存器

3.1独立看门狗框图

3.2键寄存器(IWDG_KR)

3.3预分频寄存器(IWDG_PR)

3.4重装载寄存器(IWDG_RLR)

3.5状态寄存器(IWDG_SR)

四、代码展示

       4.1 main.c

       4.2 wdg.c

       4.3 wdg.h

五、实验结果

六、心得体会


一、实验目的

        本实验旨在通过使用STM32F103ZET6单片机实现独立看门狗(Independent Watchdog,IWDG)功能,加深对STM32单片机看门狗原理及操作的理解,并掌握看门狗在嵌入式系统中的应用。

二、实验原理

2.1独立看门狗(IWDG)简介

        首先我们得讲解一下看门狗的原理。这个百度百科里面有很详细的解释。我们总结一下:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号)。 

  STM32F103ZET6的独立看门狗(IWDG)是由内部LSI(内部约40KHZ低速时钟)时钟驱动的。由于IWDG是由内部低速时钟驱动,所以就算主时钟发生故障,IWDG依然能够工作。

  由于LSI是一个内部RC时钟,所以时钟不是很准确的40KHZ,而是在30KHZ~60KHZ之间变化的时钟,所以IWDG时间的计算并不是很准确,只能是一个大概的值。一般用40KHZ来估算。

  IWDG的计数器是一个递减计数器,当IWDG被激活后,计数器开始向下递减计数,当计数器计数至0x0000时产生复位信号,使芯片复位。

  当芯片处于停止和待机模式下工作时,IWDG依然继续工作。

2.2独立看门狗应用场合

由于独立看门狗时钟源由LSI时钟提供,并不精确,所以IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。

2.3独立看门狗时钟

三、独立看门狗相关寄存器

3.1独立看门狗框图

3.2键寄存器(IWDG_KR)

        ①IWDR_KR寄存器是只写寄存器
        ②IWDR_KR写入0XAAAA,才算“喂狗”,且一定时间间隔必须写入,否则程序复位
        ③IWDR_KR写入0X5555表示允许访问IWDG_PR和IWDG_RLR寄存器,未写入时这两个寄存器处于保护状态,无法进行写操作
        ④IWDR_KR写入0XCCCC,启动看门狗 

3.3预分频寄存器(IWDG_PR)

        该寄存器是只有低3位有效的32位寄存器,之前的IWDG_KR寄存器中也强调过,要对IWDG_PR寄存器操作,必须先对IWDG_KR写入0x5555。

        我们知道,独立看门狗的时钟是40KHZ的LSI,经过本寄存器设置预分频系数后,独立看门狗的时钟会变为40KHZ/预分频因子。

 

3.4重装载寄存器(IWDG_RLR)

        该寄存器并不像SysTick定时器的重装载寄存器一样,该寄存器不需要手动装载初值,只需设置好装载值后,每次给IWDG_KR寄存器写入0xAAAA,即可装载初值。 

3.5状态寄存器(IWDG_SR)

        该寄存器只有位0和位1有效,位0指示预分频值更新、位1指示重装载值更新;置1时表示正在更新,置0时表示更新完成。 

四、代码展示

       4.1 main.c

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

 


 int main(void)
 {		
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();		  	 //初始化与LED连接的硬件接口
	KEY_Init();          //按键初始化	 
	delay_ms(500);   	 //让人看得到灭
	IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s	   
	LED0=0;				 //点亮LED0
	while(1)
	{
		if(KEY_Scan(0)==WKUP_PRES)
		{
			IWDG_Feed();//如果WK_UP按下,则喂狗
		}
		delay_ms(10);
	};	 
}
  

       4.2 wdg.c

#include "wdg.h"


//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/40 (ms).
void IWDG_Init(u8 prer,u16 rlr) 
{	
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作
	
	IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64
	
	IWDG_SetReload(rlr);  //设置IWDG重装载值
	
	IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器
	
	IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{   
 	IWDG_ReloadCounter();//reload										   
}


        4.3 wdg.h

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



void IWDG_Init(u8 prer,u16 rlr);
void IWDG_Feed(void);

#endif

五、实验结果

实验效果如下面视频所示:

        不按键时led灯闪烁;当WK_UP按下,则喂狗。

独立看门狗

六、心得体会

        通过本次实验,我深入了解了STM32F103ZET6单片机的独立看门狗(IWDG)功能及其应用原理。掌握了独立看门狗的配置方法和使用技巧,对于提高嵌入式系统的稳定性和可靠性有了更深入的认识。通过实验,我意识到了独立看门狗在嵌入式系统中的重要性,以及如何在实际项目中合理地应用独立看门狗功能。在以后的实际开发中,我将更加注重系统的稳定性设计,充分利用独立看门狗等硬件保护机制,确保系统的可靠运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值