2026 ADI CodeFusion 竞赛 - 基于MAX32655FTHR实现心率和温度监测系统
该项目使用了CodeFusion Studio (Zephyr RTOS 4.3.0 与设备树),C 语言,实现了MAX32655FTHR 的可穿戴多参数生理监测系统的设计,它的主要功能为:用 MAX30102 采集 PPG 实时计算心率、DS18B20 测体温、光敏模块判断遮是否佩戴,在 128×64 OLED 上本地显示心率和温度,并把原始波形写入TF卡,心率越界时蜂鸣器报警。
标签
嵌入式系统
显示
开发板
TECOr
更新2026-09-28
湖南工业大学科技学院
64

1 项目摘要

基于 ADI 公司的 MAX32655FTHR 开发板,设计了一套心率和温度监测。系统包含硬件——MAX32655FTHR 开发板,以及MAX30102 光电容积脉搏波模块、 数字温度传感器、光敏电阻模块、本地显示与存储:OLED、microSD 卡、板载 16MB QSPI Flash;和软件——C 语言编写,运行于 Zephyr RTOS 4.3.0,按 App / Com / Driver / Sys 四层解耦、10 个并发线程、CodeFusion Studio 工程与设备树板级配置。

该系统以 25Hz 采样光电容积脉搏波并实时算出心率、用单总线 DS18B20 测体温、用光敏模块的数字电平判断遮光状态(手指按上 且 环境无光两个条件同时满足才开测),数据在 0.96 寸 OLED 上本地显示;同时把未经任何处理的原始 PPG 波形逐样本打时间戳写入 microSD 卡,可通过串口文件协议取回电脑、用同一份算法源码复算对照,形成一个可自证的数据闭环;心率越界(> 120 或 < 50 bpm)时蜂鸣器报警。

系统实时性好(心率 2~5 秒收敛,显示稳态每帧仅向面板下发约 190 字节)、数据可信(原始波形与离线复算双向印证,误差 ≤ 15%)。


2 所选任务

所选任务:自命题。

题目为「基于 MAX32655FTHR 的可穿戴多参数生理监测系统」。选题动机很直接:MAX32655FTHR 是一块面向可穿戴与医疗传感的超低功耗开发板(Cortex-M4F 120MHz + RISC-V 协处理器、片上 512KB Flash / 128KB SRAM、板载 DAPLink),正好适合做一颗"能同时采生理信号、能本地显示、还能把原始数据留下来做算法验证"的小型监视终端。


3 设计方案框图与软件流程图

image.png

image.png


1a360f4b8b8c344de78591dfd9c0bfc3.png

左侧主流程:上电初始化 → 创建 6 个后台线程 → 待机 → 遮光成立才启动测量 → 越界报警 → 循环等待;右侧为三条并发线程(心率采集 / 体温采集 / 显示刷新)的独立循环。

3.1 硬件部分

硬件包括两个部分:MAX32655FTHR 开发板(核心),以及一组通过排针与杜邦线互连的传感 / 显示 / 存储模块。

3.1.1 MAX32655FTHR 开发板

MAX32655FTHR 是 ADI 公司面向可穿戴与医疗传感应用的低功耗开发板,其核心是一颗 Arm Cortex-M4F @100MHz,支持硬件浮点运算,可运行轻量图形与信号处理程序;片上集成 512KB Flash / 128KB SRAM,以及 ADC(10bit)、I²C、SPI、UART、I²S、独立看门狗、TRNG 等外设。板载 DAPLink 提供 SWD 调试与虚拟串口(COM3),是整个开发过程唯一也是最重要的观测通道;Feather 兼容排针则便于与常见模块对接。

选它的理由有三:一是超低功耗,适合可穿戴;二是 Feather 封装引出脚多、与市售模块对接方便;三是 ADI 提供了完整的 CodeFusion Studio + Zephyr 工具链。

3.1.2 生理与环境传感模块

•• MAX30102 心率/血氧传感器模块:集成红光(660nm)与红外(880nm)双 LED、光电二极管、18bit ADC 与 32 深度 FIFO,I²C 从地址 0x57,中断输出接 MCU 的 P1.8。本项目以 100Hz 采样率、4 倍平均、Red + IR 双通道模式采集 PPG 原始波形,故 FIFO 的有效输出率为 100/4 = 25Hz。注意:MAX30102 没有片上算法,它输出的只是反射光强度,心率必须由 MCU 或上位机自行计算。

•• DS18B20 数字温度传感器:单总线(1-Wire)接口,DQ 接 P1.6,测量范围 -55~+125℃,12bit 分辨率下转换时间约 750ms。采用外部 4.7kΩ 上拉到 3.3V 的伪开漏接法。

•• 光敏电阻模块:模块板载 LM393 比较器,同时提供 AO(模拟)与 DO(数字)两个输出。本项目最终采用 DO 数字输出接 P2.0,MCU 侧按 GPIO 输入读取"有光 / 无光"二值:翻转阈值由模块上的电位器硬件设定,软件不做任何 A/D 换算。这样选择的原因有二:① 本项目的用途不是测光照度,而是判断"当前是否处于遮光环境"(遮光能显著降低环境光对 PPG 的干扰),二值量足够且更稳;② 去掉 ADC 通路后省下一个片内外设(实测省 5.7KB Flash),也避免了模块分压电压与 ADC 内部参考(1.2V)不匹配带来的满量程饱和问题。

image.png

3.1.3 显示与声光

•• OLED 128×64(I²C 0x3C):单色 1bpp,页式显存 1024 字节。

•• 有源蜂鸣器模块(低电平触发):上电短鸣 0.2s 自检;测量过程中心率越界(> 120 或 < 50 bpm)则持续鸣叫,条件解除即停。

•• 板载三色 LED(RGB,P0.18 / P0.19 / P0.26):用于运行状态指示。

3.1.4 存储模块

•• 外接 microSD 卡:走 SPI1,初始化阶段降速至 400kHz,使用 FatFs 文件系统,挂载点 /SD:,用于写入原始 PPG 数据文件。

•• 板载 W25Q128 16MB QSPI Flash:走 SPI0(片选 CS1 = P0.11,WP / HOLD 引脚开机 hog 拉高,4MHz),使用 LittleFS 文件系统,挂载点 /FLASH:,作为 SD 卡异常时的备用存储与配置存储。

3.1.5 交互与按键

•• 板载按键 SW2 = P0.2(用于"开机画面 / 心率页"手动切页)


3.2 软件部分

软件总体分为两部分:主控程序(C 语言、Zephyr RTOS 4.3.0,含驱动与通信协议)、板级配置(CodeFusion Studio 工程、设备树 overlay、Kconfig 裁剪)。

image.png

3.2.1软件分层架构(App / Com / Driver / Sys + Zephyr RTOS)

工程严格分四层,依赖方向自上而下单向:

  • App 层:应用任务层,只做业务编排,不直接碰硬件寄存器;
  • Com 层:通信协议层,ufs_core.c 实现 UFS 文件传输协议的帧解析与命令分发,ufs_uart.c 负责 uart0 收发与环形缓冲;
  • Driver 层:设备驱动层,max30102.c、oled.c、hr_algo.c、ds18b20.c、photoresistor.c、buzzer.c、led.c、sd_card.c;
  • Sys 层:系统服务层,i2c_bus.c(应用锁 + 总线自愈)、storage.c(会话文件管理)、qflash_store.c(LittleFS 封装)、console_guard.c(日志闸门)。


系统数据流可以概括为:采集任务读回 PPG 样本 → 按采样率逐样本回推时间戳 → 喂入心率算法 → 发布"是否在测量 + 当前 bpm" → 显示任务据快照绘制;同时把原始样本投进消息队列 →TF卡进行记录


3.2.2 心率测量通道


① 采集与算法。 MAX30102 的 FIFO 攒到接近半满时产生一次中断,采集任务一次读回 16 个样本(Red + IR)。算法采用 SparkFun PBA 思路的 C 移植:对 IR 采样做直流估计 + 12 阶低通 FIR 得到交流分量,用过零点与峰谷差判定一次心跳,再由心搏间期(IBI)换算 BPM 并做滑窗平均。

a96631c70c482c8dc79c3d1297db3163.jpg

心率判据的峰谷差窗口必须按实际信号幅度定(关键代码,Driver/Src/hr_algo.c):

    /* 正过零(上升沿)→ 结束一个周期,用刚过去的峰谷差判心跳 */
    if ((IR_AC_Signal_Previous < 0) && (IR_AC_Signal_Current >= 0)) {
        int16_t ac_max = IR_AC_Signal_max;
        int16_t ac_min = IR_AC_Signal_min;

        positiveEdge = 1;
        negativeEdge = 0;
        IR_AC_Signal_max = 0;

        int32_t ac_pp = (int32_t)ac_max - (int32_t)ac_min;

        last_ac_pp = ac_pp;
        if (ac_pp > BEAT_AC_MIN && ac_pp < BEAT_AC_MAX) {
            beat = true;
        }
    }

    /* 负过零(下降沿) */
    if ((IR_AC_Signal_Previous > 0) && (IR_AC_Signal_Current <= 0)) {
        positiveEdge = 0;
        negativeEdge = 1;
        IR_AC_Signal_min = 0;
    }

    if (positiveEdge && (IR_AC_Signal_Current > IR_AC_Signal_Previous)) {
        IR_AC_Signal_max = IR_AC_Signal_Current;
    }
    if (negativeEdge && (IR_AC_Signal_Current < IR_AC_Signal_Previous)) {
        IR_AC_Signal_min = IR_AC_Signal_Current;
    }

    return beat;
}


② 中断轮询兜底。 MAX30102 的 FIFO 半满中断走 P1.8,而这一根线是全场唯一"断了不影响其他任何东西"的线,在面包板原型上最容易松。原代码在等待超时后直接 continue,等于"要么有中断、要么永远读不到数据":

改成"轮询兜底"后,即使中断线松脱采集仍能持续;若哪天读回来有数据,日志本身就证明了"是线的问题而不是传感器"。

image.png

3.2.3 数据记录与文件传输

① 原始数据落盘。 采集任务把样本投进 k_msgq,记录任务消费后按会话写入 /SD:/DATA/HR_xxxxxx.bin,文件格式为 20 字节头 + 12 字节/条(ts_ms, red, ir),每满 4MB 自动轮转新建文件。文件里存的是原始 PPG 波形。

② 挂载完全异步化。 SD 卡是外接模块,插拔与接触风险高,固件把挂载放到后台:卡没插好就每 3 秒重试,绝不阻塞启动。



3.2.4 系统可靠性

本项目的可靠性设计围绕共享总线展开,共两层:

  • 应用层互斥:i2c_bus.c 提供可重入的应用级锁,保证同一时刻只有一个任务进驱动(I²C2 上同时挂着 OLED 刷屏与心率采集两个高频访问者)。
  • 监督任务兜底:低优先级 i2c2_watch 检测到"两个 I²C 任务同时静默超过 6 秒"则强制恢复总线,再 20 秒无效则冷复位。

配合独立看门狗(250ms)与各驱动的失败重试,系统在实测中出现过的总线异常都能自愈,无需人工干预。


3.2.5 开发与调试软件

工具

用途

CodeFusion Studio(ADI,含 Zephyr SDK 4.3.0)

工程管理、编译(west + ninja)、GDB 调试、设备树与 Kconfig 配置

OpenOCD(cmsis-dap + max32655.cfg)

命令行烧录:program … verify reset exit,脚本化重试

串口日志(printk)

主要观测手段,所有模块带前缀便于 grep

3.3 设计思路小结

把上面两部分的设计取舍归纳为:

思路一:三总线隔离,把"共享"降到最低。 全系统按物理总线切成三块:SPI0(QSPI Flash)、SPI1(microSD)各自独占,互不干扰;只有 I²C2 上是"多器件共享"(MAX30102 + OLED)。共享总线是故障的温床,所以设计上刻意把存储放在独立 SPI 上,避免 SD 卡读写把传感器采集拖慢。

思路二:I²C2 上必须做"应用层互斥 + 总线自愈"双保险。 I²C2 上同时挂着 OLED 刷屏任务和心率采集任务,两者都会频繁访问。实测证明:仅依赖 Zephyr 上游驱动会偶发死锁。因此在 Sys 层加了 i2c_bus.c——一把可重入的应用层互斥锁,再加一个低优先级监督任务做总线 wedge 检测与强制恢复。这是本项目最重要的可靠性设计。

思路三:采集与显示彻底解耦。 心率采集任务拿到样本后不是直接去更新屏幕,而是把样本投进消息队列 k_msgq,由显示任务和记录任务各自消费。这样即使屏幕刷新慢、SD 卡写卡顿,也不会阻塞采集——保证生理信号不丢样。



4 项目展示

CodeFusion Studio 软件截图

image.png

image.png


系统运行画面

image.pngimage.png


串口运行日志截图

image.png



END 致谢

感谢硬禾学堂提供的这次平台和机会,以及对参赛选手的答疑与支持!通过这次比赛,我不仅把一颗低功耗可穿戴 MCU 从"点亮"做到了"闭环可验证",也第一次完整体会到从一个模糊的现象("心率偏低")一路做到"用实验定案、用补丁根治"的工程过程。我学到了很多新知识,也亲自体验到了边缘计算与低功耗生理传感结合的价值。谢谢大家!

附件下载
MAX32655FTHR_生理监测系统_源代码.zip
团队介绍
湖南工业大学科技学院学生
团队成员
TECOr
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号