Files
STM32F4-Base/Src
wandering1 7feeea6c56 实现独立看门狗:CubeMX 配置 IWDG + 任务心跳位图,恢复三处被覆盖定制
经 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。
2026-09-29 07:22:04 +08:00
..
2026-07-19 13:09:06 +08:00

Src/ — CubeMX 生成的源文件

⚠️ 本目录文件由 STM32CubeMX 生成(.ioc 重生成会覆盖),不是自研代码。 但允许在 USER CODE BEGIN/END 标记区之间写自定义代码。

文件一览

文件 生成 作用
main.c CubeMX 程序入口:HAL_Init → SystemClock_Config → 外设初始化 → app_main_init → osKernelStart
freertos.c CubeMX FreeRTOS 任务创建(MX_FREERTOS_Init)+ 任务栈/优先级定义
gpio.c / dma.c / spi.c / i2c.c / usart.c CubeMX 各外设 MX_xxx_Init
stm32f4xx_hal_msp.c CubeMX HAL 外设底层初始化(时钟使能、NVIC、引脚复用)
stm32f4xx_hal_timebase_tim.c 自研覆盖 HAL 时基改用 TIM7(非 SysTick),tick = 1ms
stm32f4xx_it.c CubeMX 中断服务函数(ISR)
system_stm32f4xx.c CMSIS 系统时钟初始化(SystemInit)

⚠️ 修改约定(铁律)

  • 自定义代码只写 USER CODE BEGIN xxx / USER CODE END xxx 标记区之间—— 标记区外的内容在 CubeMX 重新生成时会被无条件覆盖丢失
  • 本目录被 pre-commit 的 C 代码规范检查排除(因是生成代码,风格不受控)
  • Drivers/BSP/ 才是纯手工代码区;应用逻辑放 App/

关键点

  • HAL 时基 = TIM7,不是 SysTick;FreeRTOS 用 SysTick 之外的方式,tick = 1ms
  • NVIC 4 位优先级分组;外设中断优先级 ≥ 5(0~4 预留给 FreeRTOS)
  • 时钟:HSE 8MHz → PLL M=4/N=168/P=2 → 168MHz

相关文档

  • 架构全景:docs/架构设计/项目架构总览.md
  • 启动顺序:docs/架构设计/项目启动顺序管理.md
  • 任务表(唯一事实源 = freertos.c):根 README.md