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

> 作者: Elaine
> 日期: 2026-04-16
> 标签: 嵌入式, DevOps

---

<h1>📖 嵌入式单片机 CI/CD 实战：从 STM32F103 工业温度计开始</h1>
        <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</code></pre>

        <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</code></pre>

        <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</code></pre>

        <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>