1166ab1c2e
问题: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 两项漂移均属本次有意改动,锚点已逐条复核在位)。
63 lines
1.9 KiB
C
63 lines
1.9 KiB
C
/* USER CODE BEGIN Header */
|
||
/**
|
||
******************************************************************************
|
||
* @file adc.h
|
||
* @brief This file contains all the function prototypes for
|
||
* the adc.c file
|
||
******************************************************************************
|
||
* @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 */
|
||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||
#ifndef __ADC_H__
|
||
#define __ADC_H__
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "main.h"
|
||
|
||
/* USER CODE BEGIN Includes */
|
||
|
||
/* USER CODE END Includes */
|
||
|
||
extern ADC_HandleTypeDef hadc1;
|
||
|
||
/* USER CODE BEGIN Private defines */
|
||
|
||
/* USER CODE END Private defines */
|
||
|
||
void MX_ADC1_Init(void);
|
||
|
||
/* USER CODE BEGIN Prototypes */
|
||
|
||
/* ADC1 上电自校准(RM0090 §13.3.6;本仓库 HAL 无 HAL_ADCEx_Calibration_Start,
|
||
* 实现见 Src/adc.c 的 USER CODE BEGIN 1)。返回 0 = 完成,-1 = 等待超时 */
|
||
int adc1_calibrate(void);
|
||
|
||
/* ADC1 关闭(清 ADON 并等其生效)。实现见 Src/adc.c 的 USER CODE BEGIN 1。
|
||
* **必须在挂 DMA 之前调用**:把"使能 ADC"推迟到 HAL_ADC_Start_DMA 内部完成,
|
||
* 使能与搬运之间不留可观测间隔。返回 0 = 已关闭,-1 = 等待超时。
|
||
* 动机与台架证据见 docs/子系统设计/ADC采样节拍设计说明.md §4.5(DMA 缓冲 +2 格旋转)。 */
|
||
int adc1_disable(void);
|
||
|
||
/* USER CODE END Prototypes */
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __ADC_H__ */
|
||
|