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。
Inc/ — CubeMX 生成的头文件
⚠️ 本目录文件由 STM32CubeMX 生成(
.ioc重生成会覆盖),不是自研代码。 允许在USER CODE BEGIN/END标记区之间写自定义内容。
文件一览
| 文件 | 生成 | 作用 |
|---|---|---|
main.h |
CubeMX | 主头文件:引脚宏定义(xxx_Pin / xxx_GPIO_Port) |
FreeRTOSConfig.h |
CubeMX | FreeRTOS 内核配置(堆大小、tick、优先级位数等) |
stm32f4xx_hal_conf.h |
CubeMX | HAL 模块裁剪开关(启用/禁用各外设 HAL 模块) |
stm32f4xx_it.h |
CubeMX | 中断服务函数声明 |
gpio.h / dma.h / spi.h / i2c.h / usart.h |
CubeMX | 各外设初始化函数声明 |
⚠️ 修改约定
- 自定义内容只写
USER CODE BEGIN xxx/USER CODE END xxx标记区之间 - 引脚宏(如
CH395F_CS_Pin)在main.h中定义,改引脚须在 CubeMX 中改后重新生成
关键配置速查
| 配置 | 值 | 位置 |
|---|---|---|
| FreeRTOS 堆 | configTOTAL_HEAP_SIZE(已迁 CCM) |
FreeRTOSConfig.h |
| 栈溢出检查 | configCHECK_FOR_STACK_OVERFLOW = 2 |
FreeRTOSConfig.h |
| HAL 时基 | TIM7(HAL_TIMEBASE 覆盖) |
stm32f4xx_hal_conf.h + Src/ |
| NVIC 分组 | 4 位优先级 | CubeMX 配置 |
相关文档
- 内存/堆预算:
docs/内存管理/RAM使用分析与优化方案.md - 硬件引脚:根
README.md「外设接口」表