这个包是基于你上传的 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"。

