# CIMC
**Repository Path**: green3002/CIMC
## Basic Information
- **Project Name**: CIMC
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-10
- **Last Updated**: 2026-06-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[中文](README.md) | [English](README_EN.md)
# 2025 西门子杯工业嵌入式系统开发作品 README
本项目为 2025 年“西门子杯”中国智能制造挑战赛工业嵌入式系统开发方向(西门子杯工业嵌入式开发方向)参赛作品,队伍编号 `2025244579`。作品获得省一等奖,并取得国赛资格;当前仓库保留了比赛工程、方案设计文档及核心源码。整体底层编写风格参考了西风蓝桥杯嵌入式开发常用逻辑,功能设计与系统说明结合了《附件2 方案设计.pdf》中的目标方案与实际代码实现,“备用框架”为按照蓝桥杯嵌入式开发大模板写的西门子开发大模板,可供快速搭建项目时的参考。
## 1. 项目简介
本系统基于 `GD32F470VET6` 微控制器,完成一个面向工业场景的电压采集、显示、告警、存储与串口交互系统。系统通过 ADC 获取电压数据,结合 RTC 时间戳进行周期采样,并将结果按类别写入 TF 卡;同时支持串口参数配置、外部 Flash 参数持久化、OLED 状态显示、LED 告警提示及简单的数据隐藏编码。
从代码结构和功能落地来看,这是一个典型的“驱动层 + 应用层 + 轮询调度器”式嵌入式比赛工程,强调:
- 上电即可运行的完整闭环
- 串口与按键双通道人机交互
- 基于 TF 卡的分目录日志存储
- 参数可配、结果可查、状态可见
## 2. 作品定位
- 比赛方向:工业嵌入式系统开发
- 成果级别:省一等奖作品
- 工程特点:赛题导向明显,功能闭环完整,便于答辩展示与现场调试
- 技术路线:GD32 标准外设库 + Keil 工程 + 协作式调度器 + 模块化 APP 逻辑
## 3. 系统核心功能
结合源码与方案设计,本项目主要实现了以下功能:
1. 系统初始化与自检
- 初始化 LED、按键、串口、SPI Flash、RTC、ADC、OLED、TF 卡
- 支持串口输入 `test` 执行系统自检
- 自检内容包括 Flash ID、TF 卡状态、RTC 当前时间等
2. RTC 实时时钟管理
- 上电自动初始化 RTC
- 支持串口配置时间
- 支持串口查询当前时间
3. 配置参数管理
- 从 TF 卡根目录读取 `config.ini`
- 解析 `Ratio` 与 `Limit` 参数
- 支持串口动态修改变比和阈值
- 支持将参数写入 SPI Flash,并在后续重新读取
4. 周期采样控制
- 采样周期支持 `5s / 10s / 15s`
- 支持串口 `start / stop` 启停采样
- 支持按键切换采样状态和周期
5. 超限检测与提示
- 实时比较采样值与阈值
- 超限时串口打印告警信息
- LED2 用于反映超限状态
6. OLED 状态显示
- 空闲状态显示 `system idle`
- 运行状态显示当前时间与电压值
- 部分模式下显示串口数据或 Flash 数据
7. 数据存储与分类管理
- 普通采样数据写入 `sample/`
- 超限数据写入 `overLimit/`
- 系统日志写入 `log/`
- 隐藏编码数据写入 `hideData/`
- 每 10 条采样或告警数据新建一个文件
8. 数据隐藏编码
- 通过 `hide` 进入隐藏输出模式
- 将时间戳和电压值编码成十六进制字符串
- 通过 `unhide` 退出隐藏模式
## 4. 硬件平台
项目基于 `GD32F470VET6` 开发,实际使用到的外设包括:
- `USART0`:串口通信,波特率 `115200`
- `ADC0`:电压采样输入
- `RTC`:系统时间基准
- `SPI1`:外部 SPI Flash 通信
- `SDIO + FATFS`:TF 卡文件系统访问
- `GPIOA`:LED 控制
- `GPIOE`:按键输入
- `OLED`:状态显示
从引脚代码可见,当前工程中主要用到:
- LED:`PA4 ~ PA7`
- 按键:`PE7 ~ PE10`
- 串口:`PA9 / PA10`
- ADC:`PC0`
- SPI Flash:`PB12 ~ PB15`
## 5. 软件架构
项目目录位于 `project/project`,整体结构如下:
```text
project/project
├─ APP/ 应用层功能模块
├─ User/ 主函数、中断、滴答定时
├─ fatfs/ TF 卡文件系统
├─ Library/ GD32 标准外设库
├─ CMSIS/ 内核与芯片支持文件
├─ Startup/ 启动文件
└─ project/ Keil 工程文件
```
### 5.1 主要源码模块说明
- `User/main.c`
- 入口文件
- 仅保留 `system_init()`、`scheduler_init()`、`scheduler_run()` 三段主流程
- `APP/system_init.c`
- 负责系统外设初始化
- 启动时读取设备 ID,初始化 TF 卡并写入系统日志
- `APP/scheduler.c`
- 协作式定时调度器
- 按固定周期轮询执行任务
- `APP/adc_app.c`
- ADC 初始化与采样换算
- 根据采样周期输出 5s、10s、15s 三类采样任务
- `APP/uart_app.c`
- 串口初始化、接收中断、命令解析
- 是本项目最核心的人机交互入口
- `APP/str_app.c`
- 参数处理、自检、配置读写、隐藏编码等逻辑集中在这里
- `APP/sdcard_app.c`
- TF 卡挂载、目录创建、日志文件管理
- 负责 `sample / overLimit / log / hideData` 四类数据落盘
- `APP/rtc_app.c`
- RTC 初始化、时间设置与时间读取
- `APP/oled_app.c`
- OLED 页面逻辑显示
- `APP/key_app.c`
- 按键扫描与采样控制
- `APP/led_app.c`
- LED 运行状态与超限状态提示
## 6. 调度器设计
本项目没有使用 RTOS,而是采用了比赛中很常见的轻量级协作式调度器。任务表定义如下:
```c
{led_proc,50,0},
{key_proc,50,0},
{oled_proc,100,0},
{adc_proc,100,0},
{rtc_show_time,1000,0},
{uart_proc,200,0},
{led_flash,500,0},
{print_adc_5s,500,0},
{print_adc_10s,10000,0},
{print_adc_15s,15000,0}
```
说明:
- `led_proc` / `key_proc`:基础输入输出扫描
- `oled_proc`:OLED 界面刷新
- `adc_proc`:ADC 数据更新
- `rtc_show_time`:更新时间缓存
- `uart_proc`:串口命令处理
- `led_flash`:运行态闪烁提示
- `print_adc_xxs`:按当前采样周期执行采样输出与存储
需要注意的是,当前源码中 `print_adc_5s` 在调度表里的周期写成了 `500ms`,而不是 `5000ms`。从按键逻辑、串口提示和方案设计来看,设计意图显然是 `5s` 周期,这一点在后续维护中应特别注意。
## 7. 系统状态与交互逻辑
### 7.1 采样状态
- `sp.led_flash == 0`
- 系统空闲
- OLED 显示 `system idle`
- LED1 熄灭
- `sp.led_flash == 1`
- 系统进入周期采样状态
- OLED 显示当前时间和电压
- LED1 闪烁
### 7.2 按键逻辑
- `KEY1`:启动/停止周期采样
- `KEY2`:设置采样周期为 `5s`
- `KEY3`:设置采样周期为 `10s`
- `KEY4`:设置采样周期为 `15s`
### 7.3 LED 逻辑
- `LED1`:采样运行状态闪烁指示
- `LED2`:采样值超过阈值时点亮
## 8. 串口命令说明
串口参数:
- 波特率:`115200`
- 数据位:`8`
- 停止位:`1`
- 校验位:`None`
### 8.1 已实现命令
| 命令 | 功能 |
|---|---|
| `test` | 系统自检 |
| `RTC Config` | 进入时间设置模式 |
| `2025-06-xx xx:xx:xx` | 在时间设置模式下写入 RTC |
| `RTC now` | 查询当前时间 |
| `conf` | 读取 TF 卡 `config.ini` 中的 Ratio/Limit |
| `ratio` | 显示当前变比并进入变比设置状态 |
| `limit` | 显示当前阈值并进入阈值设置状态 |
| `浮点数` | 在 ratio/limit 设置状态下写入参数 |
| `config save` | 将参数保存到 SPI Flash |
| `config read` | 从 SPI Flash 读取参数 |
| `start` | 启动周期采样 |
| `stop` | 停止周期采样 |
| `hide` | 进入隐藏编码输出模式 |
| `unhide` | 退出隐藏编码输出模式 |
### 8.2 典型操作流程
1. 上电启动
2. 串口发送 `conf` 读取 TF 卡配置
3. 必要时通过 `ratio`、`limit` 修改参数
4. 使用 `config save` 保存到 Flash
5. 发送 `start` 开始采样
6. 根据需要发送 `hide` 查看隐藏编码输出
7. 发送 `stop` 结束采样
## 9. 配置文件格式
TF 卡根目录下放置 `config.ini`,格式如下:
```ini
[Ratio]
Ch0 = 33.0
[Limit]
Ch0 = 30.0
```
程序通过 `show_conf()` 解析该文件,并将:
- `Ratio` 读入 `sp.ratio_data`
- `Limit` 读入 `sp.limit_data`
如果文件不存在,串口会返回:
```text
config.ini file not found.
```
## 10. Flash 参数存储
项目使用外部 SPI Flash 保存关键参数,当前代码实际写入内容包括:
- 地址 `0 ~ 29`:设备 ID 字符串
`Device_ID:2025-CIMC-2025244579`
- 地址 `30 ~ 33`:`ratio`
- 地址 `34 ~ 37`:`limit`
同时,`sdcard_app.c` 中还使用地址 `0x2000` 保存日志自增 ID,用于生成上电日志文件名。
## 11. TF 卡目录结构
系统初始化 TF 卡后,会自动创建以下目录:
```text
TF Root
├─ sample/
├─ overLimit/
├─ log/
└─ hideData/
```
各目录用途如下:
- `sample/`
- 保存正常采样数据
- 每 10 条数据写入一个文件
- `overLimit/`
- 保存超阈值数据
- 每 10 条数据写入一个文件
- `log/`
- 保存系统操作日志
- 文件名形如 `log0.txt`、`log1.txt`
- `hideData/`
- 保存隐藏编码模式下的数据
## 12. 数据格式说明
### 12.1 普通采样数据
普通采样数据格式类似:
```text
2025-06-19 15-30-00 12.3V
```
串口输出中还会带通道描述,例如:
```text
2025-06-19 15-30-00 ch0=12.3V
```
### 12.2 超限数据
当 `adc_vlot > limit_data` 时,系统会输出并存储超限信息,例如:
```text
2025-06-19 15-30-00 ch0=12.3V OverLimit(10.0)!
```
### 12.3 隐藏编码数据
当 `encrypt_flag == 1` 时,调用 `hide_to_unix()`:
- 先将 RTC 时间转换为 Unix 时间戳
- 再将电压整数与小数部分编码为十六进制
- 最终输出组合后的隐藏字符串
这部分不是标准加密算法,更接近比赛场景下的“编码隐藏”实现。
## 13. OLED 显示逻辑
当前 OLED 页面逻辑主要有以下几种:
- 模式 0:`system idle`
- 模式 1:显示当前时间 + 当前电压
- 模式 2:显示串口接收内容
- 模式 3:显示 Flash 数据
实际运行中,代码会根据 `sp.led_flash` 在空闲态和采样态之间切换显示。
## 14. 代码实现特点
### 14.1 优点
- 模块划分清晰,适合比赛答辩展示
- 外设覆盖完整,能体现工业嵌入式综合能力
- 支持串口、按键、OLED、LED、Flash、TF 卡等多模块联动
- 有完整的数据落盘逻辑,适合赛题验收
### 14.2 现有实现中的注意点
1. 方案设计中提到的部分高级内容,如 DMA、外部中断去抖、AES 加密、低功耗 STOP 模式等,在当前仓库源码中并未完整落地,README 以“实际代码”为主进行说明。
2. `RTC Config` 的实际解析逻辑为“两步式”:先发 `RTC Config`,再发送具体时间字符串。
3. 代码里对时间字符串的判断写死了 `2025-06` 这一前缀,更适合作为比赛演示版本。
4. `print_adc_5s()` 的调度周期目前是 `500ms`,与命名和设计目标不一致。
5. `oled_app.c` 中用于显示的缓冲区 `data` 定义较小,后续若继续扩展显示内容,建议调整缓存长度。
## 15. 开发与编译说明
工程文件位于:
```text
project/project/project/cimc_project.uvprojx
```
推荐环境:
- `Keil MDK`
- GD32F4xx 标准外设库
基本流程:
1. 用 Keil 打开 `cimc_project.uvprojx`
2. 检查目标芯片、下载器和时钟配置
3. 编译整个工程
4. 下载到开发板
5. 通过串口助手观察运行结果
## 16. 适合作为答辩材料的亮点总结
- 以 `GD32F470VET6` 为核心完成完整工业嵌入式采集系统
- 实现“采样 - 判断 - 显示 - 存储 - 参数配置 - 持久化”闭环
- 使用 TF 卡进行分类型数据归档,便于现场演示与后期分析
- 使用外部 Flash 保存关键参数和日志编号,具备掉电保持能力
- 软件结构清晰,便于继续扩展为更完整的工业现场设备原型
## 17. 仓库附带资料
当前目录中还保留了比赛相关资料,可配合本 README 一起阅读:
- `附件2 方案设计.pdf`
- `2025244579-dsn-武汉纺织大学.pdf`
- `project/project/` 工程源码
其中:
- 方案设计文档更适合看“作品目标、答辩逻辑、系统设计思路”
- 工程源码更适合看“当前真正跑在板子上的实现细节”
## 18. 致谢与说明
这是一个很典型、也很完整的竞赛型工业嵌入式项目。它既保留了比赛作品该有的功能密度,也能看出作者在底层驱动、模块拆分和现场展示逻辑上的训练痕迹。对后续继续完善该作品,建议优先处理以下几项:
1. 修正 5 秒采样任务周期
2. 放宽 RTC 时间输入格式限制
3. 将 `config.ini`、Flash 参数、OLED 显示逻辑进一步统一
4. 若继续参赛或做毕设,可补充真正的加密算法、异常恢复和低功耗设计
---
如将本项目继续整理为展示型仓库,本 README 已可作为第一版完整项目说明文档使用。