[其他ST产品] STM32之关门狗

[复制链接]
2031|62
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:17 | 显示全部楼层
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:17 | 显示全部楼层
生成工程
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:18 | 显示全部楼层
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:18 | 显示全部楼层
main函数编写
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:18 | 显示全部楼层
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * Copyright (c) 2023 STMicroelectronics.
  10.   * All rights reserved.
  11.   *
  12.   * This software is licensed under terms that can be found in the LICENSE file
  13.   * in the root directory of this software component.
  14.   * If no LICENSE file comes with this software, it is provided AS-IS.
  15.   *
  16.   ******************************************************************************
  17.   */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "iwdg.h"
  22. #include "gpio.h"

  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */

  25. /* USER CODE END Includes */

  26. /* Private typedef -----------------------------------------------------------*/
  27. /* USER CODE BEGIN PTD */

  28. /* USER CODE END PTD */

  29. /* Private define ------------------------------------------------------------*/
  30. /* USER CODE BEGIN PD */
  31. /* USER CODE END PD */

  32. /* Private macro -------------------------------------------------------------*/
  33. /* USER CODE BEGIN PM */

  34. /* USER CODE END PM */

  35. /* Private variables ---------------------------------------------------------*/

  36. /* USER CODE BEGIN PV */

  37. /* USER CODE END PV */

  38. /* Private function prototypes -----------------------------------------------*/
  39. void SystemClock_Config(void);
  40. /* USER CODE BEGIN PFP */

  41. /* USER CODE END PFP */

  42. /* Private user code ---------------------------------------------------------*/
  43. /* USER CODE BEGIN 0 */


  44. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  45. {
  46.     //按键PA0触发的中断
  47.     if(GPIO_Pin == GPIO_PIN_0){
  48.         HAL_Delay(50);
  49.         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){
  50.             HAL_IWDG_Refresh(&hiwdg);//喂狗
  51.         }
  52.     }
  53. }

  54. /* USER CODE END 0 */

  55. /**
  56.   * @brief  The application entry point.
  57.   * @retval int
  58.   */
  59. int main(void)
  60. {
  61.   /* USER CODE BEGIN 1 */

  62.   /* USER CODE END 1 */

  63.   /* MCU Configuration--------------------------------------------------------*/

  64.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  65.   HAL_Init();

  66.   /* USER CODE BEGIN Init */

  67.   /* USER CODE END Init */

  68.   /* Configure the system clock */
  69.   SystemClock_Config();

  70.   /* USER CODE BEGIN SysInit */

  71.   /* USER CODE END SysInit */

  72.   /* Initialize all configured peripherals */
  73.   MX_GPIO_Init();
  74.   MX_IWDG_Init();
  75.   /* USER CODE BEGIN 2 */

  76.     HAL_NVIC_SetPriority(SysTick_IRQn,0,0);  //把滴答定时器的抢占优先级和响应优先级都设置为最高

  77.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
  78.     HAL_Delay(500);
  79.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);
  80.     HAL_Delay(500);
  81.    
  82.   /* USER CODE END 2 */

  83.   /* Infinite loop */
  84.   /* USER CODE BEGIN WHILE */
  85.   while (1)
  86.   {
  87.     /* USER CODE END WHILE */

  88.     /* USER CODE BEGIN 3 */
  89.         //如果没喂狗的话,就不会执行该循环,即灯不会常亮
  90.         HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);
  91.    
  92.     }
  93.   /* USER CODE END 3 */
  94. }

  95. /**
  96.   * @brief System Clock Configuration
  97.   * @retval None
  98.   */
  99. void SystemClock_Config(void)
  100. {
  101.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  102.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  103.   /** Initializes the RCC Oscillators according to the specified parameters
  104.   * in the RCC_OscInitTypeDef structure.
  105.   */
  106.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  107.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  108.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  109.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  110.   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  111.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  112.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  113.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  114.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  115.   {
  116.     Error_Handler();
  117.   }

  118.   /** Initializes the CPU, AHB and APB buses clocks
  119.   */
  120.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  121.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  122.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  123.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  124.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  125.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  126.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  127.   {
  128.     Error_Handler();
  129.   }
  130. }

  131. /* USER CODE BEGIN 4 */

  132. /* USER CODE END 4 */

  133. /**
  134.   * @brief  This function is executed in case of error occurrence.
  135.   * @retval None
  136.   */
  137. void Error_Handler(void)
  138. {
  139.   /* USER CODE BEGIN Error_Handler_Debug */
  140.   /* User can add his own implementation to report the HAL error return state */
  141.   __disable_irq();
  142.   while (1)
  143.   {
  144.   }
  145.   /* USER CODE END Error_Handler_Debug */
  146. }

  147. #ifdef  USE_FULL_ASSERT
  148. /**
  149.   * @brief  Reports the name of the source file and the source line number
  150.   *         where the assert_param error has occurred.
  151.   * @param  file: pointer to the source file name
  152.   * @param  line: assert_param error line source number
  153.   * @retval None
  154.   */
  155. void assert_failed(uint8_t *file, uint32_t line)
  156. {
  157.   /* USER CODE BEGIN 6 */
  158.   /* User can add his own implementation to report the file name and line number,
  159.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  160.   /* USER CODE END 6 */
  161. }
  162. #endif /* USE_FULL_ASSERT */
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:18 | 显示全部楼层
窗口看门狗
窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:22 | 显示全部楼层
窗口看门狗的本质 80752650a8f8a786ac.png
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:22 | 显示全部楼层
是一个能产生系统复位信号和提前唤醒中断的6位计数器。

产生复位条件:

当递减计数器值递减减到0x3F时复位(即T6位跳变到0)

窗口值在0x3F~W[6:0](0x7F)之间,不在窗口值内喂狗就会复位

产生中断条件:

当计数器递减到0x40时可以产生提前唤醒中断(EWI)。

在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗。
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:23 | 显示全部楼层
窗口看门狗的时钟
窗口看门狗使用了RCC的时钟PCLK1,最高为36MHz
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:24 | 显示全部楼层
窗口看门狗框图 56652650a9000b3efa.png
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:24 | 显示全部楼层
控制寄存器(WWDG_CR)
7767650a90183841f.png 控制窗口关门狗是否开启和配置窗口关门狗计数器初始值。

当计数器值从40h变为3Fh时(T6变成0),产生看门狗复位。

 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:26 | 显示全部楼层
配置寄存器(WWDG_CFR) 22175650a90a4bde60.png 配置窗口关门狗的窗口上限值和配置预分频器系数值

窗口看门狗的溢出时间
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:27 | 显示全部楼层
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:32 | 显示全部楼层
状态寄存器(WWDG_SR) 1188650a91d462f42.png 配置窗口看门狗的提前唤醒中断。
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:33 | 显示全部楼层
窗口看门狗实验
开启窗门看门狗,计数器值设置为0x7F(127),窗口值设置为0x5F(95),预分频器的时基为8,。不喂狗时反复执行main函数,导致LED1闪烁,喂狗时只执行一次main函数,LED1常亮。在提前唤醒中断服务函数进行喂狗,防止程序复位,LED1常亮,同时翻转LED2的状态。

43296650a9227a92a3.png
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:33 | 显示全部楼层
窗口看门狗喂狗函数HAL_StatusTypeDef HAL_WWDG_Refresh()
原型:HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)

参数:
WWDG_HandleTypeDef *hwwdg:窗门看门狗句柄

实例:HAL_WWDG_Refresh(hwwdg);
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:34 | 显示全部楼层
使用STM32CubeMX创建工程
配置SYS 58226650a9261ea025.png
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:34 | 显示全部楼层
配置RCC
42056650a927c7f638.png
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:35 | 显示全部楼层
 楼主| 烟雨蒙蒙520 发表于 2023-9-20 14:36 | 显示全部楼层
配置GPIO
PB9、PB8都配置为输出高电平
76601650a92d4db94c.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部