Files
STM32F4-Base/Inc
wandering1 8a18e388c7 四个 Fault 全部采集现场:MemManage/BusFault/UsageFault 由空死循环升级
原状:HardFault 已有崩溃采集,但 MemManage / BusFault / UsageFault 仍是空
while(1) —— 这三类故障发生时日志完全静默,且因 SHCSR 默认未使能,实际会
被升级成 HardFault,报告出笼统的 "HARDFAULT"、看不出根因。

改动:

- Src/stm32f4xx_it.c:三个 Handler 升级为手工 __asm 版(取 MSP/PSP 帧指针)
  -> B 到 per-fault C 入口 fault_entry_{mem,bus,usage} -> hard_fault_report()。
  hard_fault_report 增加 tag 参数,日志统一为
  "[ERR] <TAG> PC=.. LR=.. xPSR=.. R0-R3=.. CFSR=.. HFSR=..[/BFAR][/MMFAR]"。
  生成实体经 #define X X_Gen 改名保留,链接器各移除 2 字节(.map 已验)。
  三个各带独立锚点 MEMFAULT/BUSFAULT/USAGEFAULT-ANCHOR。
- 新增 fault_handler_enable()(USER CODE BEGIN 1 区):使能 SHCSR 的
  MEMFAULTENA/BUSFAULTENA/USGFAULTENA。声明入 Inc/stm32f4xx_it.h,调用在
  app_main_init() 第一行(纯寄存器写,不依赖日志/时钟)。
- 刻意不启用 CCR.UNALIGN_TRP / CCR.DIV_0_TRP:会把普通 bug 升级成死机,
  对本项目弊大于利(说明写进函数注释)。

实现约束(本轮踩坑):ARMCC 的 __asm 块取不到 C 的数据符号(ADR r1, xxx_tag
报 A1516E: Bad symbol,去 static 也无效),也无法给 C 函数传字符串参数,
故故障名必须由 C 侧 per-fault 入口带上。

配套:

- check_cubemx_survival.py:新增 fault-handlers-3 / fault-handler-enable 两项,
  UNPROTECTED_LEGACY 清掉三个 Fault(WARN 2->1),清单 16 -> 18 项。
- AGENTS.md:新增"4 个 Fault 全部采集"条目;ARMCC 汇编条目补 A1516E 第 3 坑;
  校验标记补 [ERR](四个 Fault 日志都以它开头 -> 一律判 FAIL,刻意)。
- 看门狗设计说明.md:§6.1 补 4 条 Fault 标记与 @test 禁项关系;
  §10.2 L3 清单与四个 Fault 采集小节;§11 结论表与变更记录。
- 待处理内容.md:新增 N-03d(已完成),N-03c 补第二次重生成结论。

验证:@build 0 错误 0 警告(Flash +156 B,RAM 无变化);pre-commit 13 钩子
全通过;审计 18 通过 / 1 警告 / 0 失败。
2026-09-29 09:16:19 +08:00
..

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「外设接口」表