一: 前言
很多例程都是基于开发板从一个新工程开始,在实际应用中,那STM32 如何基于当前的项目和工程添加看门狗功能? 本文以独立看门狗为例,演示如何添加应用看门狗功能。
二: 简介
看门狗是一种特殊功能的计时器。
主要作用:
程序不能正常复位,通过看门狗发出的复位信号来复位
程序跑飞或者陷入死循环等异常情况,看门狗发出复位信号,让程序重新执行,恢复正常执行顺序
STM32 有两个看门狗,独立看门狗和窗口看门狗。 独立看门狗 (IWDG) 由专用的内部低速时钟 (LSI) 驱动,即使主时钟发生故障它也仍然有效。
三:实现
打开cubemx配置,选中IWDG,选择Activated,并配置好刷新时间。
时间计算方式:
例:如果PSC = 64, RLR = 3125,正常情况下f(iwdg) = 40khz, 那么溢出时间t = 5s。
四:代码
添加文件:
Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h
Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_iwdg.h
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c
stm32f1xx_hal_conf.h
#define HAL_IWDG_MODULE_ENABLED
main.c
IWDG_HandleTypeDef hiwdg;
static void MX_IWDG_Init(void);
MX_IWDG_Init();
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
static void MX_IWDG_Init(void)
{
/* USER CODE BEGIN IWDG_Init 0 */
/* USER CODE END IWDG_Init 0 */
/* USER CODE BEGIN IWDG_Init 1 */
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 3125;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */
}
最后,在主循环或定时器中定时刷新看门狗。
HAL_IWDG_Refresh(&hiwdg);
五:总结
设计时应避免对看门狗的过度依赖,应在系统设计和软件编程中尽量避免异常的发生,但在外设很多,频繁通信,环境干扰大等情况下可以加上以避免程序卡死。