看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外程序进入死循环或跑飞的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统
。
STM32 有两个看门狗,一个是独立看门狗另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
外部晶振为8MHz
32的时钟树框图 【STM32】系统时钟RCC详解(超详细,超全面)
4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire
在 System Core 中选择 IWDG 设置,并勾选 Activated 激活
IWDG counter clock prescaler 预分频器值设为 64
IWDG down-counter reload value 重装载寄存器值设为 625
超时时间 Tout = (42^prv) / LSI * rlv (s) prv是预分频器寄存器的值,rlv是重装载寄存器的值
由图知 LSI 为 40 KHz,当 prv 取 IWDG_ PRESCALER_64 ,rlv 取 625 时,Tout=64/40625=1s。
即设置 1s 的超时溢出。
输入项目名和项目路径
并选择应用的 IDE 开发环境 MDK-ARM V5
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
点击 GENERATE CODE 生成代码
因为设置超时溢出为 1 秒,所以这里每隔 800 毫秒喂狗一次 HAL_IWDG_Refresh(&hiwdg);
/**
* @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_USART1_UART_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
printf("\n\r***** IWDG Test Start *****\n\r");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("\n\r Refreshes the IWDG !!!\n\r");
HAL_IWDG_Refresh(&hiwdg);
HAL_Delay(800);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
串口打印功能查看 STM32——USART串口使用
当去掉 HAL_IWDG_Refresh(&hiwdg);,也就是不喂狗时,系统约 1 秒重启一次。
用户代码要加在 USER CODE BEGIN N 和 USER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。