7feeea6c56
经 CubeMX 图形界面启用 IWDG(Prescaler=64 / Reload=1249,标称 2498ms /
最坏 1701ms),并落地心跳位图判定、各任务埋点、RCC_CSR 复位原因上报与
configASSERT 改造。重生成覆盖的既有定制已全部恢复。
P0(开机死循环):HAL_IWDG_Init() 内部立即启动看门狗,而 CubeMX 把
MX_IWDG_Init() 插在 app_main_init() 之前——该段 NAND/RTC/ADC 初始化耗时
数秒无喂狗点,按 2.5s 超时必然复位。改 Src/iwdg.c 为只填参数不启动,
启动移交 task_wd_start(),由 defaultTask 在存储 bring-up 完成后调用。
恢复的三处定制(重生成覆盖):
- Src/stm32f4xx_it.c:HardFault_Handler 崩溃现场采集被打回空 while(1)
- Inc/FreeRTOSConfig.h:栈溢出检测与堆失败钩子两个宏被整块删除
- Src/freertos.c:三处任务栈实测记录中文注释丢失(数值未丢)
新增:
- App/util/task_watchdog.{c,h}:心跳位图 + 抽样判定 + IWDG 延后启动
- time_sync.c 长等待切片:net_recv_to 单次可睡满 30s 预算,切成 200ms 片
- Src/main.c 复位原因锁存(读后即清 RMVF,防残留误判)
埋点:defaultTask(唯一喂狗者)/ netTask(含 PHY 等待循环)/ uiTask /
timeSyncTask。ftpTask 首期剔除掩码,待二期改 lftpd。
门禁:build 0 错误 0 警告;pre-commit 10 钩子全通过;Flash +2956B / RAM +40B。
64 lines
2.2 KiB
C
64 lines
2.2 KiB
C
/* 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 */
|
||
|
||
/* 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;
|
||
/* USER CODE BEGIN IWDG_DEFER_START */
|
||
/* ⚠ 生成区改动(唯一一处):原为 `HAL_IWDG_Init(&hiwdg)` 直呼。
|
||
* 原因: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)。
|
||
* 若 CubeMX 重生成覆盖此处,表现为"开机即复位",按本注释恢复即可。 */
|
||
/* USER CODE END IWDG_DEFER_START */
|
||
/* USER CODE BEGIN IWDG_Init 2 */
|
||
|
||
/* USER CODE END IWDG_Init 2 */
|
||
|
||
}
|
||
|
||
/* USER CODE BEGIN 1 */
|
||
|
||
/* USER CODE END 1 */
|