基于 STM32F103ZE 微控制器的多功能嵌入式智能终端系统,集成了游戏娱乐、文件管理、相册浏览、姿态显示、WiFi 连接等多种功能。系统采用模块化设计,具有类似智能手机桌面的用户界面,支持按键和红外遥控操作,具有良好的可扩展性和可维护性。
graph TB
subgraph "STM32F103ZE 主控"
MCU[STM32F103ZE<br/>主控制器]
end
subgraph "显示模块"
LCD[TFT LCD<br/>显示屏]
FONT[字库模块<br/>Font]
end
subgraph "输入模块"
KEY[按键输入<br/>KEY0/1/2/UP]
IR[红外遥控<br/>IR Receiver]
end
subgraph "通信模块"
USART[串口通信<br/>USART1]
WIFI[WiFi模块<br/>ESP8266]
end
subgraph "存储模块"
FLASH[Flash存储<br/>内部Flash]
SD[SD卡<br/>SDIO接口]
FATFS[FatFS<br/>文件系统]
end
subgraph "传感器模块"
MPU[MPU6050<br/>姿态传感器]
RTC[RTC<br/>实时时钟]
end
subgraph "应用层"
DESKTOP[手机桌面<br/>Phone_Desktop]
TETRIS[俄罗斯方块<br/>Tetris Game]
SETTINGS[设置菜单<br/>Settings]
FILEMGR[文件管理器<br/>File Manager]
ALBUM[相册浏览<br/>Photo Album]
ATTITUDE[姿态显示<br/>Attitude Display]
end
subgraph "系统服务"
SYSTICK[系统节拍<br/>SysTick]
MEM[内存管理<br/>Malloc]
PICLIB[图片库<br/>BMP/GIF/JPG]
end
MCU --> LCD
MCU --> KEY
MCU --> IR
MCU --> USART
MCU --> WIFI
MCU --> FLASH
MCU --> SD
MCU --> MPU
MCU --> RTC
LCD --> FONT
SD --> FATFS
FATFS --> PICLIB
DESKTOP --> TETRIS
DESKTOP --> SETTINGS
DESKTOP --> FILEMGR
DESKTOP --> ALBUM
DESKTOP --> ATTITUDE
MCU --> DESKTOP
MCU --> SYSTICK
MCU --> MEM
- TFT LCD: FSMC 接口,支持多种 LCD 驱动芯片(HX8357DN、ILI9341 等)
- 按键: GPIOE (KEY0/1/2), GPIOA (KEY_UP)
- 红外接收: GPIOB Pin9, EXTI9_5 中断
- WiFi模块: ESP8266,通过串口通信
- MPU6050: I2C 接口
- SD卡: SDIO 接口
- RTC: 内部 RTC 或外部 RTC 模块
- LED: GPIO 控制
- 主界面,提供应用图标网格布局
- 支持 5 个应用入口:俄罗斯方块、设置、文件管理、相册、姿态显示
- 状态栏显示时间、WiFi 状态等信息
- 支持按键和红外遥控导航
- 游戏功能:经典俄罗斯方块游戏实现
- 主菜单:标题居中上方,菜单居中下方
- 游戏区:右侧显示 10×20 网格游戏区域
- 信息栏:左侧显示分数、下一方块预览、暂停状态
- 方块操作:
KEY2/ 红外左键:左移KEY0/ 红外右键:右移KEY_UP/ 红外上键:旋转KEY1/ 红外OK键:暂停/继续- 暂停时
KEY2:返回主菜单
- 游戏特性:
- 满行自动消除并累计分数
- 使用轻量伪随机数生成器生成方块序列
- 差异更新绘制,减少闪烁
- 游戏结束后显示 Game Over,按
KEY0/KEY2返回菜单
- 调试模式:系统调试信息输出
- WiFi 配置:WiFi 开关、SSID 配置、IP 显示
- 开发者模式:模块化调试输出控制(WiFi、RTC、IR)
- 基于 FatFS 文件系统
- 支持 SD 卡文件浏览和管理
- 支持文件操作(查看、删除等)
- 支持多种图片格式:BMP、GIF、JPG
- 自动扫描指定目录(默认
0:/PICTURE) - 图片浏览和显示功能
- 基于 MPU6050 传感器
- 实时显示设备姿态信息
- 3D 姿态可视化
- IDE: Keil MDK-ARM
- 目标芯片: STM32F103ZE
- 编译目标:
Target 1
- 打开工程文件
Template.uvprojx - 选择目标
Target 1 - 执行 Rebuild All
- 下载到开发板
- 上电后系统自动进入手机桌面界面
- LCD 分辨率: 通过
tftlcd_data.width和tftlcd_data.height自动检测 - LCD 驱动: 在
APP/tftlcd/tftlcd.h中通过宏定义选择(默认TFTLCD_HX8357DN) - LCD 方向: 通过
TFTLCD_DIR宏定义(0=竖屏,1=横屏)
KEY_UP/ 红外上键:向上导航KEY1/ 红外下键:向下导航KEY0/ 红外OK键:确认选择KEY2/ 红外左键:向左导航- 红外右键:向右导航
- 主菜单:
KEY_UP/ 红外上键:上移选项KEY1/ 红外下键:下移选项KEY0/ 红外OK键:确认选择
- 游戏内:
KEY2/ 红外左键:方块左移KEY0/ 红外右键:方块右移KEY_UP/ 红外上键:方块旋转KEY1/ 红外OK键:暂停/继续- 暂停时
KEY2:返回主菜单
- 方向键: 上/下/左/右
- OK键: 确认/暂停
- 数字键: 0-9(部分功能可用)
- 特殊键: * 和 # 键
stm32_Tetris/
├── User/ # 用户代码
│ ├── main.c # 主程序入口,包含所有应用逻辑和系统框架
│ ├── stm32f10x_conf.h # STM32 外设配置
│ └── stm32f10x_it.c # 中断服务程序
├── APP/ # 应用层驱动
│ ├── tftlcd/ # TFT LCD 驱动
│ ├── key/ # 按键驱动(含红外)
│ ├── esp8266/ # WiFi 模块驱动
│ ├── mpu6050/ # MPU6050 传感器驱动
│ ├── rtc/ # RTC 实时时钟驱动
│ ├── sd_sdio/ # SD 卡 SDIO 驱动
│ ├── flash/ # Flash 存储驱动
│ ├── spi/ # SPI 驱动
│ └── led/ # LED 驱动
├── Public/ # 公共模块
│ ├── system.c/h # 系统初始化
│ ├── SysTick.c/h # 系统节拍
│ └── usart.c/h # 串口通信
├── Font/ # 字库模块
│ ├── font_show.c/h # 字库显示
│ └── font_update.c/h # 字库更新
├── Picture/ # 图片处理库
│ ├── piclib.c/h # 图片库接口
│ ├── bmp.c/h # BMP 格式支持
│ ├── gif.c/h # GIF 格式支持
│ └── tjpgd.c/h # JPG 格式支持
├── Fatfs/ # FatFS 文件系统
│ ├── src/ # FatFS 源码
│ └── fatfs_app/ # FatFS 应用层
├── Malloc/ # 内存管理
│ └── malloc.c/h # 动态内存分配
└── Libraries/ # STM32 标准库
├── CMSIS/ # CMSIS 核心文件
└── STM32F10x_StdPeriph_Driver/ # STM32 标准外设库
- 主入口:
User/main.c:6132-main() - 手机桌面:
User/main.c:305-Phone_Desktop() - 俄罗斯方块菜单:
User/main.c:160-Tetris_Menu() - 游戏主循环:
User/main.c:4144-Game_Start() - 设置菜单:
User/main.c-Settings_Menu() - 文件管理器:
User/main.c-File_Manager() - 相册:
User/main.c-Photo_Album() - 姿态显示:
User/main.c-Attitude_Display()
- 位置:
User/main.c游戏绘制相关函数 - 功能:仅更新变化的区域,避免全屏刷新导致的闪烁
- 实现:比较当前状态与上一状态,只重绘差异部分
- 位置:
User/main.c:361附近 - 功能:分数更新时只刷新数字区域,避免覆盖其他内容
- 实现:使用右对齐绘制,清除区域限制在左栏范围内
- 位置:
User/main.c:164附近 - 功能:使用轻量伪随机数生成器生成方块序列
- 实现:线性同余生成器(LCG)
- 位置:
User/main.c:119-Update_WiFi_Cache() - 功能:缓存 WiFi 状态,避免频繁查询 ESP8266
- 实现:状态变化时更新缓存,界面显示使用缓存值
- 位置:
User/main.c:60-RTC_GetTime_Milliseconds() - 功能:从 RTC 获取时间,支持毫秒级精度
- 实现:RTC 秒级计数 + SysTick 毫秒计数组合
- 下落速度:
Game_Start()内的speed_tick(数值越小下落越快,默认 30) - 游戏区域: 10×20 网格(可在代码中修改)
- 方块颜色:
piece_colors[]数组定义 7 种方块颜色
- 左栏宽度: 通过
left_w = sw/3自动计算(屏幕宽度的 1/3) - 状态栏高度:
statusbar_h = 30像素 - 图标大小: 桌面图标 80×80 像素
- 串口波特率:
USART1_Init(115200) - 系统时钟:
SysTick_Init(72)- 72MHz - WiFi 默认状态:
wifi_enabled = 0(默认关闭)
- 数字越界或不可见: 确保分数使用左栏的右对齐绘制,且清除区域在左栏范围内
- 闪烁: 已使用最小差异更新与不透明数字绘制;若仍存在,可降低
delay_ms或为方块添加边框 - 屏幕分辨率不匹配: 检查
tftlcd_data.width和tftlcd_data.height是否正确初始化
- WiFi 无法连接: 检查 ESP8266 模块连接和配置,确认 SSID 和密码正确
- SD 卡无法识别: 检查 SD 卡格式(建议 FAT32),确认 SDIO 接口连接正确
- 红外遥控无响应: 检查红外接收器连接(PB9),确认中断配置正确
- 找不到头文件: 检查 Keil 工程中的 Include Paths 配置
- 链接错误: 确认所有必要的库文件已添加到工程中
系统支持开发者模式,可通过设置菜单开启。开发者模式下可以:
- 控制各模块的调试输出(WiFi、RTC、IR)
- 查看系统运行状态
- 调试功能模块
- WiFi 模块:
WIFI_PRINTF()宏控制 - RTC 模块:
RTC_PRINTF()宏控制 - IR 模块:
IR_PRINTF()宏控制 - 通用调试:
DEV_PRINTF()宏控制
- 硬件平台: STM32F103ZE
- 开发环境: Keil MDK-ARM
- 标准库版本: STM32F10x_StdPeriph_Driver
- 文件系统: FatFS R0.14
本项目为课程设计项目,仅供学习使用。
AidenDJ233
注意: 本项目是一个完整的多功能嵌入式系统,集成了游戏、文件管理、图像处理、网络通信、传感器应用等多个功能模块,代码量较大。建议在修改代码前先理解整体架构,避免影响其他模块的正常工作。