【stm32f407】独立看门狗 iwdog

来源:互联网 发布:网络弊大于利四辩论词 编辑:程序博客网 时间:2024/05/21 06:32

一.独立看门狗

STM32F4的独立看门狗由内部专门的32Khz低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部RC时钟,所以并不是准确的32Khz,而是在15~47Khz之间的一个可变化的时钟,只是我们在估算的时候,以32Khz的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。独立看门狗有几个寄存器与我们这节相关,我们分别介绍这几个寄存器,首先是关键字寄存器IWDG_KR

      

在关键字寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其

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

无论何时,只要关键字寄存器IWDG_KR中被写入0xAAAA IWDG_RLR中的值就会被重新

加载到计数器中从而避免产生看门狗复位 。IWDG_PRIWDG_RLR寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR寄存器中写入0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入0xAAAA)也会启动写保护功能。 接下来,我们介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为4,最高位256,该寄存器是一个32位的寄存器,但是我们只用了最低3位,其他都是保留位,预分频寄存器如下:

在介绍完IWDG_PR之后,我们介绍一下重装载寄存器IWDG_RLR。该寄存器用来保存重

装载到计数器中的值。该寄存器也是一个32位寄存器,但是只有低12位是有效的,如图

只要对以上三个寄存器进行相应的设置,我们就可以启动STM32F4的独立看门狗。独立

看门狗相关的库函数操作函数在文件stm32f4xx_iwdg.c和对应的头文件stm32f4xx_iwdg.h

二.独立看门狗应用

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

通过这步,我们取消IWDG_PRIWDG_RLR的写保护,使后面可以操作这两个寄存器,设置IWDG_PRIWDG_RLR的值。这在库函数中的实现函数是:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

这个函数非常简单,顾名思义就是开启/取消写保护,也就是使能/失能写权限。

2)设置独立看门狗的预分频系数和重装载值设置看门狗的分频系数的函数是:

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

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

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

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

Tout=((4×2^prer)×rlr) /40

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

比如我们设定prer值为4rlr值为625,那么就可以得到Tout=64×625/40=1000ms,这样,看门狗的溢出时间就是1s,只要你在一秒钟之内,有一次写入0XAAAAIWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的是,看门狗的时钟不是准确的40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

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

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

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

通过这句,将使STM32重新加载IWDG_RLR的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。

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

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

IWDG_Enable();//使能IWDG

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

通过上面4个步骤,我们就可以启动STM32F4的看门狗了,使能了看门狗,在程序里面就必须间隔一定时间喂狗,否则将导致程序复位。利用这一点,我们本章将通过一个LED灯来指示程序是否重启,来验证STM32F4的独立看门狗。

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

三.源码

Iwdog.h

#ifndef_IWDOG_H_H_H#define_IWDOG_H_H_H#include"stm32f4xx_iwdg.h"voidIWDG_Init(u8 prer,u16 rlr);//IWDG初始化voidIWDG_Feed(void);  //喂狗函数#endif

Iwdog.c

#include"iwdog.h" voidIWDG_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();       //使能看门狗} voidIWDG_Feed(void){  IWDG_ReloadCounter();//reload}

Main.c

#include"led.h"#include"key.h"#include"delay.h"#include"uart.h"#include"exit.h"#include"iwdog.h"voidUser_Delay(__IO uint32_t nCount){  while(nCount--)  {  }}staticint count = 0;intmain(void){ #if 1 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    LED_Operate(LED_GREEN,LED_ON);    while(1)  {    if(KEY_Scan() == KEY_ON)    {      IWDG_Feed();//喂狗    }    delay_ms(10);  }#endif   }


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我更新目录的时候目录不存在怎么办 如果别人欠我钱不还 我该怎么办 老婆欠信用卡的钱我该怎么办 我欠了很多钱我该怎么办 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办 英雄联盟峡谷之巅资格被收回怎么办 人进监狱之前信用卡没还怎么办 荒野行动资源文件下载卡住了怎么办 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办