汕头网站优化公司,百度关键词搜索优化,郴州市做网站,社交网站开发流程看门狗介绍在由单片机构成的微型计算机系统中#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰#xff0c;造成程序的跑飞#xff0c;而陷入死循环#xff0c;程序的正常运行被打断#xff0c;由单片机控制的系统无法继续工作#xff0c;会造成整个系统的陷入…看门狗介绍在由单片机构成的微型计算机系统中由于单片机的工作常常会受到来自外界电磁场的干扰造成程序的跑飞而陷入死循环程序的正常运行被打断由单片机控制的系统无法继续工作会造成整个系统的陷入停滞状态发生不可预料的后果所以出于对单片机运行状态进行实时监测的考虑便产生了一种专门用于监测单片机程序运行状态的模块或者芯片俗称“看门狗“(watchdog)。有一个程序员叫张三老板养了一条狗用来监督张三持续工作张三需要定时喂养这条狗以确保老板知道自己一直在努力工作如果有一次没有喂养这条狗那么狗就会反骨咬死张三张三就会重新升天投胎为程序员继续工作同时老板还是派这条狗来监督张三的工作张三同样也需要定时喂养他往复持续。独立看门狗IWDG独立看门狗工作在主程序之外能够完全独立工作它的时钟是专用的低速时钟(LSI)由VDD电压供电在停止模式和待机模式下仍能工作。独立看门狗的本质独立看门狗是一个12位的递减计数器当计数器的值从某个值一直减到0的时候系统就会产生-个复位信号即IWDG_RESET。如果在计数没减到0之前刷新了计数器的值的话那么就不会产生复位信号这个动作就是我们经常说的喂狗。独立看门狗的时钟独立看门狗的时钟由独立的RC振荡器LSI提供即使主时钟发生故障它仍然有效非常独立。启用IWDG后LSI时钟会自动开启。MCU内部的RC频率会在30kHz到60kHz之间变化因此 LSI时钟频率并不精确一般设定为40kHz。LSI经过一个8位的预分频器得到计数器时钟。想要获得独立看门狗相对精准的超时时间可以对LSI进行校准独立看门狗框图键寄存器IWDG_KR独立看门狗的控制寄存器主要有三种控制方式。预分频寄存器IWDG_PR分频系数算法PSC 4 * 2^prerprer是IWDG_PR的值即当IWDG_PR为010时即prer为2重装载寄存器IWDG_RLR用于存放重装载值最大值为4096该寄存器的值的大小决定了独立看门狗的溢出时间独立看门狗的溢出时间与PSC和RLR的值有关溢出时间计算公式如下独立看门狗实验开启独立看门狗溢出时间为一秒使用按键进行喂狗不喂狗时反复执行main函数导致LED1闪烁喂狗时只执行一次main函数LED1常亮。独立看门狗喂狗函数HAL_IWDG_Refresh()原型HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)参数IWDG_HandleTypeDef *hiwdg独立看门狗句柄实例HAL_IWDG_Refresh(hiwdg);使用STM32CubeMX创建工程配置SYS配置RCC配置GPIOPB9都配置为输出高电平PA0配置为下降沿触发中断配置NVIC将PA0的中断的抢占优先级配置为3因为待会要在中断处理函数中调用HAL_Delay()而该函数要用到滴答定时器而在程序初始化时默认将滴答定时器的中断优先级设置为最低因此其他中断源很容易将其打断。配置IWDG配置工程名称、工程路径选择固件库生成工程main函数编写/* USER CODE BEGIN Header */
/********************************************************************************* file : main.c* brief : Main program body******************************************************************************* attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h
#include iwdg.h
#include gpio.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* 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 *//* 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 */void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{//按键PA0触发的中断if(GPIO_Pin GPIO_PIN_0){HAL_Delay(50);if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) GPIO_PIN_RESET){HAL_IWDG_Refresh(hiwdg);//喂狗}}
}/* 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_IWDG_Init();/* USER CODE BEGIN 2 */HAL_NVIC_SetPriority(SysTick_IRQn,0,0); //把滴答定时器的抢占优先级和响应优先级都设置为最高HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);HAL_Delay(500);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///如果没喂狗的话就不会执行该循环即灯不会常亮HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}/* USER CODE END 3 */
}/*** brief System Clock Configuration* retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState RCC_HSI_ON;RCC_OscInitStruct.LSIState RCC_LSI_ON;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** brief This function is executed in case of error occurrence.* retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* param file: pointer to the source file name* param line: assert_param error line source number* retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf(Wrong parameters value: file %s on line %d\r\n, file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
窗口看门狗窗口看门狗用于监测单片机程序运行时效是否精准主要检测软件异常一般用于需要精准检测程序运行时间的场合。窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器。产生复位条件当递减计数器值递减减到0x3F时复位(即T6位跳变到0)窗口值在0x3F~W[6:0]0x7F之间不在窗口值内喂狗就会复位产生中断条件当计数器递减到0x40时可以产生提前唤醒中断(EWI)。在窗口期内重装载计数器的值防止复位也就是所谓的喂狗。窗口看门狗的时钟窗口看门狗使用了RCC的时钟PCLK1最高为36MHz窗口看门狗框图控制寄存器WWDG_CR控制窗口关门狗是否开启和配置窗口关门狗计数器初始值。当计数器值从40h变为3Fh时(T6变成0)产生看门狗复位。配置寄存器WWDG_CFR配置窗口关门狗的窗口上限值和配置预分频器系数值窗口看门狗的溢出时间状态寄存器WWDG_SR配置窗口看门狗的提前唤醒中断。窗口看门狗实验开启窗门看门狗计数器值设置为0x7F127窗口值设置为0x5F95预分频器的时基为8,。不喂狗时反复执行main函数导致LED1闪烁喂狗时只执行一次main函数LED1常亮。在提前唤醒中断服务函数进行喂狗防止程序复位LED1常亮同时翻转LED2的状态。窗口看门狗喂狗函数HAL_StatusTypeDef HAL_WWDG_Refresh()原型HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)参数WWDG_HandleTypeDef *hwwdg窗门看门狗句柄实例HAL_WWDG_Refresh(hwwdg); 使用STM32CubeMX创建工程配置SYS配置RCC配置GPIOPB9、PB8都配置为输出高电平配置NVIC配置WWDG配置工程名称、工程路径选择固件库生成工程main函数编写/* USER CODE BEGIN Header */
/********************************************************************************* file : main.c* brief : Main program body******************************************************************************* attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h
#include wwdg.h
#include gpio.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* 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 *//* 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 *///窗口看门狗的提前唤醒中断的中断处理函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{HAL_WWDG_Refresh(hwwdg); //及时喂狗防止程序复位HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}/* 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_WWDG_Init();/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);HAL_Delay(500);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///如果没喂狗的话就不会执行该循环即LED1不会常亮HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);}/* USER CODE END 3 */
}/*** brief System Clock Configuration* retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** brief This function is executed in case of error occurrence.* retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* param file: pointer to the source file name* param line: assert_param error line source number* retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf(Wrong parameters value: file %s on line %d\r\n, file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
独立看门狗和窗口看门狗的异同点IWDG最适合应用于那些需要看门狗作为一个在主程序之外能够完全独立工作并且对时间精度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。对比点独立看门狗窗口看门狗时钟源独立时钟LSI(40KHz)不精确PCLK1或PCLK3精确复位条件递减计数到0窗口期外喂狗或减到0x3F中断没有中断计数值减到0x40可产生中断递减计数器位数12位(最大计数范围:4096~0)7位(最大计数范围:127~63)应用场合防止程序跑飞死循环死机检测程序时效防止软件异常