STM32
直播中

赵淑洁

7年用户 892经验值
私信 关注
[问答]

请问一下怎样去设计一种窗口看门狗

窗口看门狗有何作用?
WWDG的配置文件是什么?
怎样去设计一种窗口看门狗?

回帖(1)

潘佼佼

2021-8-9 15:53:35
  一,基础知识
  1,简介
  窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗威廉希尔官方网站 在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
  2,看门狗时序图(参考STM32数据参考手册)
  
  
  二,设计过程
  1,开启窗口看门狗的时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
  因为窗口看门狗是挂载到APB1时钟线上的,所以这里使能APB1
  2,设置窗口看门狗的窗口值和预分频系数(在库函数WWDG中调用)
  WWDG_SetWindowValue(wr);//窗口值
  WWDG_SetPrescaler(pres);//预分频系数
  3,使能初始值,设置看门狗计数器的值(要》=0x40,不然会直接复位)
  WWDG_Enable(jishuqi);
  4,清除标志位
  WWDG_ClearFlag();
  5,开启看门狗的中断(开启中断是为了“喂狗”,即在中断的时间内完成计数器的初始化,不然WWDG递减到窗口的下限,则会产生复位)
  WWDG_EnableIT();
  6,配置中断的分组(因为开启了中断)
  NVIC_Init();
  7,编写中断服务函数(在终端服务函数中“喂狗”)
  WWDG_IRQHandler();
  三,WWDG的配置文件
  1,WWDG.H文件
  在这里插入#ifndef __WWDG_h
  #define __WWDG_h
  #include 《sys.h》
  /**
  WWDG_Init(u8 wr,u16 pres);//窗口看门狗初始化函数
  u8 wr:窗口看门狗窗口上限值,下限值为固定的(0x40)
  u8 pres:预分频系数
  */
  void WWDG_Init(u8 wr,u16 pres);
  #endif
  2,WWDG.c文件
  #include 《stm32f10x.h》
  #include 《wwdg.h》
  #include 《led.h》
  u8 jishuqi=0x7f;
  void WWDG_Init(u8 wr,u16 pres){
  NVIC_InitTypeDef NVIC_InitStruct;
  //1,开启窗口看门狗的时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
  //2,设置看门狗的窗口值,预分频系数
  WWDG_SetWindowValue(wr);//窗口值
  WWDG_SetPrescaler(pres);//预分频系数
  //使能看门狗,设置计数器的值
  WWDG_Enable(jishuqi);
  //清除标志位
  WWDG_ClearFlag();
  //设置中断分组
  NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStruct);
  //开启看门狗中断
  WWDG_EnableIT();
  }
  //中断服务函数
  void WWDG_IRQHandler(){
  /**
  注意;这里删除 WWDG_Enable(jishuqi);函数或者将计数器设置为0x3f,
  程序会在计数器完成倒计数后一直复位
  */
  WWDG_Enable(jishuqi);
  WWDG_ClearFlag();
  LED0=!LED0;
  }
  在这里插入代码片
  3,main.c函数调用
  在这里插入代#include 《stm32f10x.h》
  #include “delay.h”
  #include 《led.h》
  #include 《wwdg.h》
  int main(){
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  LED_Init();
  delay_init();
  LED1=0;
  delay_ms(300);
  WWDG_Init(0x5f,WWDG_Prescaler_8);
  while(1){
  LED1=1;
  }
  }
  4,完成后编译,上机调试。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分