这个包是基于你上传的 motor_control_board_V1.2 工程做的“可直接替换版”。 我保留了 CubeMX 生成的外设初始化文件结构,重点重写了你自己的应用层逻辑: - Core/Src/app_init.c - Core/Src/app_freertos.c - Core/Src/attitude.c - Core/Src/callback.c - Core/Src/car_move.c - Core/Src/mpu6050.c - Core/Src/readpin.c - Core/Src/variables.c - Core/Inc/variables.h 主要修复点: 1. 串口帧解析改为状态机,支持重新同步,只接受 0F xx xx F0,且中间两字节必须是 01~04。 2. UART 接收中断启动移到 UART 任务里,避免任务句柄未注册时丢第一帧。 3. 电机控制重写为“左电机/右电机”两套独立模式解析,逻辑更清晰。 4. ADC 任务启动时先做 HAL_ADCEx_Calibration_Start 校准,再做 8 次平均采样。 5. 电池电压增加 battery_voltage 变量,显示时直接看实际电池电压(按 *11 分压比换算)。 6. MPU6050 支持自动探测 0x68 / 0x69 两个地址;初始化失败会显示 P:ERR。 7. 姿态任务支持掉线重试,不会一直静默为 0。 8. ReadPin 改成显式位掩码写法,保持和你原车控编码兼容,但去掉了原先晦涩的连环左移。 9. OLED 刷新时先清屏,避免显示残影和旧数字残留。 使用方法: - 最简单:直接把这个包里的整个 Core 文件夹覆盖到你的工程里。 - 如果你只想替换我重写过的文件,也可以只替换上面列出的那些文件。 上板后建议按下面顺序验证: 1. 上电看 OLED: - 如果串口没发数据,应显示 S:0 0 - 如果 ADC 正常,应显示 V:x.x - 如果 MPU 正常,应显示 P:x.x;否则显示 P:ERR 2. 电脑发原始 4 字节 HEX:0F 01 04 F0 - OLED 应显示 S:1 4 3. 按按钮 - 电机应按左右轮分别动作 4. 摇晃板子 - P: 数值应变化 5. 检查电源电压 - V: 不应长期固定为 0.0 仍然可能需要你继续检查的硬件项: 1. MPU6050 是否真的接在 I2C1,且 AD0 是接地还是接高电平。 2. I2C 的 PB8/PB9 是否有上拉。 3. ADC 的 PA0 是否真的接到了分压输出,而不是悬空或接错通道。 4. 电脑串口工具是否发的是“原始字节流”,不是字符串 "0F0104F0"。