Files
SDC_ACQ_DAC/固件使用说明.md
T

170 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SDC-ACQ&DAC 固件使用说明
本文对应目录 `A11_F407_SDC_ACQ_DAC_CubeMX/` 中的 STM32F407VET6 工程,说明当前已实现功能、通信协议、编译下载与维护方法。引脚来源见[引脚规划](引脚规划.md),CAN 信号定义以仓库根目录的 [SDC_ACQ_DAC.dbc](SDC_ACQ_DAC.dbc) 为准。
## 1. 工程入口与运行流程
主要应用代码在 `A11_F407_SDC_ACQ_DAC_CubeMX/Src/main.c` 的 `USER CODE` 区域。启动后依次完成外设初始化、CAN 启动、四路输入捕获启动、ADC 校准配置、DAC 清零,并立即发送一次 15 路输入状态。
主循环不依赖 RTOS,按以下顺序执行:
1. 接收并处理串口命令。
2. 接收 CAN1、CAN2 的 DAC 控制帧。
3. 读取四路定时器捕获值并计算频率。
4. 汇总 15 路 GPIO 变化并上报。
5. 每 500 ms 上报 ADC 和四路频率。
6. 每 500 ms 翻转运行指示灯,每 1 s 发送 CAN 心跳。
`PE0` 为正常运行心跳灯;若进入 `Error_Handler()`,`PE0` 和 `PE1` 会快速同时翻转。
## 2. 引脚与外设
| 功能 | MCU 引脚/外设 | 当前配置 |
|---|---|---|
| 15 路状态输入 | `PD0`~`PD14` | 双边沿 EXTI,状态位直接对应端口位 |
| 频率 1 | `PA0` / `TIM5_CH1` | 上升沿输入捕获,32 位计数器,16 MHz 计数时钟 |
| 频率 2 | `PA2` / `TIM9_CH1` | 上升沿输入捕获,16 位计数器,100 kHz 计数时钟 |
| 频率 3 | `PA6` / `TIM3_CH1` | 上升沿输入捕获,16 位计数器,100 kHz 计数时钟 |
| 频率 4 | `PB14` / `TIM12_CH1` | 上升沿输入捕获,16 位计数器,100 kHz 计数时钟 |
| 电压采集 | `PB0` / `ADC1_IN8` | 480 周期采样,16 次过采样 + 4 次报告均值滤波 |
| CAN1 | `PB8` RX、`PB9` TX | 标准帧,500 kbit/s |
| CAN2 | `PB5` RX、`PB6` TX | 标准帧,500 kbit/s |
| DAC I2C | `PB10` SCL、`PB11` SDA / `I2C2` | 控制两颗 MCP4725,5 V 基准 |
| ASSI RGB 灯 MOS | `PE9` R、`PE10` G、`PE11` B | 推挽输出,高电平使能外部 MOS |
| 调试串口 | `PA9` TX、`PA10` RX / `USART1` | 115200、8N1、无流控 |
| 运行/故障 LED | `PE0` / `PE1` | 正常心跳 / 故障指示 |
系统当前使用内部 HSI 16 MHz。CAN 的位时序为预分频 4、`BS1=5TQ`、`BS2=2TQ`,对应 500 kbit/s。
## 3. 15 路状态输入
`PD0`~`PD14` 的逻辑电平组成一个 15 位无符号数:bit0 对应 `PD0`,bit14 对应 `PD14`。任何一路变化会触发 EXTI 回调,主循环中合并同一时段的变化并输出:
```text
GPIO changed mask=0x0004 state=0x0005
```
- `state`:当前 15 路完整状态。
- `mask`:相对于上一次 GPIO 状态帧发生变化的位。
- 上电时也会发送一帧状态,变化掩码为 0。
每秒串口还会打印一次完整状态,例如 `GPIO state=0x0005`。
## 4. ADC 输入电压
串口和 CAN 上报的是**分压前的输入电压**,单位为 mV,不是 `PB0` 管脚电压。当前换算过程为:
```text
ADC 原始值 -> 3.3 V ADC 电压 -> 100 kΩ / 30 kΩ 分压反算 -> 标定系数 -> 滤波输出
```
标定系数固定为 `12300 / 11656`:即以实测输入 12.3 V、旧换算结果 11656 mV 为基准。每次报告读取 16 次 ADC 后求平均,再对最近 4 次报告做移动平均;报告周期为 500 ms,滤波窗口约 2 秒。输出示例:
```text
ADC=12300mV PWM=10,0,0,0Hz
```
若硬件分压电阻或外部标定基准改变,应同步修改 `main.c` 中的 `ADC_DIVIDER_*` 和 `ADC_CALIBRATION_*` 宏。
## 5. 四路频率输入
四路频率按 `PA0`、`PA2`、`PA6`、`PB14` 顺序输出。频率由相邻两个上升沿的计数差计算;超过 1 秒没有边沿则显示 0 Hz。当前固件只测频率,不测 PWM 占空比。
后三路 16 位定时器采用 100 kHz 计数时钟,以避免低频输入时 16 位溢出。其可无歧义测量的最低频率约为 1.53 Hz;TIM5 为 32 位计数器,低频范围更大。
## 6. CAN 通信
CAN1 和 CAN2 使用相同协议,所有主动上报均分别发送到两条总线。使用 11 位标准数据帧、低字节在前(little-endian)。CAN 正常发帧必须存在至少一个其他节点 ACK;单独接 CAN 分析仪且未开启 ACK 时,发送邮箱可能不会完成。
| ID | 名称 | 周期/触发 | 数据 |
|---:|---|---|---|
| `0x6A0` | 心跳 | 每 1 s | `A1 01 seq_L seq_H uptime_0..3` |
| `0x6A1` | ADC 电压 | 每 500 ms | 输入电压 `uint16`,单位 mV |
| `0x6A2` | 四路频率 | 每 500 ms | 4 个 `uint16`,单位 Hz,顺序 PA0/PA2/PA6/PB14 |
| `0x6A3` | DAC 设置命令 | 接收 | `[DAC 编号][mV_L][mV_H]` |
| `0x6A4` | DAC 应答 | 每次 DAC 设置后 | `[结果][DAC 编号][mV_L][mV_H]` |
| `0x6A5` | ASSI 灯控 | 接收 | `byte0`:`0=AS_OFF`、`1=AS_READY`、`2=AS_DRIVING`、`3=AS_EMERGENCY`、`4=AS_FINISHED` |
| `0x6A6` | GPIO 状态 | 上电、任一输入变化 | 状态 `uint16`、变化掩码 `uint16`、时间戳 `uint32 ms` |
心跳帧中板号为 `0xA1`、协议版本为 `0x01`,序号与上电时间均为低字节在前。完整信号定义和量纲以 [DBC 文件](SDC_ACQ_DAC.dbc) 为准。
### ASSI RGB 状态灯
`PE9/PE10/PE11` 分别控制外部红、绿、蓝灯 MOS,均为高电平有效。`0x6A5` 可由 CAN1 或 CAN2 接收,状态在下一帧有效灯控报文到达前保持不变;上电默认 `AS_OFF`。`AS_READY` 为红绿常亮(黄),`AS_DRIVING` 为红绿以 2 Hz、50% 占空比闪烁(各 250 ms 亮/灭),`AS_EMERGENCY` 为蓝灯以相同节奏闪烁,`AS_FINISHED` 为蓝灯常亮。`PE0` 运行心跳和 `PE1` 故障指示保持原行为。
### DAC CAN 报文示例
将 DAC1 设为 2.500 V:
```text
ID=0x6A3 DLC=3 DATA=01 C4 09
```
成功应答:
```text
ID=0x6A4 DLC=4 DATA=01 01 C4 09
```
DAC 编号 1 的 I2C 7 位地址为 `0x61`,编号 2 为 `0x60`。两路与板级 `MC_L`、`MC_R` 网络的实际对应关系需要以实物测量确认后再固化到线束文档。
## 7. 串口
串口为 `115200-8N1`。USB-TTL 必须交叉连接并共地:板卡 `PA9/TX` 接转换器 RX,板卡 `PA10/RX` 接转换器 TX,GND 相连。
上电提示:
```text
A11 F407 monitor ready
UART: DAC1 1.234 or DAC2 2500
CAN cmd 0x6A3: [dac_id][mV_L][mV_H] or ASCII text
```
支持的 DAC 命令不区分大小写:
```text
DAC1 1.234
DAC2 2500
D1 2.5V
```
数值可使用伏特小数或毫伏整数;允许范围为 0 至 5000 mV。命令执行后会回显结果,并在两条 CAN 上发送 `0x6A4` 应答。
## 8. 编译、生成与下载
进入工程目录后执行:
```sh
cd A11_F407_SDC_ACQ_DAC_CubeMX
cmake --preset Debug
cmake --build --preset Debug
cmake --preset Release
cmake --build --preset Release
```
Release 固件为 `build/Release/A11_F407_SDC_ACQ_DAC.bin`。若改动了 `.ioc` 的外设配置,先用 CubeMX 重新生成代码:
```sh
./tools/cubemx_generate.sh
```
默认脚本使用 `/home/acetaffy/STM32CubeMX/STM32CubeMX`;其他位置可通过 `STM32CUBEMX_BIN` 覆盖。重新生成后,只在 `USER CODE BEGIN/END` 区间维护应用代码,避免被 CubeMX 覆盖。
使用 STM32CubeProgrammer 下载的示例:
```sh
/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
```
下载失败时先检查目标板 3.3 V、NRST、SWDIO、SWCLK、公共地,以及 `VCAP_1/VCAP_2` 去耦是否正常。外部硬件看门狗当前未焊接,固件没有实现其喂狗逻辑。
## 9. 修改注意事项
- 变更 CubeMX 配置后必须重新生成并重新编译,检查 `main.c` 的用户代码区是否完整保留。
- 修改 CAN 速率时,CAN1 与 CAN2 的波特率及外部分析仪配置必须一致。
- 修改 ADC 分压、标定或滤波参数时,应使用已知直流电压复测,并确认 CAN `0x6A1` 与串口数值一致。
- 修改 DAC 地址、参考电压或输出范围时,同时更新 DBC、本文和 `DAC*_ADDR7`、`DAC_REFERENCE_MV` 宏。
- 本工程不包含构建目录和 `.bin`、`.elf`、`.hex` 等固件二进制;发布生产固件前应从当前提交重新编译生成。