0
点赞
收藏
分享

微信扫一扫

Stm32看门狗概述及案例

知识点1:看门狗概述

解决问题:

MCU 微控制器构成的微型计算机系统中,由于微控制器的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,从而导致程序指针错误、不在程序区、取出错误的程序指令等,都有可能会导致程序执行陷入死循环,程序的正常运行被打断,由微控制器控制的系统无法继续正常工作,导致整个系统的陷入停滞状态,发生不可预料的后果。

看门狗本质:

定时复位电路。

看门狗分类:

独立看门狗(超时复位;如果没有在给定时间内刷新定时器(喂狗),复位;)

窗口看门狗(超时和过早复位;如果没有在给定时间内刷新定时器(喂狗),复位;如果在给定时间之前刷新定时器(喂狗),复位)

知识点2:独立看门狗

由专用的低速时钟(LSI)驱动,即使主时钟发生故障,任能够继续有效。独立看门狗适用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。

特点:

1、8位预分频寄存器(0-255)

2、12位重装载寄存器(0-4095),自由运行的递减计数

3、时钟LSI。

4、看门狗被激活后,则在计数器计数至 0x000 时产生复位

Stm32看门狗概述及案例_看门狗

原理 框图:

Stm32看门狗概述及案例_看门狗_02

使用:

步骤1:创建工程

初始化串口(方便看程序是否重新执行main。)

Stm32看门狗概述及案例_Stm32_03

初始化独立看门狗

Stm32看门狗概述及案例_看门狗_04

步骤2:使用keil打开编译并下载

//在看门狗及串口初始化完成之后,增加
HAL_UART_Transmit(&huart2,(uint8_t *)"main is running",strlen("main is running"),1);
//在头文件位置增加
#include <string.h>

Stm32看门狗概述及案例_寄存器_05

Stm32看门狗概述及案例_初始化_06

步骤3:程序正常执行过程中需要刷新定时器

while (1)
  {
    /* USER CODE END WHILE */
        HAL_Delay(800);
        HAL_IWDG_Refresh(&hiwdg);
    /* USER CODE BEGIN 3 */
  }

Stm32看门狗概述及案例_寄存器_07

知识点3:窗口看门狗

通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。

特点 :

1、由从 APB1 时钟分频后得到的时钟36Mhz驱动,通过可配置的时间窗口来监测应用程序非正常的过迟或过早操作。

2、窗口看门狗最合适那些要求看门狗在精确计时窗口起作用的程序。

3、过早复位:当WDGA=1,且配置寄存器的值<递减计数器的值,且有写入WWDG_CR操作(刷新定时器)。

3、过迟复位:当WDGA=1,且递减计数器的值减到0x3f时;

原理框图:

Stm32看门狗概述及案例_看门狗_08

Stm32看门狗概述及案例_寄存器_09

Stm32看门狗概述及案例_看门狗_10

使用:

窗口看门狗时间计算:

时钟频率=36Mhz.

在无分频的情况下递减一次的时间=4096/36*10^3=0.1137ms

最大超时时间=递减一次的时间*(0x3f+1)=7.28ms

2分频递减一次的时间=4096*2/36*10^3=0.227ms

最大超时时间=递减一次的时间*(0x3f+1)=14.56ms

步骤1:创建工程

初始化串口2,同上一个案例

初始化窗口看门狗

Stm32看门狗概述及案例_初始化_11

步骤2:修改代码,测试时间区间

(42~58刷新没问题,42之前属于过早,58之后属于过晚)。

HAL_UART_Transmit(&huart2,(uint8_t *)"main is running",strlen("main is running"),1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
        HAL_Delay(40);
        HAL_WWDG_Refresh (&hwwdg);
    /* USER CODE BEGIN 3 */
  }

Stm32看门狗概述及案例_初始化_12

举报

相关推荐

0 条评论