这是一个基于 STM32F103C8T6 + MPU6050 + SSD1306 OLED 的实时姿态显示工程。
系统读取MPU6050六轴数据,完成陀螺仪静态零偏校准、姿态估计与四元数更新,并在128×64 OLED上实时绘制带透视效果和隐藏边虚线的三维线框立方体。
- MPU6050原始六轴数据读取与物理量换算
- 上电采集500组数据完成陀螺仪静态零偏校准
- 加速度计倾角计算与姿态状态观察
- Madgwick四元数姿态融合
- 三维顶点旋转、透视投影和屏幕裁剪
- 线框立方体12条边绘制
- 隐藏边虚线显示
- SSD1306 128×64 framebuffer绘图
- I2C2 400 kHz + DMA OLED刷新
- STM32F103 I2C BUSY冷启动恢复
- OLED开屏前GDDRAM清零,避免随机雪花屏
- “冠凯军工 / Jikl62制作”启动画面
- 完整的Ozone可观察模块状态结构
flowchart LR
MPU["MPU6050 六轴数据"] --> CAL["零偏校准与单位换算"]
CAL --> ATT["姿态数据处理"]
ATT --> Q["Madgwick Quaternion"]
Q --> CUBE["Cube3D 旋转与透视投影"]
CUBE --> FB["128x64 Framebuffer"]
FB --> DMA["I2C2 DMA"]
DMA --> OLED["SSD1306 OLED"]
| MPU6050 | STM32F103C8T6 | 说明 |
|---|---|---|
| SCL | PB6 | I2C1_SCL |
| SDA | PB7 | I2C1_SDA |
| VCC | 按模块要求连接 | 电源 |
| GND | GND | 地 |
| OLED | STM32F103C8T6 | 说明 |
|---|---|---|
| SCL | PB10 | I2C2_SCL |
| SDA | PB11 | I2C2_SDA |
| VCC | 按模块要求连接 | 电源 |
| GND | GND | 地 |
当前OLED地址为0x3C,程序也会继续探测常见地址0x3D。
- I2C1:MPU6050,PB6/PB7
- I2C2:SSD1306 OLED,PB10/PB11
- I2C2速度:400 kHz Fast Mode
- I2C2 Duty Cycle:2
- OLED发送:DMA1 Channel 4 TX
- 调试接口:SWD
具体配置以仓库中的cuijiaming_gift.ioc为准。
Core/Inc + Core/Src
├── mpu6050 MPU6050驱动、换算和静态零偏校准
├── attitude 加速度计倾角与姿态基础数据
├── orientation Madgwick四元数姿态融合
├── oled SSD1306控制、framebuffer和DMA传输
├── graphics 像素、直线、虚线、矩形和1-bit位图
├── cube3d 三维立方体、透视投影和隐藏边判断
├── realtime_cube 实时绘制与OLED提交调度
├── i2c_f1_recovery STM32F103 I2C BUSY勘误恢复
├── startup 冷启动检测、OLED探测和启动状态
├── startup_font 启动画面最小字模资源
└── startup_screen 启动画面framebuffer生成
开发环境:
- STM32CubeMX
- Keil MDK-ARM
- ARMCLANG 6.24
使用Keil打开:
MDK-ARM/cuijiaming_gift.uvprojx
然后执行:
Project -> Rebuild all target files
当前完整Rebuild结果:
Code=36044
RO-data=840
RW-data=12
ZI-data=4732
0 Error
0 Warning
- 初始化GPIO、DMA、I2C1和I2C2。
- 等待100 ms,使OLED和I2C总线稳定。
- 检查I2C2 BUSY,必要时执行STM32F103官方勘误恢复流程。
- 最多尝试3次OLED地址探测。
- 在Display OFF状态清零全部1024字节GDDRAM。
- 显示“冠凯军工 / Jikl62制作”启动页。
- MPU6050保持静止并完成500组陀螺仪零偏校准。
- 初始化姿态、四元数和立方体模块。
- 自动切换到实时三维立方体显示。
上电后的校准阶段请保持MPU6050完全静止,否则陀螺仪零偏会被错误估计。
可以直接观察以下稳定全局结构:
| 变量 | 内容 |
|---|---|
g_mpu6050 |
原始六轴、物理量、零偏、校正角速度和通信状态 |
g_attitude |
加速度计倾角与姿态状态 |
g_orientation |
四元数、欧拉角、Madgwick状态和更新统计 |
g_cube3d |
三维顶点、投影点、可见面和隐藏边状态 |
g_oled |
OLED地址、初始化、错误和刷新统计 |
g_oled_dma |
DMA启动、完成、耗时和错误状态 |
g_realtime_cube |
实时渲染与帧提交状态 |
g_startup |
冷启动BUSY恢复、OLED探测、GDDRAM和启动页状态 |
- 请不要随意修改I2C引脚、I2C2速度或DMA通道。
- 修改CubeMX配置后,应确认自定义模块仍被保留在Keil工程中。
- 仓库不提交Keil编译产物和本机调试会话文件;克隆后请执行一次完整Rebuild。
main.c只负责模块初始化和顶层调度,具体功能位于独立模块中。