补充固件使用说明文档
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
> 说明:本文整理的是可交付、可复核的工程设计思路和关键取舍,不记录逐步的内部思维链。依据当前目录中的网表、STM32F407VET6 引脚资料、引脚规划文档和 Altium 工程包整理。
|
> 说明:本文整理的是可交付、可复核的工程设计思路和关键取舍,不记录逐步的内部思维链。依据当前目录中的网表、STM32F407VET6 引脚资料、引脚规划文档和 Altium 工程包整理。
|
||||||
|
|
||||||
|
固件已实现功能、CAN/串口协议、编译和下载方法见[固件使用说明](固件使用说明.md)。
|
||||||
|
|
||||||
## 1. 设计目标
|
## 1. 设计目标
|
||||||
|
|
||||||
这块板子的目标是围绕 STM32F407VET6 做一块集成采集、通信和 DAC 输出的控制板。核心需求可以归纳为:
|
这块板子的目标是围绕 STM32F407VET6 做一块集成采集、通信和 DAC 输出的控制板。核心需求可以归纳为:
|
||||||
@@ -159,4 +161,3 @@ MCU 侧 I2C 为 `PB10/PB11`,网络名为 `I2C_SCL_33`、`I2C_SDA_33`;5 V 侧
|
|||||||
- 连接器针序是否和外部线束定义一致,特别是 CAN、12 V、电源地和 DAC 输出。
|
- 连接器针序是否和外部线束定义一致,特别是 CAN、12 V、电源地和 DAC 输出。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,163 @@
|
|||||||
|
# SDC-ACQ&DAC 固件使用说明
|
||||||
|
|
||||||
|
本文对应目录 `A11_F407_SDC_ACQ_DAC_CubeMX/` 中的 STM32F407VET6 工程,说明当前已实现功能、通信协议、编译下载与维护方法。引脚来源见[引脚规划](引脚规划.md),CAN 信号定义见工程内的 `A11_F407_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 基准 |
|
||||||
|
| 调试串口 | `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 | 名称 | 周期/触发 | 数据 |
|
||||||
|
|---:|---|---|---|
|
||||||
|
| `0x100` | 心跳 | 每 1 s | `A1 01 seq_L seq_H uptime_0..3` |
|
||||||
|
| `0x102` | ADC 电压 | 每 500 ms | 输入电压 `uint16`,单位 mV |
|
||||||
|
| `0x103` | 四路频率 | 每 500 ms | 4 个 `uint16`,单位 Hz,顺序 PA0/PA2/PA6/PB14 |
|
||||||
|
| `0x330` | GPIO 状态 | 上电、任一输入变化 | 状态 `uint16`、变化掩码 `uint16`、时间戳 `uint32 ms` |
|
||||||
|
| `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) 为准。
|
||||||
|
|
||||||
|
### DAC CAN 报文示例
|
||||||
|
|
||||||
|
将 DAC1 设为 2.500 V:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ID=0x321 DLC=3 DATA=01 C4 09
|
||||||
|
```
|
||||||
|
|
||||||
|
成功应答:
|
||||||
|
|
||||||
|
```text
|
||||||
|
ID=0x322 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 0x321: [dac_id][mV_L][mV_H] or ASCII text
|
||||||
|
```
|
||||||
|
|
||||||
|
支持的 DAC 命令不区分大小写:
|
||||||
|
|
||||||
|
```text
|
||||||
|
DAC1 1.234
|
||||||
|
DAC2 2500
|
||||||
|
D1 2.5V
|
||||||
|
```
|
||||||
|
|
||||||
|
数值可使用伏特小数或毫伏整数;允许范围为 0 至 5000 mV。命令执行后会回显结果,并在两条 CAN 上发送 `0x322` 应答。
|
||||||
|
|
||||||
|
## 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 `0x102` 与串口数值一致。
|
||||||
|
- 修改 DAC 地址、参考电压或输出范围时,同时更新 DBC、本文和 `DAC*_ADDR7`、`DAC_REFERENCE_MV` 宏。
|
||||||
|
- 本工程不包含构建目录和固件二进制;发布生产固件前应从当前提交重新编译生成。
|
||||||
Reference in New Issue
Block a user