嵌入式单片机 CI/CD 实战:从 STM32F103 工业温度计开始

📅 2026-04-16 👤 Elaine 👁️ 14 次阅读 ⏱️ 3 分钟阅读 ❤️ 0

📖 嵌入式单片机 CI/CD 实战:从 STM32F103 工业温度计开始

    <div class="meta">作者:Leonard(QA测试工程师)| 日期:2026-04-16 | 目标读者:嵌入式开发工程师、Team Leader、想提升研发效率的团队</div>

    <hr>

    <h2>一、项目背景:工业温度计需求</h2>

    <h3>硬件规格</h3>
    <ul>
        <li><strong>主控芯片</strong>:STM32F103C8T6(ARM Cortex-M3)</li>
        <li><strong>温度传感器</strong>:DS18B20(-55°C ~ +125°C,精度±0.5°C)</li>
        <li><strong>显示</strong>:0.96寸 OLED(I2C接口)</li>
        <li><strong>通信</strong>:USART1(调试信息输出)</li>
        <li><strong>供电</strong>:12V DC → 5V → 3.3V</li>
    </ul>

    <h3>功能需求</h3>
    <ol>
        <li>采集 DS18B20 温度,每秒刷新一次</li>
        <li>OLED 实时显示温度值(保留1位小数)</li>
        <li>温度超过阈值时,LED 报警</li>
        <li>USART 输出温度日志</li>
        <li>按键可设置报警阈值(上下限)</li>
    </ol>

    <h3>代码仓库结构</h3>
    <pre><code>stm32-thermometer/

├── Core/ # HAL库核心文件(STM32CubeMX生成)
├── Drivers/ # 外设驱动(含 DS18B20)
├── App/ # 应用层代码
├── Tests/ # 单元测试(PC端,含 Unity 框架)
├── Makefile
└── .github/workflows/ci.yml

    <hr>

    <h2>二、整体架构:CI/CD 流水线</h2>

    <table>
        <tr><th>阶段</th><th>工具</th><th>做什么</th></tr>
        <tr><td>编译构建</td><td>ARM GCC + Makefile</td><td>交叉编译,生成 .hex / .bin</td></tr>
        <tr><td>单元测试</td><td>Unity (PC端)</td><td>测试纯C逻辑函数,不依赖硬件</td></tr>
        <tr><td>集成测试</td><td>Python + 串口</td><td>自动化测试目标板功能</td></tr>
        <tr><td>固件上传</td><td>stm32flash / OpenOCD</td><td>自动烧录(可选)</td></tr>
        <tr><td>测试报告</td><td>CTest + JUnit XML</td><td>生成可视化报告</td></tr>
    </table>

    <hr>

    <h2>三、环境准备:工具链安装(Ubuntu)</h2>

    <pre><code>sudo apt-get update

sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi stm32flash openocd git
sudo apt-get install -y python3 python3-pip
pip3 install pyserial pytest pytest-html Jinja2

    <hr>

    <h2>四、核心代码实现</h2>

    <h3>DS18B20 驱动(drivers/ds18b20.c)</h3>
    <p>DS18B20 单总线驱动,通过 PA8 采集温度数据,12位分辨率,返回温度值×10(例如 250 = 25.0°C)。</p>

    <h3>温度采集(app/temperature.c)</h3>
    <ul>
        <li>滑动平均滤波(窗口=5)</li>
        <li>传感器状态检测(DS18B20 未连接返回 85°C)</li>
        <li>日志输出格式:<code>[TEMP]  25.0C, status=0</code></li>
    </ul>

    <h3>报警模块(app/alarm.c)</h3>
    <p>温度超限时触发 LED 和蜂鸣器,支持上下限阈值设置。</p>

    <hr>

    <h2>五、单元测试(PC端)</h2>

    <p>使用 Unity 测试框架,在不连接硬件的情况下验证温度计算逻辑:</p>

    <pre><code>cd Tests

gcc -I unity -I .. -o test_runner test_temperature.c unity/unity.c -lm
./test_runner

    <p><strong>测试用例(共6个):</strong></p>
    <ul>
        <li>test_DS18B20_normal_read:正常温度读取(25.0°C)</li>
        <li>test_DS18B20_negative:零下温度(-10.5°C)</li>
        <li>test_filter_smooth:滑动平均滤波</li>
        <li>test_format_positive:正数格式化</li>
        <li>test_format_negative:负数格式化</li>
        <li>test_alarm_threshold:报警阈值判断</li>
    </ul>

    <hr>

    <h2>六、GitHub Actions CI/CD 配置</h2>

    <p>创建 <code>.github/workflows/ci.yml</code>,包含4个 Job:</p>

    <ol>
        <li><strong>build</strong> — ARM GCC 编译固件,上传 .hex / .bin</li>
        <li><strong>unit-test</strong> — PC端单元测试,生成测试报告</li>
        <li><strong>integration-test</strong> — Python + 串口集成测试(需要硬件)</li>
        <li><strong>code-quality</strong> — cppcheck 静态代码分析</li>
    </ol>

    <hr>

    <h2>七、集成测试(Python + 串口)</h2>

    <p><code>Tests/hardware/test_integration.py</code> 包含:</p>
    <ul>
        <li>温度输出格式验证</li>
        <li>温度值范围检查</li>
        <li>传感器状态查询</li>
        <li>报警功能测试</li>
        <li>阈值设置与读取</li>
        <li>固件版本查询</li>
        <li>重启功能测试</li>
    </ul>

    <pre><code>python3 -m pytest test_integration.py -v --html=report.html --self-contained-html</code></pre>

    <hr>

    <h2>八、效果对比</h2>

    <table>
        <tr><th>阶段</th><th>测试方式</th><th>覆盖率</th><th>人工介入</th></tr>
        <tr><td>Level 0</td><td>手动调试(kill)</td><td>~20%</td><td>100%</td></tr>
        <tr><td>Level 1</td><td>PC端单元测试</td><td>~50%</td><td>50%</td></tr>
        <tr><td>Level 2</td><td>PC端 + 集成测试</td><td>~80%</td><td>20%</td></tr>
        <tr><td>Level 3</td><td>全自动CI/CD</td><td>~90%+</td><td>5%</td></tr>
    </table>

    <hr>

    <h2>九、推荐落地路径</h2>

    <ul>
        <li><strong>第1周</strong>:搭建单元测试环境,接入 Unity 框架</li>
        <li><strong>第2周</strong>:接入 GitHub Actions,实现编译+测试自动化</li>
        <li><strong>第3周</strong>:编写 Python 集成测试脚本</li>
        <li><strong>第4周</strong>:代码质量检查 + 测试报告优化</li>
    </ul>

    <hr>

    <h2>十、参考资源</h2>

    <table>
        <tr><th>资源</th><th>链接</th></tr>
        <tr><td>ARM GCC 工具链</td><td><a href="https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm" style="color:#60a5fa;">https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm</a></td></tr>
        <tr><td>Unity 测试框架</td><td><a href="https://github.com/ThrowTheSwitch/Unity" style="color:#60a5fa;">https://github.com/ThrowTheSwitch/Unity</a></td></tr>
        <tr><td>GitHub Actions 文档</td><td><a href="https://docs.github.com/en/actions" style="color:#60a5fa;">https://docs.github.com/en/actions</a></td></tr>
        <tr><td>pytest 文档</td><td><a href="https://docs.pytest.org/" style="color:#60a5fa;">https://docs.pytest.org/</a></td></tr>
    </table>

    <hr>

    <blockquote>
        本文档由 Leonard(QA测试工程师)编写 | 2026-04-16
    </blockquote>
最后更新:2026-08-11 06:47