# 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 已可作为第一版完整项目说明文档使用。