Files
STM32F4-Base/App/app
wandering1 1166ab1c2e fix(adc): 挂 DMA 前关闭 ADC,消除乒乓缓冲 +2 格相位旋转
问题:ADC1 在 MX_ADC1_Init() 里使能,而 DMA 在 app_main_init() 步骤
4b 才挂载,中间隔着 GD5F 全片 BBT 扫描(数秒)。台架同一次开机内用
无 DMA 单通道逐路取真值、与 DMA 路径对照,得 9/9 完美置换:乒乓缓冲
从 rank 3 开始搬,槽 i 装的是 rank ((i+1) mod 9)+1,整体错开 2 格。
表象是"接地 AIN2、UB 却读到别的通道的值",极易误判为映射表写错或
注入点标签不对。

修法:新增 adc1_disable()(Src/adc.c 的 USER CODE BEGIN 1),在
app_main_init() 步骤 4b-pre 调用,把 ADC 置为关闭态,使能动作交给
HAL_ADC_Start_DMA() 内部完成(它自己 __HAL_ADC_ENABLE + 等 Tstab
约 20 us,紧接着开 CR2.DMA 并启流),使能与搬运之间不留可观测间隔。
顺序不可调换:本调用必须严格早于 adc_input_init()。

台架验证:在 MX_ADC1_Init() 末尾关闭 4/4 次、在 4b-pre 调本 API
3/3 次,均 UB=0;同开机对照差值 <=4 码(修前 7/7 次 UB=783~786)。

文档:ADC采样节拍设计说明.md 新增 4.5 节(9 行证据表、判据陷阱、
根因与修法)与设计铁律第 8 条。

台账:Flash 261,764 -> 261,928 B(+164,新增函数),RAM 无变化;
CubeMX 存活审计基线重建(adc1-calibration-impl / adc1-dma-link
两项漂移均属本次有意改动,锚点已逐条复核在位)。
2026-10-27 20:42:06 +08:00
..

App/app/ — 应用入口与全局定义

应用层的入口与全局定义:初始化编排、功能编译开关、跨模块的就绪事件定义。

文件一览

文件 作用
app_main.c/h 应用初始化入口 app_main_init:时间子系统优先 → RS485 → NAND → ADC → 诊断(在 osKernelStart 之前执行)
app_cfg.h 功能裁剪的决策占位说明——2026-10-22 起不含任何宏(原 3 个 APP_*_ENABLE 零消费点,已删;接回方法见该文件修改记录 v1.2)
sys_events.h 系统就绪事件定义(CMSIS-RTOS v2 Event Flags:SYS_EVT_NET_READY / SYS_EVT_STORAGE_READY / SYS_EVT_FTP_READY / SYS_EVT_TIMESYNC_READY 及命令位)

初始化顺序(app_main_init)

sd2506_init            // 时间子系统优先,使后续日志带时间戳
sys_clock_init         // 墙钟(RTC 故障降级并返回 -1 → 触发自检)
rs485_init
gd5f2gq5ue_init
tpafe5160_init
SD2506 诊断            // ID / 时间 / 温度 / 电池
tpafe5160_start_conv_irq  // 首次 ADC 转换

⚠️ 以上全部在内核启动前执行 → 禁止任何 FreeRTOS/CMSIS-RTOS API 调用 (osMessageQueueNew 等会杀死启动)。内核前日志走无锁静态缓冲(见 ../log/)。

相关文档

  • 架构全景:docs/架构设计/项目架构总览.md
  • 启动顺序与就绪屏障:docs/架构设计/项目启动顺序管理.md
  • 墙钟:docs/子系统设计/系统墙钟时间维护说明.md