STM32
直播中

xymbmcu

12年用户 1025经验值
擅长:可编程逻辑
私信 关注
[问答]

IWDG独立看门狗与WWDG窗口看门狗开发指南

有关IWDG独立看门狗的相关知识有哪些?
有关WWDG窗口看门狗的相关知识有哪些?

回帖(1)

邢待湘

2021-9-23 10:59:54
  
  
  
  
  main函数
  #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);
  };
  }
  iwdg.c函数
  #include “wdg.h”
  //初始化独立看门狗
  //prer:分频数:0~7(只有低3位有效!)
  //分频因子=4*2^prer.但最大值只能是256!
  //rlr:重装载寄存器值:低s11位有效。
  //时间计算(大概):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
  }
  WWDG窗口看门狗
  
  
  
  
  
  
  main函数
  #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);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  uart_init(115200); //串口初始化为115200
  LED_Init(); //led初始化
  KEY_Init(); //按键初始化
  LED0=0; //led0亮
  delay_ms(300);
  WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8
  while(1)
  {
  LED0=1; //led0灭,如果按时喂狗则一直在死循环里面led0灭,如果复位则led0亮且延时300ms
  }
  }
  wwdg.c函数
  #include “wdg.h”
  #include “led.h”
  //保存WWDG计数器的设置值,默认为最大。
  u8 WWDG_CNT=0x7f;
  //初始化窗口看门狗
  //tr :T[6:0],计数器值
  //wr :W[6:0],窗口值
  //fprer:分频系数(WDGTB),仅最低2位有效
  //Fwwdg=PCLK1/(4096*2^fprer)。
  void WWDG_Init(u8 tr,u8 wr,u32 fprer)
  {
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG时钟使能
  WWDG_CNT=tr&WWDG_CNT; //初始化WWDG_CNT.
  WWDG_SetPrescaler(fprer);设置IWDG预分频值
  WWDG_SetWindowValue(wr);//设置窗口值
  WWDG_Enable(WWDG_CNT); //使能看门狗 , 设置 counter 。
  WWDG_ClearFlag();//清除提前唤醒中断标志位
  WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
  WWDG_EnableIT(); //开启窗口看门狗中断
  }
  //重设置WWDG计数器的值
  void WWDG_Set_Counter(u8 cnt)
  {
  WWDG_Enable(cnt);//使能看门狗 , 设置 counter 。
  }
  //窗口看门狗NVIC配置
  void WWDG_NVIC_Init()
  {
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占2,子优先级3,组2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占2,子优先级3,组2
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);//NVIC初始化
  }
  //窗口看门狗中断服务程序
  void WWDG_IRQHandler(void)
  {
  WWDG_SetCounter(WWDG_CNT); //喂狗,当禁掉此句后,窗口看门狗将产生复位
  WWDG_ClearFlag(); //清除提前唤醒中断标志位
  LED1=!LED1; //LED1状态翻转
  }
  独立看门狗和窗口看门狗都属于STM32的内部资源,只要软件设置好即可工作。
举报

更多回帖

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