# ecg **Repository Path**: YIJia_Kitchen_Bath/ecg ## Basic Information - **Project Name**: ecg - **Description**: nordic+max sensor - **Primary Language**: C - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-01 - **Last Updated**: 2026-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ECG 数据采集与存储系统 基于 Zephyr RTOS 的嵌入式系统,实现 ECG(心电图)数据的实时采集、NAND Flash 存储及蓝牙 (BLE) 文件传输。 ## 安装软件 ![alt text](Screenshot_20260603-164555.png) ## 硬件系统 ![alt text](datasheet/SMT2606253708_T.png) ## 更新记录 | 版本号 | 更新内容 | 编写者 | 日期 | |--------|----------|--------|------| | 1.0.5 | 修复 `nand_fs.file->offset` int 溢出问题,改为 uint32_t | — | 2026-07-03 | | 1.0.6 | 更新长时间连续record 停机bug| 邓维安 | 2026-07-07 | App Link: ## 1. 项目概述 本项目集成完整的 ECG 数据处理链路: - **ECG 采集**:通过 SPI 接口驱动 MAX30003 生物电势传感器,以 128Hz 采样率获取高精度心电信号。 - **NAND 文件系统**:基于 Dhara 磨损均衡库实现的轻量级文件系统 (`nand_fs`),针对 W25N04KV NAND Flash 优化,支持最多 16 个文件,单文件最大 128 MB。 - **时间管理**:RTC 实时时钟为数据文件和系统事件提供精确时间戳。 - **蓝牙传输**:BLE Nordic UART Service (NUS) 实时传输文件列表、大小及时间信息至上位机。 ## 2. 核心功能 ### 2.1 录制状态机 | 状态 | 说明 | |------|------| | `IDLE` | 空闲,等待指令 | | `REAL` | 创建新文件,准备录制 | | `AUTO` | 自动录制中,每 4 小时自动分段 | | `STOP` | 停止录制,关闭文件 | - 自动录制时长:`AUTO_RECORD_TIME = 14400` 秒(4 小时),超时自动关闭当前文件并创建新文件。 ### 2.2 NAND 文件系统 (`nand_fs`) | 特性 | 值 | |------|-----| | 最大文件数 | 16 | | 文件名长度 | 31 字符 | | 单文件最大页数 | 65536 (256×256) | | 单页数据大小 | 2048 字节 | | 单文件最大容量 | 128 MB(65536 × 2048) | | 魔数 | 0x4E46 ('NF') | 支持操作:`open`、`read`、`write`、`close`、`unlink`、`list`、`stat`、`format`。 底层依赖 [Dhara](https://github.com/dharrigan/dhara) 库提供 NAND 磨损均衡和坏块管理。 ### 2.3 数据流 ``` MAX30003 (SPI2) → ecg_task (128Hz采样) → 消息队列 → save_ecg_task → nand_fs_write → W25N04KV (SPI3) → BLE NUS → 上位机 App ``` - 每个数据包:2048 个 int 采样点 × 4 字节 = 8192 字节 - 文件以 UTC 时间戳命名(格式:`.txt`) ### 2.4 BLE 通信 - 服务:Nordic UART Service (NUS) - 设备名:`ECG_NORDIC`(支持动态修改) - 支持 `file_list` 指令查询存储文件详情(名称、大小、创建/关闭时间、录制时长) - 连接间隔:80ms,最大数据长度:251 字节 ## 3. 硬件架构 ### 主控与接口 - **SoC**:Nordic nRF52840 - **存储**:W25N04KV NAND Flash (512 Mbit / 64 MB, SPI) - **传感器**:MAX30003 ECG AFE (SPI) - **调试**:SEGGER RTT Console ### 引脚分配 | 外设 | 信号 | GPIO | |------|------|------| | **SPI3 (NAND Flash)** | SCK | P0.21 | | | MISO | P0.22 | | | MOSI | P0.19 | | | CS | P0.20 | | **SPI2 (MAX30003)** | SCK | P1.04 | | | MISO | P1.05 | | | MOSI | P1.06 | | | CS | P1.07 | | **RGB LED** | RED | P0.14 (Active Low) | | | GREEN | P0.15 (Active Low) | | | BLUE (PWM0) | P0.23 | ## 4. 软件架构 ```text src/ ├── main.c # 主入口:初始化、状态机、主循环 ├── ble_nus.c/h # BLE NUS 服务:数据收发、协议解析、状态管理 ├── ecg_task.c/h # ECG 采集任务:MAX30003 采样、链表缓冲 ├── save_ecg_task.c/h # ECG 存储任务:NAND 写入、数据校验 ├── file_task.c/h # 文件读取任务:NAND 读取并通过 BLE 发送 ├── nand_fs.c/h # 自定义 NAND 文件系统(基于 Dhara) ├── w25n04.c/h # W25N04KV NAND Flash 底层驱动 ├── real_time.c/h # RTC 时间管理 ├── real_time_task.c/h # RTC 时间同步任务 ├── protocentral_max30003.c/h # MAX30003 传感器驱动 ├── max_spi.c/h # SPI 传输抽象层 ├── max_pwm.c/h # PWM/LED 控制 ├── customer_gpio.c/h # GPIO 管理(CS 片选等) ├── alloc.c/h # 动态内存分配工具 ├── dhara/ # Dhara NAND 磨损均衡库 │ ├── map.c/h # 逻辑-物理地址映射 │ ├── journal.c/h # 崩溃恢复日志 │ ├── nand.c/h # NAND 抽象接口 │ └── error.h # 错误码定义 └── demo_data/ # 演示/测试数据 board/ ├── app.overlay # 主设备树(SPI3 NAND Flash) ├── max30003.overlay # MAX30003 SPI2 配置 ├── customer_gpio.overlay # GPIO 定义(CS、LED) ├── pwm.overlay # PWM LED 配置 └── real_time.overlay # RTC 模拟器配置 ``` ## 5. 关键配置 ### prj.conf 主要项 | 配置项 | 说明 | |--------|------| | `CONFIG_USE_SEGGER_RTT=y` | 使用 RTT 控制台输出 | | `CONFIG_BT_PERIPHERAL=y` | BLE 外设模式 | | `CONFIG_BT_ZEPHYR_NUS=y` | Nordic UART Service | | `CONFIG_BT_DEVICE_NAME="ECG_NORDIC"` | 蓝牙设备名 | | `CONFIG_RTC=y` / `CONFIG_RTC_EMUL=y` | 模拟 RTC | | `CONFIG_NEWLIB_LIBC=y` | 使用 newlib C 库 | | `CONFIG_CBPRINTF_FP_SUPPORT=y` | 浮点数打印支持 | | `CONFIG_TIMING_FUNCTIONS=y` | 性能计时 | | `CONFIG_HEAP_MEM_POOL_SIZE=8192` | 堆内存 8KB | ### ble_nus.h 常量 | 常量 | 值 | 说明 | |------|-----|------| | `ECG_BUFFER_SIZE` | 61 | 单次传输 ECG 采样点数 | | `ECG_FILE_SIZE` | 2048 | 单次写入采样点数 | | `AUTO_RECORD_TIME` | 14400 秒 | 自动分段间隔(4 小时) | | `VERSION_P` | 110 | 协议版本 | ## 6. 编译与烧录 ### 依赖 - [nRF Connect SDK (NCS)](https://www.nordicsemi.com/Products/Development-software/nrf-connect-sdk) v2.5+ - Zephyr SDK ### 编译 ```bash west build -b nrf52840dk_nrf52840 ``` ### 烧录 ```bash west flash ``` ## 7. 使用说明 - **启动录制**:上位机通过 BLE 发送 `REAL` 指令,系统创建以时间戳命名的新文件并开始采集 ECG 数据。 - **自动分段**:录制每满 4 小时自动关闭当前文件并创建新文件,防止单文件过大。 - **停止录制**:发送 `STOP` 指令,关闭文件并保存元数据。 - **文件列表**:发送 `file_list` 指令,系统返回所有存储文件的名称、大小、创建/关闭时间和录制时长。 - **日志输出**:通过 SEGGER RTT Viewer 查看系统初始化、文件操作及运行状态日志。 ## 8. 已知限制与注意事项 | 项 | 说明 | |----|------| | 单文件最大 | 128 MB(受 `NAND_FS_MAX_PAGES_PER_FILE` 限制) | | 总文件数 | 最多 16 个 | | NAND 总容量 | 64 MB(W25N04KV) | | RTC | 当前使用模拟 RTC,上电需通过 BLE 同步时间 | | 电源安全 | `nand_fs_write` 每次写操作后立即 `save_metadata`,确保异常断电数据可恢复 | ## 9. 许可 SPDX-License-Identifier: Apache-2.0