Files
SDC_ACQ_DAC/固件使用说明.md

9.8 KiB
Raw Permalink Blame History

SDC-ACQ&DAC 固件使用说明

本文对应目录 A11_F407_SDC_ACQ_DAC_CubeMX/ 中的 STM32F407VET6 工程,说明当前已实现功能、通信协议、编译下载与维护方法。引脚来源见引脚规划,CAN 信号定义以仓库根目录的 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、每 20 ms 上报双路轮速。
  6. 每 500 ms 翻转运行指示灯,每 100 ms 发送 CAN 心跳。

PE0 为正常运行心跳灯;若进入 Error_Handler(),PE0 和 PE1 会快速同时翻转。

2. 引脚与外设

功能 MCU 引脚/外设 当前配置
15 路状态输入 PD0~PD14 双边沿 EXTI,状态位直接对应端口位
左前轮速 PA0 / TIM5_CH1 上升沿输入捕获,32 位计数器,16 MHz 计数时钟
右前轮速 PA6 / TIM3_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 回调,变化掩码会在当前 1 秒周期内累积;0x6A6 固定每秒发送一次:

GPIO changed mask=0x0004 state=0x0005
  • state:当前 15 路完整状态。
  • mask:过去 1 秒内发生过变化的位;同一路即使变化多次也只置 1。
  • 上电后首个周期结束时发送第一帧;若无变化,变化掩码为 0。

每秒串口还会打印一次完整状态,例如 GPIO state=0x0005。

4. ADC 输入电压

串口和 CAN 上报的是分压前的输入电压,单位为 mV,不是 PB0 管脚电压。当前换算过程为:

ADC 原始值 -> 3.3 V ADC 电压 -> 100 kΩ / 30 kΩ 分压反算 -> 标定系数 -> 滤波输出

标定系数固定为 12300 / 11656:即以实测输入 12.3 V、旧换算结果 11656 mV 为基准。每次报告读取 16 次 ADC 后求平均,再对最近 4 次报告做移动平均;报告周期为 500 ms,滤波窗口约 2 秒。输出示例:

ADC=12300mV WheelSpeed=LF:0.289m/s RF:0.577m/s

若硬件分压电阻或外部标定基准改变,应同步修改 main.c 中的 ADC_DIVIDER_* 和 ADC_CALIBRATION_* 宏。

5. 双路轮速输入

仅采集左前轮速 PA0 和右前轮速 PA6。频率由相邻两个上升沿的计数差计算;超过 1 秒没有边沿则输出 0 m/s。每圈 49 个方波、轮周长 1414 mm,因此 轮速(m/s) = 方波频率(Hz) × 1.414 / 49。

0x6A2 每 20 ms 发送两个 uint16:左前在 Byte0–1,右前在 Byte2–3。原始值的单位为 mm/s,DBC 的物理量纲为 0.001 m/s;最高表示 65.535 m/s。PA6 的 TIM3 为 100 kHz、16 位计数器,低频无歧义测量下限约 1.53 Hz;PA0 的 TIM5 为 32 位计数器,低频范围更大。

6. CAN 通信

CAN1 和 CAN2 使用相同协议,所有主动上报均分别发送到两条总线。使用 11 位标准数据帧、低字节在前(little-endian)。CAN 正常发帧必须存在至少一个其他节点 ACK;单独接 CAN 分析仪且未开启 ACK 时,发送邮箱可能不会完成。

两路 CAN 均开启硬件自动 Bus-Off 恢复(ABOM)。总线重新满足恢复条件后,无需 MCU RESET 或整车断电即可重新通信;恢复功能不能消除线束、终端、节点或位时序造成的错误。

主循环分别维护两路发送邮箱:Bus-Off 时停止入队并请求取消未完成帧;正常状态下超过 100 ms 仍未完成的帧也会被异步取消,避免未连接的 CAN2 或缺少 ACK 时积压旧上报和 DAC 应答。邮箱满或入队失败的帧直接丢弃并统计,不阻塞另一条 CAN,也不等待取消完成。周期上报在后续周期重新生成;DAC 应答不保证重发。

可通过 STLINK/GDB 读取 can_diagnostics[0](CAN1)和 [1](CAN2):last_esr 为最近的硬件错误状态,bus_off_events / recovery_events / passive_events 为主循环观察到的状态转换次数,tx_queued 为入队数,tx_completed 为硬件 TXOK 完成数,tx_failed 为未成功完成数(含取消),tx_unobserved 为在邮箱重新分配前未能采到完成结果的帧数,tx_dropped 为未入队数,abort_requests / abort_failures 为取消请求成功/失败次数。计数上电清零,按 uint32 回绕;轮询可能漏掉短暂状态转换。ESR 的 TEC 字段只有发送错误计数的低 8 位,Bus-Off 时不能将它当作完整计数。TXOK 仍需外部抓包验证报文内容和持续通信。

ID 名称 周期/触发 数据
0x6A0 心跳 每 100 ms A1 01 seq_L seq_H uptime_0..3
0x6A1 ADC 电压 每 500 ms 输入电压 uint16,单位 mV
0x6A2 双路轮速 每 20 ms 左前 PA0、右前 PA6 各一个 uint16,单位 0.001 m/s,DLC=4
0x6A3 DAC 设置命令 接收 [DAC 编号][mV_L][mV_H];每路在 100 ms 内未收到本路下一帧时归零
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 状态 每 1 s 状态 uint16、变化掩码 uint16、时间戳 uint32 ms

心跳帧中板号为 0xA1、协议版本为 0x01,序号与上电时间均为低字节在前。完整信号定义和量纲以 DBC 文件 为准。

DAC 的 CAN 安全超时按通道独立执行:收到 0x6A3 中 DAC1 或 DAC2 的有效控制帧后,该通道必须在 100 ms 内再次收到自己的控制帧,否则固件仅将该通道写为 0 mV 一次。串口 DAC 指令不启动或刷新这个 CAN 控制帧超时。

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:

ID=0x6A3  DLC=3  DATA=01 C4 09

成功应答:

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 相连。

上电提示:

A11 F407 monitor ready
UART: DAC1 1.234 or DAC2 2500
CAN cmd 0x6A3: [dac_id][mV_L][mV_H] or ASCII text

支持的 DAC 命令不区分大小写:

DAC1 1.234
DAC2 2500
D1 2.5V

数值可使用伏特小数或毫伏整数;允许范围为 0 至 5000 mV。命令执行后会回显结果,并在两条 CAN 上发送 0x6A4 应答。

8. 编译、生成与下载

进入工程目录后执行:

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 重新生成代码:

./tools/cubemx_generate.sh

默认脚本使用 /home/acetaffy/STM32CubeMX/STM32CubeMX;其他位置可通过 STM32CUBEMX_BIN 覆盖。重新生成后,只在 USER CODE BEGIN/END 区间维护应用代码,避免被 CubeMX 覆盖。

使用 STM32CubeProgrammer 下载的示例:

/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 等固件二进制;发布生产固件前应从当前提交重新编译生成。