/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file iwdg.c * @brief This file provides code for the configuration * of the IWDG instances. ****************************************************************************** * @attention * * Copyright (c) 2026 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 "iwdg.h" /* USER CODE BEGIN 0 */ /* * IWDG-DEFER-START-ANCHOR — 看门狗"延后启动"改动(勿删本块) * * CubeMX 每次都会在 MX_IWDG_Init() 的生成区里写 * if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } * 而 HAL_IWDG_Init() 内部第一句就是 __HAL_IWDG_START()(写 KR=0xCCCC,**立即启动**)。 * 本函数被 CubeMX 插在 main() 的 MX_*_Init 序列里,早于 app_main_init()——那段含 * NAND 初始化 / RTC / ADC,耗时可达数秒且无喂狗点,按 2.5s 超时的最坏值(≈1.7s) * 必然复位 → **开机死循环**(2026-09-29 实测确认)。 * * ⚠ "反初始化"这条路走不通:IWDG 一旦启动就**无法停止**(参考手册:唯一停止手段是 * 复位),所以不能在 `IWDG_Init 2` 区里把它"撤销"掉。 * ✅ 免手工的做法(2026-10-09 改,替代此前"每次重生成后删掉那一句"):把本编译单元里 * 的 HAL_IWDG_Init **改名到下面的空实现**。宏只作用于其后、本文件内的调用点 * (含生成区那一句),生成代码一行都不用动 → 重生成后自动失效,不必再手工删。 * 真正的启动移交 task_wd_start() → wd_platform_start()(App/util/task_watchdog.c), * 由它解锁并写 PR/RLR、再写 KR=0xCCCC 启动(见 docs/子系统设计/看门狗设计说明.md §4.1)。 * ⚠ 本宏只影响本编译单元;task_watchdog.c 那侧不经过它。 */ static HAL_StatusTypeDef iwdg_deferred_start(const IWDG_HandleTypeDef *a_h) { (void)a_h; return HAL_OK; /* 刻意什么都不做:只填参数、不启动 */ } #define HAL_IWDG_Init(a_h) iwdg_deferred_start(a_h) /* USER CODE END 0 */ IWDG_HandleTypeDef hiwdg; /* 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 = 1249; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN IWDG_Init 2 */ /* USER CODE END IWDG_Init 2 */ } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */