使用的是正点原子的精英版,单片机是STM32F103ZET6,目的:验证是否在窗口期喂狗,可不执行复位。预设:计数器值为0x7F,窗口值为0x5F,预分频系数为8。
窗口看门狗的原理
窗口看门狗:本质也是个递减的计数器,并且它能产生系统复位信号和提前唤醒中断。
窗口看门狗的特点
当递减计数器值从 0x40减到0x3F时复位(即T6位跳变到0);
计数器的值大于W[6:0]值时喂狗会复位;
当递减计数器等于 0x40 时可产生提前唤醒中断(EWI);
在窗口期内重装载计数器的值(喂狗),防止复位;
作用:用于监测单片机程序运行时效是否精准,主要检测软件异常 。
下面是窗口看门狗超时时间的计算公式
IWDG和WWDG的主要区别
接下来是实战的讲解部分 ,公式部分为求得窗口时间:
Tout={4096*预分频系数8*[(0x7F-0x5F)十六进制结果为20转化为十进制是32]}/36KHZ
29.13={4096*8*[32]}/36000000
确定好各值之后,复制上节课代码 ,打开图形化配置 ,按照图片进行配置,然后生成代码即可
先把独立看门狗勾掉,选择窗口看门狗按照图中配置生成代码即可
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "wwdg.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8_t revbuf[6];//定义接受变量6个字节
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_WWDG_Init();
/* USER CODE BEGIN 2 */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)//判断是否是窗口看门狗导致复位
{
printf("窗口看门狗复位!! \r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();//清除复位标志位
}
else
{
printf("其他复位!! \r\n");
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(40);//为防止复位,需在此时间段内喂狗:58.25>喂狗时间>29.13
HAL_WWDG_Refresh(&hwwdg);//喂狗
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
在此时间段内喂狗:58.25>喂狗时间>29.13,将代码下载进去之后,按着板子上的复位按键,打开串口,然后松开复位按键,串口会显示其他复位说明在窗口期间喂狗正常没有产生复位 。
如果在此时间段:58.25>喂狗时间>29.13之外喂狗的话就会显示窗口看门狗复位,因为没有在此时间内喂狗。
即可完成验证是否在窗口期喂狗,可不执行复位。预设:计数器值为0x7F,窗口值为0x5F,预分频系数为8。