IWDG 延后启动改走宏改名(L3→L2):生成调用变空操作,重生成后不再需要手工删

This commit is contained in:
2026-10-10 01:30:47 +08:00
parent 63ee090fd1
commit e2e1d0fd42
6 changed files with 71 additions and 50 deletions
+29 -17
View File
@@ -21,7 +21,32 @@
#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.5 决策 C)。
* ⚠ 本宏只影响本编译单元;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;
@@ -40,23 +65,10 @@ void MX_IWDG_Init(void)
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 1249;
/* IWDG-DEFER-START-ANCHOR — 本锚点与下方改动一体,重生成会一并消失,
* 供 scripts/check_cubemx_survival.py 检出(勿删):
*
* ⚠ 本行为生成区改动(生成区里**唯一**被手工改的一句,2026-09-29 起):
* 原为 `if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); }`。
* 原因:HAL_IWDG_Init() 内部第一句即 __HAL_IWDG_START()(立即启动看门狗,
* 之后不可停、只能复位)。而本函数被 CubeMX 插在 main() 的 MX_*_Init 序列里,
* 早于 app_main_init()——那段含 NAND 初始化/RTC/ADC,耗时可达数秒且无喂狗点,
* 按 2.5s 超时最坏值(≈1.7s)必然复位 → **开机死循环**(2026-09-29 实测确认)。
* 故只填参数不启动;启动移交 task_wd_start()(App/util/task_watchdog.c),
* 由 defaultTask 在存储 bring-up 完成后调用——即"启动段不喂狗、主循环段才喂"
* (见 docs/子系统设计/看门狗设计说明.md §4.5 决策 C)。
*
* ⚠ 若 CubeMX 重生成覆盖此处,症状 = **开机即复位**(LED 不闪、日志停在早期)。
* 恢复方法:删掉 HAL_IWDG_Init 调用,改为本注释形态(含锚点)。
* 注:不可把下面两句赋值与这里的替换一起塞进 IWDG_Init 1 区——该区位于
* 两句赋值**之前**,HAL 调用在区外,仍会被覆盖。故此改动只能在生成区。 */
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */