STM32
直播中

话多显蠢

9年用户 848经验值
擅长:479461
私信 关注
[问答]

使用窗口看门狗有哪些注意事项

窗口看门狗是如何工作的?
如何去计算窗口看门狗的超时时间?
使用窗口看门狗有哪些注意事项?

回帖(1)

吕聪

2021-9-23 11:24:06
  窗口看门狗:
  之所以称为窗口是因为其喂狗时间是一个有上下限的范围内(窗口),你可以通过设定相关寄存器,设定其上限时间(下限固定)。喂狗的时间不能过早也不能过晚。
  而独立看门狗限制喂狗时间在0-x内,x由相关寄存器决定。喂狗的时间不能过晚。
  窗口看门狗框图:
  
  在图中,我们可以观察到,有两种情况可以导致系统复位。第一种情况就是,当计数器的值大于配置寄存器设置的窗口上限值时进行了喂狗操作;第二种情况就是,看门狗控制寄存器的T6位变成了低电平(也就是计数值由0x40变为了0x3F)
  窗口看门狗工作示意图:
  
  另外,如果开启了看门狗并且允许了中断,当计数器等于0x40时产生早起唤醒中断EWI,它可以用于喂狗以避免WWDG复位。
  窗口看门狗超时时间的计算:
  
  
  (窗口看门狗其他注意事项:)
  1. 上窗口值W[6:0]必须大于下窗口值0x40。否则就无窗口了。
  2. 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。
  接下来介绍对应的寄存器:
  1.控制寄存器WWDG_CR
  
  2.配置寄存器WWDG_CFR
  
  3.状态寄存器WWDG_SR
  
  WWDG操作的HAL库函数:
  1. HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg);
  2. void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg);
  3. HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg);
  4. HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg);
  5. HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg);
  6. void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg);
  7. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg);
  窗口看门狗配置过程:
  1.使能窗口看门狗时钟:在HAL_WWDG_MspInit函数中。
  2.初始化窗口看门狗:设置分频系数,窗口值,计数值等。
  HAL_WWDG_Init(); 该函数还可以使能窗口看门狗提前唤醒中断 。
  3.设置提前唤醒中断优先级:HAL_WWDG_MspInit
  4.编写提前唤醒中断处理函数: HAL_WWDG_EarlyWakeupCallback();
  喂狗: HAL_WWDG_Refresh();
  例程:
  WWDG_HandleTypeDef WWDG_Handler;
  void WWDG_Init(u8 tr,u8 wr,u32 fprer)
  {
  WWDG_Handler.Instance=WWDG;
  WWDG_Handler.Init.Prescaler=fprer;
  WWDG_Handler.Init.Window=wr;
  WWDG_Handler.Init.Counter=tr;
  WWDG_Handler.Init.EWIMode=WWDG_EWI_ENABLE ;
  HAL_WWDG_Init(&WWDG_Handler);
  }
  void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
  {
  HAL_RCC_WWDG_CLK_ENABLE();
  HAL_NVIC_SetPriority(WWDG_IRQn,2,3);
  HAL_NVIC_EnableIRQ(WWDG_IRQn);
  }
  void WWDG_IRQHandler(void)
  {
  HAL_WWDG_IRQHandler(&WWDG_Handler);
  }
  void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
  {
  HAL_WWDG_Refresh(&WWDG_Handler);
  LED1_Toggle;
  }
举报

更多回帖

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