当前位置:首页 > 技术 > Cortex-M3 > 正文内容

STM32CubeMX系列教程15:看门狗(WDG)

Watrt7年前 (2017-12-16)Cortex-M318250
一、看门狗简介
        看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。

独立看门狗(IWDG)
         前文再续,书接上一会,上一章说到待机模式可以通过IWDG唤醒,独立看门口功能框图如下。实际上独立看门口狗就是一个递减计数器,当计时器的值减到0时,IWDG会产生一个复位信号,系统复位重新启动。为避免产生看门狗复位,则需在计数器减到0之前重载计数器,即“喂狗”。当程序出错时没有刷新计数器,计数器递减到0,系统复位重新启动,避免程序继续错误运行。

    本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启独立看门狗(IWDG)。
  

        IWDG参数配置如下。IWDG的时钟为32kHz,此时设置计数器时钟为32分频,则分频后的时钟频率为1KHz.递减基础器重载值(down-counter reload value)配置为1000,即1000ms不刷新IWDG系统复位。IWDG窗口值(windows value)为默认不修改。当计数器的值大于窗口值时,如果执行重载操作,则会产生复位。

生成报告以及代码,编译程序。在iwdg.c文件中可以看到IWDG初始化函数。在stm32f7xx_hal_iwdg.h头文件中可以看到IWDG的操作函数。

在main()函数中开启IWDG.

/* USER CODE BEGIN 2 */
  /* Start the IWDG */
  HAL_IWDG_Start(&hiwdg);
  printf("\n\r***** WaveShare Open7XXI-C Board *****\n\r");
/* USER CODE END 2 */


在while循环中每延时800ms刷新一次IWDG,重载计数器。

/* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
       /* Set counter reload value to obtain 1000ms IWDG TimeOut.
       IWDG counter clock Frequency = LsiFreq / 32
       Counter Reload Value = 1000  */
       printf("\n\r Refreshes the IWDG !!!\n\r");
       /* Refresh IWDG: reload counter */
       HAL_IWDG_Refresh(&hiwdg);
       HAL_Delay(800);
 }
/* USER CODE END 3 */


编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。


当在while循环中注释掉HAL_IWDG_Refresh(&hiwdg)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每1000ms复位重启一次。


再实际应用中,独立看门狗刷新操作不会再while循环中,而且也不好计算时间。一般都是通过定时器中断处理函数中刷新IWDG。

窗口看门狗(WWDG)

   窗口看门狗相对独立看门狗对计数器的刷新时间要求更加严格。必须在限定的时间窗口内刷新计数器。

窗口看门狗激活情况下,满足以下条件会产生复位。
    1.当递减计数器的值小于0x40时(即从0x40滚到0x3F)会产生复位。
    2.当计数器值大于窗口寄存器的值时,如果软件重载计数器,则会产生复位。

        从上面的时序图中可以看到,如果递减计数器的值(T[6:0])大于窗口寄存器(W[6:0])的值,重载计数器会产生复位。当递减计时器的值小于0x40时,也会产生复位。所以只能在W[6:0] ~ 0x3F之间刷新,在窗口之外重载递减计数器时复位。存储在窗口寄存器(WWDG_CR)中的值必须介于0xFF和0xC0之间。开启窗口看门狗中断时,当递减计数器的值等于0x40时触发中断。
       复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启窗口看门狗(WWDG)。



配置WWDG计数器预分频为8,窗口寄存器的值为90,递减计数器刷新值为127。


WWDG时钟是挂接到APB1上,系统时钟为216MHz时,PCLK1时钟为54MHz。
则WWDG计数器的频率为:(PCLK1 (54MHz)/4096)/8) = 1648 Hz (~607 us) 
WWDG计数器刷新值为127,则超时时间为:~607 us * (127-63) = 39 ms


开启窗口看门狗中断。

生成报告以及代码,编译程序。在wwdg.c文件中可以看到WWDG初始化函数。在stm32f7xx_hal_wwdg.h头文件中可以看到IWDG的操作函数。

在main()函数中开启IWDG.

/* USER CODE BEGIN 2 */
  /*##-1- Start the WWDG #####################################################*/ 
  HAL_WWDG_Start_IT(&hwwdg);
  printf("\n\r***** WaveShare Open7XXI-C Board *****\n\r");
/* USER CODE END 2 */

在while循环中每延时1000ms输出一次信息。

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
      printf("\n\r www.waveshare.net !!!\n\r");
      HAL_Delay(1000);
}
/* USER CODE END 3 */

在main.c文件后面添加WWDG中断回调函数,当递减计数器的值为0x40触发中断,中断处理函数中刷新WWDG。

/* USER CODE BEGIN 4 */
/**
  * @brief  Early Wakeup WWDG callback.
  * @param  hwwdg: pointer to a WWDG_HandleTypeDef structure that contains
  *              the configuration information for the specified WWDG module.
  * @retval None
  */
void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_WWDG_WakeupCallback could be implemented in the user file
   */
    /*##-2- Refresh the WWDG #####################################################*/ 
    HAL_WWDG_Refresh(hwwdg, 127);
}
/* USER CODE END 4 */


编译程序并下载到开发板。打开串口调试助手,设置波特率为115200,串口助手上面会显示如下信息。


当在WWDG中断回调函数中注释掉HAL_WWDG_Refresh(hwwdg, 127)语句,不刷新计数器。重新编译程序时串口会输出如下信号,由于不刷新计数器,独立看门狗每39ms复位重启一次。


分享给朋友:

相关文章

STM32CubeMX系列教程13:实时时钟(RTC)

STM32CubeMX系列教程13:实时时钟(RTC)

1.RTC简介        实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。        两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12...

STM32CubeMX系列教程16:RNG和CRC

STM32CubeMX系列教程16:RNG和CRC

一、随机数发生器(RNG)    RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数。    复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,激活随机数发生器(RNG)。配置RNG时钟为48MHz。RNG没有参数配置。生成报告以及代码,编译程序。在iwdg.c文件中可以看到RNG初始化函数。在stm32f7xx_h...

STM32CubeMX系列教程22:LCD-TFT控制器(LDTC)

STM32CubeMX系列教程22:LCD-TFT控制器(LDTC)

一、LTDC简介        LCD-TFT(液晶显示器 —— 薄膜晶体管)显示器控制器提供并行数字 RGB(红色、绿色、蓝色)以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD和 TFT 面板的接口。本章通过Open746I-C开发板控制微雪7inch Capacitive Touch LCD (F)型LCD。其原理图如下:(注:本章介绍的是通过LDTC控制RGB接...

STM32CubeMX系列教程23:LCD触摸控制

STM32CubeMX系列教程23:LCD触摸控制

一、触摸芯片简介      7inch Capacitive Touch LCD (F)  是电容触摸屏,触控芯片是GT811,如下为GT811的中文数据手册。gt811_cn.pdfGT811可同时识别5个触摸点位的实时位置,移动轨迹及触摸面积。其管脚定义如下。参考应用电路如下图,实际上我们在使用的时候只需关心四个引脚即可。I2C_SDA,I2C_SCL为I2C通信引脚,/RSTB为系统复位引脚,INT为中断信号引脚,但有触摸时,INT输出触发...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。