STM32单片机独立看门狗IWDG使用CubeMX配置方法
一、IWDG 的概述
在嵌入式系统设计中,看门狗是一个可靠性保障机制,它能够在系统因软件故障等原因陷入异常状态时,自动触发复位操作,使系统恢复到正常工作状态。STM32的IWDG 是一个独立的看门狗,它的时钟源是 STM32 内部的低速 RC 振荡器(LSI),频率通常为 40 kHz 左右;
IWDG 的主要特点有:
- 独立时钟源 :由于使用独立的时钟源,即使主时钟出现故障,IWDG 依然能够正常工作,有效地提高了系统的可靠性;
- 超时时间可配置 :通过设置预分频器和重装载值,可以灵活地调整看门狗的超时时间,以满足不同应用场景的需求;
- 硬件复位 :当 IWDG 计数器减至 0 时,会触发硬件复位,确保系统能够重新启动并恢复到初始状态;
本文以STM32F103C8T6为例,使用STM32CubeMX进行配置,自动生成代码,介绍IWDG的配置及使用方法;
二、STM32CubeMX配置方法
1.超时时间计算
手册中关于IWDG的寄存器设置及超时时间的主要介绍如下图中的表格所示:
例如IWDG时钟源频率为40kHz、分频系数为64时,每计数一次的时间为64/(40k)s,假设我们需要超时时间为1s,则需要计数625次,即
64 × 625 40000 s = 1 s \frac{\text{64} \times\text{625}}{{\text{40000}}}s= 1s 4000064×625s=1s
可用以下公式计算:
T timeout = 预分频系数 × ( 重装载值 + 1 ) f LSI T_{\text{timeout}} = \frac{\text{预分频系数} \times (\text{重装载值} + 1)}{f_{\text{LSI}}} Ttimeout=fLSI预分频系数×(重装载值+1)
2. STM32CubeMX配置
在STM32CubeMX的Clock Configuration中,查看IWDG的时钟源和频率,STM32F103C8T6的IWDG模块的时钟频率是40KHz,如下图:
在System Core -> IWDG中,使能IWDG即选中Activated,在下方Parameter Settings中填入预分频值和重载值,此处以超时时间为1s为例,按照上一节的计算,填入相应的值,如下图所示:
配置完成后,生成代码;
三、主要代码
STM32CubeMx生成的代码中,IWDG初始化的函数为
MX_IWDG_Init();
该函数位于iwdg.c文件中,函数的全部内容:
/* IWDG init function */
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 = 625 - 1;if (HAL_IWDG_Init(&hiwdg) != HAL_OK){Error_Handler();}/* USER CODE BEGIN IWDG_Init 2 *//* USER CODE END IWDG_Init 2 */}
可看出,分频系数和重载值,与我们设置的一致;STM32CubeMX自动生成的代码,在main()函数中会自动调用该函数,我们需要在while(1)循环或者其他地方,在超时时间之内,调用喂狗函数,使IWDG重置,该函数为
HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
{/* Reload IWDG counter with value defined in the reload register */__HAL_IWDG_RELOAD_COUNTER(hiwdg);/* Return function status */return HAL_OK;
}
它在stm32f1xx_hal_iwdg.c文件中,调用喂狗函数需要包含相应的头文件,调用形式为
HAL_IWDG_Refresh(&hiwdg);