diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..97c8d71
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+# Build output: generated locally, never committed.
+**/build/
+**/build_app/
+**/CMakeFiles/
+*.elf
+*.bin
+*.hex
+*.map
+*.o
+*.obj
+*.d
+*.a
+
+# STM32CubeMX temporary files.
+**/MXTmpFiles/
+**/mx.scratch
+**/*_save
diff --git a/A11_F407_SDC_ACQ_DAC_CubeMX/A11_F407_SDC_ACQ_DAC.dbc b/A11_F407_SDC_ACQ_DAC_CubeMX/A11_F407_SDC_ACQ_DAC.dbc
deleted file mode 100644
index 611f41d..0000000
--- a/A11_F407_SDC_ACQ_DAC_CubeMX/A11_F407_SDC_ACQ_DAC.dbc
+++ /dev/null
@@ -1,77 +0,0 @@
-VERSION "1.0"
-
-NS_ :
- NS_DESC_
- CM_
- BA_DEF_
- BA_
- VAL_
- CAT_DEF_
- CAT_
- FILTER
- BA_DEF_DEF_
- EV_DATA_
- ENVVAR_DATA_
- SGTYPE_
- SGTYPE_VAL_
- BA_DEF_SGTYPE_
- BA_SGTYPE_
- SIG_TYPE_REF_
- VAL_TABLE_
- SIG_GROUP_
- SIG_VALTYPE_
- SIGTYPE_VALTYPE_
- BO_TX_BU_
- BA_DEF_REL_
- BA_REL_
- BA_DEF_DEF_REL_
- BU_SG_REL_
- BU_EV_REL_
- BU_BO_REL_
- SG_MUL_VAL_
-
-BS_:
-
-BU_: SDC_ACQ_DAC
-
-BO_ 256 SDC_Heartbeat: 8 SDC_ACQ_DAC
- SG_ Board_Identifier : 0|8@1+ (1,0) [0|255] "" Vector__XXX
- SG_ Protocol_Version : 8|8@1+ (1,0) [0|255] "" Vector__XXX
- SG_ Heartbeat_Sequence : 16|16@1+ (1,0) [0|65535] "" Vector__XXX
- SG_ Uptime : 32|32@1+ (0.001,0) [0|4294967.295] "s" Vector__XXX
-
-BO_ 258 SDC_ADC_Voltage: 2 SDC_ACQ_DAC
- SG_ Input_Voltage : 0|16@1+ (0.001,0) [0|65.535] "V" Vector__XXX
-
-BO_ 259 SDC_Input_Frequencies: 8 SDC_ACQ_DAC
- SG_ Left_Front_Frequency : 0|16@1+ (1,0) [0|65535] "Hz" Vector__XXX
- SG_ Left_Rear_Frequency : 16|16@1+ (1,0) [0|65535] "Hz" Vector__XXX
- SG_ Right_Front_Frequency : 32|16@1+ (1,0) [0|65535] "Hz" Vector__XXX
- SG_ Right_Rear_Frequency : 48|16@1+ (1,0) [0|65535] "Hz" Vector__XXX
-
-BO_ 801 SDC_DAC_Set: 3 Vector__XXX
- SG_ DAC_Select : 0|8@1+ (1,0) [1|2] "" SDC_ACQ_DAC
- SG_ DAC_Command_Voltage : 8|16@1+ (0.001,0) [0|5] "V" SDC_ACQ_DAC
-
-BO_ 802 SDC_DAC_Ack: 4 SDC_ACQ_DAC
- SG_ DAC_Set_Result : 0|8@1+ (1,0) [0|1] "" Vector__XXX
- SG_ DAC_Select : 8|8@1+ (1,0) [1|2] "" Vector__XXX
- SG_ DAC_Output_Voltage : 16|16@1+ (0.001,0) [0|5] "V" Vector__XXX
-
-BO_ 816 SDC_GPIO_Status: 8 SDC_ACQ_DAC
- SG_ SDC_Input_State : 0|15@1+ (1,0) [0|32767] "" Vector__XXX
- SG_ SDC_Changed_Mask : 16|15@1+ (1,0) [0|32767] "" Vector__XXX
- SG_ Timestamp : 32|32@1+ (0.001,0) [0|4294967.295] "s" Vector__XXX
-
-VAL_ 801 DAC_Select 1 "DAC1" 2 "DAC2" ;
-VAL_ 802 DAC_Set_Result 0 "Failed" 1 "OK" ;
-VAL_ 802 DAC_Select 1 "DAC1" 2 "DAC2" ;
-
-CM_ BO_ 256 "Standard ID 0x100. Sent every 1 s on both CAN1 and CAN2.";
-CM_ BO_ 258 "Standard ID 0x102. Filtered, calibrated voltage before the hardware divider.";
-CM_ BO_ 259 "Standard ID 0x103. Input capture frequency order: PA0, PA2, PA6, PB14.";
-CM_ BO_ 801 "Standard ID 0x321. Accepted on CAN1 and CAN2. Voltage is commanded in mV on-wire.";
-CM_ BO_ 802 "Standard ID 0x322. Broadcast acknowledgement on CAN1 and CAN2.";
-CM_ BO_ 816 "Standard ID 0x330. Sent at startup and whenever PD0-PD14 state changes, on both CAN buses.";
-CM_ SG_ 816 SDC_Input_State "Bit 0 through bit 14 map directly to PD0 through PD14.";
-CM_ SG_ 816 SDC_Changed_Mask "A set bit identifies an input that changed since the preceding GPIO-status frame.";
diff --git a/SDC-ACQ_DAC_固件交付说明.html b/SDC-ACQ_DAC_固件交付说明.html
new file mode 100644
index 0000000..b6b3c74
--- /dev/null
+++ b/SDC-ACQ_DAC_固件交付说明.html
@@ -0,0 +1,155 @@
+
+
+
+
+ SDC-ACQ&DAC 固件交付说明
+
+
+
+
+ SDC-ACQ&DAC 固件交付说明
+ STM32F407VET6 采集、双 CAN 与双路 DAC 控制板
+ 文档版本:1.1 | 日期:2026-08-09 | 固件工程:A11_F407_SDC_ACQ_DAC_CubeMX
+ 15 路状态采集4 路频率输入双 CAN 500 kbit/s双 MCP4725 DAC串口调试
+
+
+ 1. 功能概览
+
+ | 功能 | 当前实现 |
+ | 状态采集 | 采集 PD0–PD14 共 15 路数字输入。上电和任一输入变化时,向 CAN1、CAN2 发送完整状态与变化掩码。 |
+ | 频率采集 | 采集 PA0、PA2、PA6、PB14 的上升沿频率,每 500 ms 通过 CAN 和串口输出。 |
+ | 电压采集 | ADC1_IN8(PB0)测量外部经分压后的输入;对外输出分压前、已标定且滤波后的电压。 |
+ | CAN | CAN1 与 CAN2 均为 500 kbit/s、11 位标准数据帧,并使用相同协议。 |
+ | DAC | 通过 I2C2 控制两颗 MCP4725,接收 CAN 命令或串口命令设置 0–5.000 V 输出。 |
+ | 运行指示 | PE0 每 500 ms 翻转一次作为运行心跳;发生初始化错误时 PE0、PE1 快速翻转。 |
+
+
+ 2. 接口和引脚
+
+ | 接口 | MCU 引脚 / 外设 | 说明 |
+ | 15 路状态输入 | PD0–PD14 / EXTI | bit0 对应 PD0,bit14 对应 PD14。 |
+ | 频率输入 | PA0/TIM5、PA2/TIM9、PA6/TIM3、PB14/TIM12 | 上升沿输入捕获。 |
+ | 电压输入 | PB0 / ADC1_IN8 | 报告值为分压前电压,单位 mV。 |
+ | CAN1 / CAN2 | PB8/PB9;PB5/PB6 | 分别为 RX/TX。 |
+ | DAC I2C | PB10/PB11 / I2C2 | DAC1 地址 0x61,DAC2 地址 0x60(7 位地址)。 |
+ | 调试串口 | PA9/PA10 / USART1 | 115200、8N1、无硬件流控。 |
+
+
+ 3. CAN 协议
+ 所有字段均为小端序(低字节在前)。板卡主动上报的帧会分别发到 CAN1 和 CAN2。
+
+ | CAN ID | 名称 | 方向 / 时机 | 数据定义 |
+ 0x100 | 心跳 | 板卡发送,每 1 s | A1 01 seq_L seq_H uptime_0..3;板号 A1、协议版本 1、序号、运行时间 ms。 |
+ 0x102 | 输入电压 | 板卡发送,每 500 ms | uint16,单位 mV。例如 90 2F = 0x2F90 = 12176 mV = 12.176 V。 |
+ 0x103 | 四路频率 | 板卡发送,每 500 ms | 4 个 uint16,单位 Hz;依次为 PA0、PA2、PA6、PB14。 |
+ 0x321 | DAC 设置 | 外部发送给板卡 | [DAC 编号][mV_L][mV_H],编号仅允许 1 或 2。 |
+ 0x322 | DAC 应答 | 板卡发送,设置后 | [结果][DAC 编号][mV_L][mV_H];结果 1 成功,0 失败。 |
+ 0x330 | 15 路状态 | 板卡发送,上电或状态变化 | 状态 uint16、变化掩码 uint16、时间戳 uint32 ms。 |
+
+
+ DAC 设置示例
+ 电压 V 到 CAN 数据的换算:mV = round(V × 1000),随后拆为低字节和高字节。
+ DAC1 输出 3.000 V:ID = 0x321,DLC = 3,DATA = 01 B8 0B
+DAC2 输出 1.140 V:ID = 0x321,DLC = 3,DATA = 02 74 04
+
+应答示例(DAC1 成功设为 3.000 V):ID = 0x322,DATA = 01 01 B8 0B
+ DAC 输出范围为 0–5000 mV。软件中 DAC1、DAC2 到板级 MC_L、MC_R 的实际对应关系应以实物测量为准。
+
+ 4. ADC 电压说明
+ ADC 输出为分压前输入电压,换算使用 100 kΩ / 30 kΩ 分压参数,并采用实测标定系数 12300 / 11656。单次报告包含 16 次 ADC 平均,随后对最近 4 次报告做移动平均;输出刷新周期为 500 ms,滤波时间约 2 秒。
+ 串口示例:ADC=12300mV PWM=10,0,0,0Hz
+
+ 5. 串口使用
+ 串口参数:115200、8 数据位、1 停止位、无校验、无流控。USB-TTL 应交叉连接:PA9/TX → 转换器 RX,PA10/RX → 转换器 TX,并连接公共地。
+ DAC1 1.234
+DAC2 2500
+D1 2.5V
+ 命令不区分大小写,支持伏特小数或毫伏整数。设置完成后串口会回显结果,CAN1/CAN2 同时发送 0x322 应答。
+
+ 6. 频率输入说明
+ 频率使用相邻上升沿时间差计算;连续 1 秒没有新边沿时,该通道输出 0 Hz。当前版本只测频率,不输出占空比。
+ 测频限制:当前实现为主循环轮询捕获标志,不是捕获中断或 DMA。定时器计数时钟理论上为 TIM5 16 MHz、其余三路 100 kHz,但这不是可靠测量上限。高于数百 Hz 的连续信号可能因串口输出等主循环阻塞而丢失边沿;如需可靠的 kHz 级测量,应改为输入捕获中断或 DMA。
+
+ 7. 编译、CubeMX 与下载
+ cd A11_F407_SDC_ACQ_DAC_CubeMX
+cmake --preset Release
+cmake --build --preset Release
+
+# 修改 .ioc 后重新生成(保留 USER CODE 区)
+./tools/cubemx_generate.sh
+ 生成文件:build/Release/A11_F407_SDC_ACQ_DAC.bin。
+ /opt/st/stm32cubeclt_1.21.0/STM32CubeProgrammer/bin/STM32_Programmer_CLI \
+ -c port=SWD mode=UR reset=HWrst \
+ -w build/Release/A11_F407_SDC_ACQ_DAC.bin 0x08000000 -v -rst
+
+ 8. 现场检查要点
+
+ - CAN 总线上应有其他正常节点或分析仪 ACK;无 ACK 时 CAN 控制器可能持续重发,表现为无有效发送。
+ - 串口无输出时检查 TX/RX 是否交叉、USB-TTL 与板卡是否共地,以及串口速率是否为 115200。
+ - 下载异常时检查 3.3 V、NRST、SWDIO、SWCLK、GND 和 VCAP_1/VCAP_2 去耦。
+ - 外部硬件看门狗当前未焊接,固件未实现喂狗逻辑。
+
+
+
+
+
diff --git a/SDC-ACQ_DAC_固件交付说明.pdf b/SDC-ACQ_DAC_固件交付说明.pdf
new file mode 100644
index 0000000..c172667
Binary files /dev/null and b/SDC-ACQ_DAC_固件交付说明.pdf differ
diff --git a/SDC_ACQ_DAC.dbc b/SDC_ACQ_DAC.dbc
new file mode 100644
index 0000000..2c5b54a
--- /dev/null
+++ b/SDC_ACQ_DAC.dbc
@@ -0,0 +1,83 @@
+VERSION "1.1"
+
+NS_ :
+ NS_DESC_
+ CM_
+ BA_DEF_
+ BA_
+ VAL_
+ CAT_DEF_
+ CAT_
+ FILTER
+ BA_DEF_DEF_
+ EV_DATA_
+ ENVVAR_DATA_
+ SGTYPE_
+ SGTYPE_VAL_
+ BA_DEF_SGTYPE_
+ BA_SGTYPE_
+ SIG_TYPE_REF_
+ VAL_TABLE_
+ SIG_GROUP_
+ SIG_VALTYPE_
+ SIGTYPE_VALTYPE_
+ BO_TX_BU_
+ BA_DEF_REL_
+ BA_REL_
+ BA_DEF_DEF_REL_
+ BU_SG_REL_
+ BU_EV_REL_
+ BU_BO_REL_
+ SG_MUL_VAL_
+
+BS_:
+
+BU_: SDC_ACQ_DAC VehicleController
+
+BO_ 256 SDC_Heartbeat: 8 SDC_ACQ_DAC
+ SG_ Board_Identifier : 0|8@1+ (1,0) [0|255] "" VehicleController
+ SG_ Protocol_Version : 8|8@1+ (1,0) [0|255] "" VehicleController
+ SG_ Heartbeat_Sequence : 16|16@1+ (1,0) [0|65535] "" VehicleController
+ SG_ Uptime : 32|32@1+ (0.001,0) [0|4294967.295] "s" VehicleController
+
+BO_ 258 SDC_ADC_InputVoltage: 2 SDC_ACQ_DAC
+ SG_ Input_Voltage : 0|16@1+ (0.001,0) [0|65.535] "V" VehicleController
+
+BO_ 259 SDC_InputFrequencies: 8 SDC_ACQ_DAC
+ SG_ Frequency_PA0 : 0|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PA2 : 16|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PA6 : 32|16@1+ (1,0) [0|65535] "Hz" VehicleController
+ SG_ Frequency_PB14 : 48|16@1+ (1,0) [0|65535] "Hz" VehicleController
+
+BO_ 801 SDC_DAC_Set: 3 VehicleController
+ SG_ DAC_Select : 0|8@1+ (1,0) [1|2] "" SDC_ACQ_DAC
+ SG_ DAC_Command_Voltage : 8|16@1+ (0.001,0) [0|5] "V" SDC_ACQ_DAC
+
+BO_ 802 SDC_DAC_Ack: 4 SDC_ACQ_DAC
+ SG_ DAC_Set_Result : 0|8@1+ (1,0) [0|1] "" VehicleController
+ SG_ DAC_Select : 8|8@1+ (1,0) [1|2] "" VehicleController
+ SG_ DAC_Output_Voltage : 16|16@1+ (0.001,0) [0|5] "V" VehicleController
+
+BO_ 816 SDC_GPIO_Status: 8 SDC_ACQ_DAC
+ SG_ SDC_Input_State : 0|15@1+ (1,0) [0|32767] "" VehicleController
+ SG_ SDC_Changed_Mask : 16|15@1+ (1,0) [0|32767] "" VehicleController
+ SG_ Timestamp : 32|32@1+ (0.001,0) [0|4294967.295] "s" VehicleController
+
+VAL_ 256 Board_Identifier 161 "A11_F407" ;
+VAL_ 801 DAC_Select 1 "DAC1" 2 "DAC2" ;
+VAL_ 802 DAC_Set_Result 0 "Failed" 1 "OK" ;
+VAL_ 802 DAC_Select 1 "DAC1" 2 "DAC2" ;
+
+CM_ BO_ 256 "Standard ID 0x100. Sent every 1 s on CAN1 and CAN2.";
+CM_ BO_ 258 "Standard ID 0x102. Filtered and calibrated physical input voltage before the hardware divider.";
+CM_ BO_ 259 "Standard ID 0x103. Sent every 500 ms. Frequency order is PA0, PA2, PA6, PB14.";
+CM_ BO_ 801 "Standard ID 0x321. Accepted on CAN1 and CAN2. The on-wire voltage is an unsigned mV value.";
+CM_ BO_ 802 "Standard ID 0x322. Sent on CAN1 and CAN2 after a DAC command. Result 0 indicates the I2C write failed.";
+CM_ BO_ 816 "Standard ID 0x330. Sent at startup and whenever PD0-PD14 state changes, on CAN1 and CAN2.";
+CM_ SG_ 256 Board_Identifier "Fixed board identifier 0xA1.";
+CM_ SG_ 259 Frequency_PA0 "TIM5_CH1 input capture on PA0.";
+CM_ SG_ 259 Frequency_PA2 "TIM9_CH1 input capture on PA2.";
+CM_ SG_ 259 Frequency_PA6 "TIM3_CH1 input capture on PA6.";
+CM_ SG_ 259 Frequency_PB14 "TIM12_CH1 input capture on PB14.";
+CM_ SG_ 816 SDC_Input_State "Bit 0 through bit 14 map directly to PD0 through PD14.";
+CM_ SG_ 816 SDC_Changed_Mask "A set bit identifies an input that changed since the preceding GPIO-status frame.";
diff --git a/readme.md b/readme.md
index b600505..ef550ed 100644
--- a/readme.md
+++ b/readme.md
@@ -2,7 +2,14 @@
> 说明:本文整理的是可交付、可复核的工程设计思路和关键取舍,不记录逐步的内部思维链。依据当前目录中的网表、STM32F407VET6 引脚资料、引脚规划文档和 Altium 工程包整理。
-固件已实现功能、CAN/串口协议、编译和下载方法见[固件使用说明](固件使用说明.md)。
+## 交付文件
+
+- [固件使用说明](固件使用说明.md):功能、串口/CAN 协议、编译、下载与现场排障。
+- [CAN 数据库(DBC)](SDC_ACQ_DAC.dbc):CAN1/CAN2 使用的 11 位标准帧定义。
+- [固件交付说明 PDF](SDC-ACQ_DAC_固件交付说明.pdf):可直接对外发送的简要说明。
+- `A11_F407_SDC_ACQ_DAC_CubeMX/`:CubeMX 工程与应用源代码。
+
+构建目录和 `.bin`、`.elf`、`.hex` 等编译产物不纳入版本库;请根据工程重新生成。
## 1. 设计目标
@@ -103,7 +110,7 @@ MCU 侧 I2C 为 `PB10/PB11`,网络名为 `I2C_SCL_33`、`I2C_SDA_33`;5 V 侧
### 4.6 24 V 电压检测
-`PB0/ADC1_IN8` 对应网表中的 `ADC` 网络,通过分压电阻把最高 20 V 压到 MCU ADC 安全范围内。当前规划建议过 `100 k` 与 `20 k` 量级分压,并在采样点加小电容滤波。
+`PB0/ADC1_IN8` 对应网表中的 `ADC` 网络,通过分压电阻把最高输入压到 MCU ADC 安全范围内。当前固件按上臂 `100 kΩ`、下臂 `30 kΩ` 换算输入电压,并在采样点加小电容滤波。实物分压电阻值仍应以原理图/BOM 和测量结果复核;若硬件不同,必须同步更新固件标定参数。
这部分的关键不是只算分压比,还要确认:
@@ -159,5 +166,3 @@ MCU 侧 I2C 为 `PB10/PB11`,网络名为 `I2C_SCL_33`、`I2C_SDA_33`;5 V 侧
- 24 V 分压到 ADC 的最高电压是否低于 `VREF+`,并留足异常保护。
- 15 路 SDC 输入的硬件反相、上下拉和软件逻辑是否一致。
- 连接器针序是否和外部线束定义一致,特别是 CAN、12 V、电源地和 DAC 输出。
-
-
diff --git a/固件使用说明.md b/固件使用说明.md
index 7e164e7..f08b2c3 100644
--- a/固件使用说明.md
+++ b/固件使用说明.md
@@ -1,6 +1,6 @@
# SDC-ACQ&DAC 固件使用说明
-本文对应目录 `A11_F407_SDC_ACQ_DAC_CubeMX/` 中的 STM32F407VET6 工程,说明当前已实现功能、通信协议、编译下载与维护方法。引脚来源见[引脚规划](引脚规划.md),CAN 信号定义见工程内的 `A11_F407_SDC_ACQ_DAC.dbc`。
+本文对应目录 `A11_F407_SDC_ACQ_DAC_CubeMX/` 中的 STM32F407VET6 工程,说明当前已实现功能、通信协议、编译下载与维护方法。引脚来源见[引脚规划](引脚规划.md),CAN 信号定义以仓库根目录的 [SDC_ACQ_DAC.dbc](SDC_ACQ_DAC.dbc) 为准。
## 1. 工程入口与运行流程
@@ -84,7 +84,7 @@ CAN1 和 CAN2 使用相同协议,所有主动上报均分别发送到两条总
| `0x321` | DAC 设置命令 | 接收 | `[DAC 编号][mV_L][mV_H]` |
| `0x322` | DAC 应答 | 每次 DAC 设置后 | `[结果][DAC 编号][mV_L][mV_H]` |
-心跳帧中板号为 `0xA1`、协议版本为 `0x01`,序号与上电时间均为低字节在前。完整信号定义和量纲以 [DBC 文件](A11_F407_SDC_ACQ_DAC_CubeMX/A11_F407_SDC_ACQ_DAC.dbc) 为准。
+心跳帧中板号为 `0xA1`、协议版本为 `0x01`,序号与上电时间均为低字节在前。完整信号定义和量纲以 [DBC 文件](SDC_ACQ_DAC.dbc) 为准。
### DAC CAN 报文示例
@@ -160,4 +160,4 @@ Release 固件为 `build/Release/A11_F407_SDC_ACQ_DAC.bin`。若改动了 `.ioc`
- 修改 CAN 速率时,CAN1 与 CAN2 的波特率及外部分析仪配置必须一致。
- 修改 ADC 分压、标定或滤波参数时,应使用已知直流电压复测,并确认 CAN `0x102` 与串口数值一致。
- 修改 DAC 地址、参考电压或输出范围时,同时更新 DBC、本文和 `DAC*_ADDR7`、`DAC_REFERENCE_MV` 宏。
-- 本工程不包含构建目录和固件二进制;发布生产固件前应从当前提交重新编译生成。
+- 本工程不包含构建目录和 `.bin`、`.elf`、`.hex` 等固件二进制;发布生产固件前应从当前提交重新编译生成。