# AMI 主控固件 2026-10-04:新增 AMI `0x301` 标准心跳帧(DLC 8),仅 CAN1(500 kbit/s)100 ms 一次,CAN2 不发送心跳,包含版本、uint16 序号和 uint32 运行毫秒值,小端。源码和 DBC 已更新,已烧录并全量回读一致;CAN1 实测 121 帧,间隔 99.952~100.180 ms。完整定义见 [DBC 说明](../docs/AMI_CAN_DBC说明.md)。 这是 `AMI.HMI` 配套的 STM32 HAL 固件。目标器件按 **STM32G0B1CBT6(LQFP48,128 KB Flash)** 生成;ST 的 G0B1 产品线没有 `STM32G0B1C8T6`,如果实物丝印为 `STM32G0B1CCT6` 或 `STM32G0B1CET6`,引脚及应用代码兼容,只需在 CubeMX 中切换具体料号后重新生成。 ## 引脚与外设 | 封装脚 | GPIO | 功能 | | --- | --- | --- | | 11 | PA0 | STATUS_LED1,500 ms 翻转一次(运行心跳) | | 12 | PA1 | STATUS_LED2,仪表/SDC 状态活动超时提示;两路择有效输入 | | 13 | PA2 | USART2_TX → 屏幕 RX,9600 8N1 | | 14 | PA3 | USART2_RX ← 屏幕 TX,9600 8N1 | | 19 | PB0 | FDCAN2_RX,250 kbit/s,与 CAN1 解码功能相同 | | 20 | PB1 | FDCAN2_TX,250 kbit/s,与 CAN1 任务发送功能相同 | | 33 | PA11 | FDCAN1_RX,默认 500 kbit/s | | 34 | PA12 | FDCAN1_TX,默认 500 kbit/s | LED 默认按高电平点亮。如果硬件是低电平点亮,将 `Core/Inc/ami_app.h` 中 `AMI_LED_ACTIVE_LEVEL` 改为 `GPIO_PIN_RESET`。 CAN1 为 500 kbit/s、CAN2 为 250 kbit/s。FDCAN 时钟为 64 MHz,两路 ClockDivider=1,NominalPrescaler 分别为 8 / 16;TimeSeg1=13、TimeSeg2=2、SJW=1,采样点均为 87.5%。CAN1 使用根目录 `AMI.dbc`,CAN2 使用 `AMI_CAN2_250k.dbc`。MCU 不在两路之间转发原始 CAN 报文。 当前版本 v2.7(2026-10-07)在 v2.6 双前轮轮速基础上增加独立无人状态反馈。v2.6(2026-10-05)接入 SDC 最新双前轮轮速 `0x6A2 / DLC 4`;本次 v2.7 已于 2026-10-07 烧录,CAN1/COM6 验收见文末记录,历史轮速记录仍不证明本次已连接真实 SDC 节点。 2026-10-06:v2.6 已写入 `0x08000000`,CubeProgrammer 校验成功,16632 字节 Flash 全量回读与发布 BIN 一致,MCU 已复位。烧录前保存完整 128 KB Flash 备份;真实 SDC/物理屏幕轮速联调尚未完成,见 [轮速验证报告](../docs/SDC轮速接入验证报告.md#2026-10-06-烧录与回读)。 ## 数据路径 - FDCAN1、FDCAN2 使用相同的四条标准过滤器和一条扩展过滤器,接收自定义显示 0x182、SDC 0x6A0..0x6A6 与 BMS 0x140 / 0x156 / 0x186040F3 / 0x186140F3。 - 标准 0x182 / DLC 8:小端 int16 扭矩千分、0.1℃ 电机温度、0.1℃ MCU 温度;有效标志及版本校验见 [DBC 说明](../docs/AMI_CAN_DBC说明.md)。设置 dash.mct / djwd / mcuwd,独立超时 2000 ms。 - v2.4 标准 0x183 / DLC 8:VCU 实际任务、锁定、EBS 显示反馈,各有有效标志,独立超时 500 ms;错误帧不刷新超时。过滤器 3 使用双 ID 接收 0x182/0x183,两路共用解码。UART 更新 current_task/lock_state/ebs_state,任务请求不改写实际状态;屏幕接口需配套 1.4。 - 标准 0x6A6 的 PD0~PD14 按用户表顺序映射为 d0,d5,d2,d6,d7,d1,d3,d4,d8..d14;全部低电平正常、高电平故障,d15 保持未知。有效心跳维持已有状态;SDC 心跳/GPIO 均超过 500 ms 未接收后置未知,恢复需新 GPIO 采样。 - SDC `0x6A2 / DLC 4`:左前 PA0、右前 PA6 小端 uint16 mm/s,20 ms;平均轮速换算整数 km/h,`((left+right)*9+2500)/5000`。独立超时 500 ms 保留值变灰,旧 DLC 8 拒绝。 - SDC GPIO 当前每 1000 ms 周期上报,心跳仍维持已有状态。 - SDC ADC 为低压电池电压;BMS 总压、偏置电流和最高有效实际温度按源协议解码。旧 0x180 / 0x181 / 0x280 不再接收。 - 主循环通过 USART2 TX DMA 一次发送一条完整 TJC 指令,末尾为三个真实字节 `FF FF FF`。 - 仅变化后的数值排队,字段轮转和 DMA 合并最新值,避免刷新饥饿;白色为有效数值,灰色为未知/失效,ADC 和 BMS 各自计时。 - 每 5 秒重新同步全套显示状态,恢复晚启动或重连的屏幕;仍使用非阻塞 DMA 和最新值合并。 - USART2 使用 Receive-to-Idle DMA;屏幕发来的 6 字节任务帧可拆包、粘包解析。 - 合法任务帧进入 3 项有效容量的无锁小队列,再由主循环发到近期有通信的 CAN 口;两路都活跃时同时发送。 完整字节定义见 [SDC_BMS协议.md](../docs/SDC_BMS协议.md)。 ## 构建 使用本机 STM32CubeCLT 1.19.0: ```powershell $env:PATH = 'D:\STM32CubeCLT_1.19.0\CMake\bin;D:\STM32CubeCLT_1.19.0\Ninja\bin;D:\STM32CubeCLT_1.19.0\GNU-tools-for-STM32\bin;' + $env:PATH cmake --preset Release cmake --build --preset Release --parallel ``` ELF 输出为 `build/Release/AMI_Controller.elf`。需要 BIN 时: ```powershell arm-none-eabi-objcopy -O binary build/Release/AMI_Controller.elf build/Release/AMI_Controller.bin ``` CubeMX 配置源为 `AMI_Controller.ioc`。重新生成时保留 USER CODE 区;`ami_app.c/.h`、`ami_protocol.h` 和根 `CMakeLists.txt` 为应用层文件,不要从工程中移除。 ## 实物联调前确认 1. 核对芯片完整丝印,确认是 CB/CC/CE 中的哪一个。 2. 确认 CAN1/CAN2 收发器、终端电阻;CAN1 总线 500 kbit/s、CAN2 总线 250 kbit/s。 3. 确认屏幕是 TTL 电平并与主控共地,主控 TX 接屏 RX、主控 RX 接屏 TX。 4. 下载 `AMI.HMI` 后逐条验证仪表数值、16 路 debug 状态及 6 个任务按钮。 5. 2026-10-03 已完成 v2.1 CAN1 500K 与 CAN2 250K 分别到 MCU / USART2 / COM4 / 官方 HMI 调试器的联调;物理屏幕、真实节点、两路同时接入和 LED 极性尚未实测。见 [双 CAN 测试报告](../docs/CAN1_CAN2_v2.1测试报告.md)。 历史 v2.4 BIN 已烧录并完整回读 16428 字节一致,RAM 2640 字节,详见 [VCU 状态反馈报告](../docs/VCU状态反馈测试报告.md)。此前 v2.3 BIN 已归档,十五路映射历史实测见 [映射报告](../docs/DEBUG十五路CAN映射测试报告.md)。v2.2 的 0x182 CAN2 250K 历史实测见 [显示 CAN 测试报告](../docs/AMI自定义显示CAN测试报告.md)。v2.1 双 CAN 分别联调及 v2.0 历史证据保留;SDC 仍为 500K。 ## 2026-10-07 无人状态显示 v2.7 按 ASF 补充独立无人状态,800×480 主页面在“已锁定/已解锁”右侧显示 AS OFF、AS Ready、AS Driving、AS Finished、AS Emergency 或 Manual Driving;无效或超过 500 ms 无反馈显示灰色“无人未知”。状态来自 VCU,不从任务、锁定、EBS 或灯色推断。 `0x183 / DLC 8` 版本 2:byte3 bit3 为 AS 有效标志,byte5 为状态 0..5(按上面顺序),byte6=0,byte7=2;其他字段位置不变。例 `02 01 01 0F 00 01 00 02` 表示直线加速、已锁定、AS Ready、EBS 正常。保留位和枚举错误整帧拒绝、不续期。旧版本 1 仍接收原三项,但 AS 立即未知。屏内新增 `as_state=0..5`(6 未知),串口命令仍使用真实 FF FF FF 结尾;全局变量在切页后保留,每 5 秒重同步。需配套包含 as_state 的新屏幕工程;480×272 AMI.HMI 与 800×480 工程均已加入 as_state;小屏 AS=5 显示“有人驾驶”。完整定义见 CAN DBC 说明的“VCU 状态反馈 0x183”。 本次源码、屏幕工程和构建产物的验证以 `docs/无人状态显示验证报告.md` 为准,历史烧录和联调记录不代表本次版本已下载到实物。 2026-10-07:v2.7 已烧录并完整回读程序区 16,672 字节一致,保留 128 KB 烧录前备份;CAN1 500K→MCU RAM→COM6 实际链路 37 项通过,实际串口驱动官方 HMI 调试器新增状态 16 项通过,含触摸请求→UART→MCU→CAN 0x300。实物串口屏、CAN2、真实 VCU 和车辆动作未测试。详见 [无人状态验收报告](../docs/无人状态显示验证报告.md)。