嵌入式课程设计
2026 嵌入式系统课程设计项目 | 基于 FreeRTOS 实时操作系统
本项目是嵌入式系统课程设计作业,以 STM32F103C8T6 最小系统板 为核心主控,采用 FreeRTOS 抢占式多任务内核进行调度,集成 OLED 显示、MPU6050 六轴传感器、旋转编码器、蓝牙通信模块,实现智能手表的时间显示、运动计步、人机交互、无线数据同步等完整功能。
项目完成课程大纲全部基本要求,并实现扩展要求 1(编码器多级菜单)、扩展要求 2(蓝牙上位机同步)、扩展要求 4(运动计步与数据记录),不包含 PCB 设计。
- 片内 RTC 精准走时:复用主控片内 RTC 外设 + 板载 32.768kHz 晶振(LSE)走时,无需外置 RTC 芯片;RTC 位于独立后备域,休眠(STOP)期间仍持续走时,唤醒后时间不丢失
- 多页面显示:1.3 寸 OLED 屏幕,支持时间页、传感器数据页、计步统计页切换
- 六轴传感采集:MPU6050 实时读取加速度与陀螺仪原始数据
- 多任务调度:FreeRTOS 抢占式内核,任务间通过消息队列与互斥信号量安全通信
- 独立电源系统:3.7V 锂电池供电,支持 Type-C 充电,搭配分立元件一键开机电路
- 旋转编码器交互:EC11 编码器 + 定时器硬件正交解码,实现多级菜单流畅翻页、参数调整与按键确认
- 蓝牙无线同步:JDY-31 经典蓝牙模块,配合 PC 端图形化上位机,实现运动数据与时间的双向无线同步
- 运动计步算法:基于加速度计的动态阈值 + 波峰检测滤波算法,过滤日常杂散抖动,支持步数统计、历史数据 RAM 缓存与内部 Flash 掉电持久化
- 低功耗管理:10s 无操作自动熄屏并进入 STOP 低功耗模式,支持编码器按键 / MPU6050 抬腕中断(EXTI)唤醒(STOP 下编码器旋转不参与唤醒)
| 模块 | 型号/规格 | 说明 |
|---|---|---|
| 主控单元 | STM32F103C8T6 最小系统板 | 核心控制单元,由课程提供 |
| 显示模块 | 1.3 寸 OLED 128×64(软件 I2C) | 界面与数据显示输出(软件 I2C 规避 F1 硬件 I2C 死锁) |
| 运动传感器 | MPU6050 六轴模块(I2C 接口) | 姿态检测、计步数据采集 |
| 输入交互 | EC11 旋转编码器(带微动开关) | 菜单切换、数值调节与按键确认 |
| 无线通信 | JDY-31 经典蓝牙模块(UART 接口) | 与上位机进行无线数据交互 |
| 电源系统 | 3.7V 锂电池 + TP4056 充电模块 + XC6206 LDO | 整机供电与锂电池充电管理 |
| 开机电路 | SI2301 PMOS + S8050 NPN + 轻触按键 | 一键开关机控制逻辑 |
| 原型辅料 | 面包板、杜邦线、基础阻容件 | 电路原型搭建与调试 |
| 任务名称 | 优先级 | 触发方式 | 核心职责 |
|---|---|---|---|
| Task_Power | 4(最高) | 超时触发 / 外部中断 | 电源状态监测、低功耗模式管理、唤醒事件处理 |
| Task_Sensor | 3(高) | 20ms 定时周期 | MPU6050 数据采样、计步算法运算、运动数据缓存 |
| Task_UI | 2(中) | 事件驱动 | 多级菜单状态机维护、OLED 界面渲染刷新 |
| Task_Comm | 1(低) | 数据队列触发 | 数据打包、蓝牙串口异步发送、上位机指令解析 |
- OLED 软件 I2C + MPU6050 硬件 I2C1 双总线物理隔离,从根本上消除总线访问冲突;跨任务共享数据由消息队列与互斥锁保护
- 定时器硬件正交解码,无阻塞高效处理编码器旋转输入
- 动态阈值波峰检测计步算法,有效过滤日常抖动带来的误触发
- 串口环形缓冲区设计,实现蓝牙异步无阻塞数据收发
- 多级结构体菜单状态机,支持多层页面嵌套跳转与参数设置
GitHub 仓库根目录采用模块化拓扑进行组织,具体架构如下:
SmartWatch_STM32
├── Hardware/ # 硬件资料(原理图、BOM清单)
├── Firmware/ # STM32CubeIDE 固件工程
│ ├── Core/ # 业务代码与 FreeRTOS 任务
│ ├── Drivers/ # HAL 库与外设驱动
│ └── FreeRTOS/# 操作系统内核
├── Host/ # 蓝牙上位机(Python)
├── Docs/ # 课程交付文档
└── README.md
参考 Hardware/Schematic/ 目录下的原理图,在面包板上完成所有模块的接线,确认电源正负极无误后再上电测试。
- 工具链:VSCode + CMake + Ninja + arm-none-eabi-gcc(工程已随仓库提供
CMakePresets.json与工具链文件Firmware/cmake/gcc-arm-none-eabi.cmake) - 外设配置由
Firmware/SmartWatch.ioc(CubeMX 工程)生成;如需改引脚可参考Firmware/CubeMX配置清单.md,应用层接入方式见Firmware/集成说明.md - 编译(在
Firmware/目录下):生成的固件为cmake --preset Debug cmake --build --preset Debug
Firmware/build/Debug/SmartWatch.elf - 通过 ST-Link 调试器将
.elf烧录至 STM32F103C8T6 最小系统板
- 安装 Python 依赖:
pip install -r Host/requirements.txt(或pip install pyserial pyqt5) - 进入
Host/目录,运行python watch_gui.py - 电脑配对蓝牙模块(JDY-31,出厂波特率 9600)后会生成一个串口,在下拉框选择该串口并连接,即可实时查看手表时间、步数与加速度数据,并可校时 / 请求同步
- ✅ 阶段一(6.29 - 6.30):选题确认、物料采购、项目计划书提交
- 🔄 阶段二(7.1 - 7.2):硬件原型搭建、底层驱动开发、系统设计文档提交
- ⏳ 阶段三(7.3 - 7.6):FreeRTOS 移植、核心功能开发、中期检查
- ⏳ 阶段四(7.7 - 7.8):全功能联调、上位机开发、验收准备
- ⏳ 阶段五(7.9 - 7.10):第一次验收、问题整改、最终验收
| 成员 | 负责方向 | 主要工作 |
|---|---|---|
| 周瑜亮 | 硬件与通信 | 硬件电路搭建、电源系统调试、蓝牙通信驱动、低功耗功能开发 |
| 郭浩哲 | 内核与算法 | FreeRTOS 移植与任务调度、片内 RTC(LSE)走时与 Flash 持久化、运动计步算法开发 |
| 叶锦前 | UI 与上位机 | 编码器驱动、多级菜单状态机、OLED 显示驱动、蓝牙上位机开发、项目文档维护 |
本项目仅用于课程设计学习交流,代码部分遵循 MIT License。