1. PlatformIO与STM32开发环境搭建第一次接触PlatformIO是在三年前的一个开源项目里当时就被它的跨平台特性惊艳到了。相比传统的Keil、IAR等IDEPlatformIO最大的优势在于它完美支持VSCode而且配置起来特别简单。就拿STM32开发来说传统方式需要折腾各种工具链而PlatformIO只需要一个配置文件就能搞定。安装过程比想象中简单太多。打开VSCode的扩展商店搜索PlatformIO IDE点击安装就行。安装完成后左侧会出现一个小蚂蚁图标官方说是火箭但我怎么看都像蚂蚁这就是PlatformIO的主入口。第一次使用时会自动下载必要的工具链这里有个小技巧如果下载速度慢可以修改pip源为国内镜像。开发板选择方面我常用的是正点原子精英板STM32F103ZE。在创建新项目时PlatformIO提供了丰富的板型支持搜索STM32F103ZE就能找到对应选项。框架选择Arduino主要是考虑到生态丰富各种传感器驱动一应俱全。创建项目后会自动生成几个关键文件夹.pio存放编译中间文件和最终固件src存放源代码默认生成main.cpplib存放第三方库platformio.ini核心配置文件2. 多场景构建配置实战在实际项目中我们经常需要针对不同场景编译不同版本的固件。比如调试时用J-Link下载量产时用串口下载或者针对不同硬件版本启用不同功能。PlatformIO的platformio.ini文件可以完美解决这些问题。先看一个基础配置示例[env:genericSTM32F103ZE] platform ststm32 board genericSTM32F103ZE framework arduino要实现多场景构建主要用到这几个技巧环境变量通过[env:xxx]定义不同环境构建标志使用build_flags设置宏定义上传配置通过upload_protocol指定下载方式比如要同时支持J-Link和串口下载[env:jlink] upload_protocol jlink build_flags -D USE_JLINK [env:serial] upload_protocol serial upload_port COM8 build_flags -D USE_SERIAL在代码中就可以通过预处理宏来区分不同场景void setup() { #ifdef USE_JLINK // J-Link专用初始化 #endif #ifdef USE_SERIAL // 串口专用初始化 #endif }3. 高级配置技巧当项目复杂度上升时基础配置可能就不够用了。这里分享几个实战中总结的高级技巧3.1 自定义构建脚本有时需要在编译前执行一些预处理比如生成版本号。可以在platformio.ini中添加extra_scripts pre:custom_script.py然后在custom_script.py中编写Python脚本Import time version time.strftime(%Y%m%d) Define(VERSION, %s % version)3.2 多环境共享配置为了避免重复配置可以使用[env]段定义公共配置[env] platform ststm32 framework arduino build_flags -D COMMON_FLAG [env:debug] build_flags ${env.build_flags} -D DEBUG_MODE [env:release] build_flags ${env.build_flags} -D RELEASE_MODE3.3 条件编译实战一个真实项目案例我们需要为同一款硬件开发基础版和Pro版固件。配置如下[env:basic] build_flags -D MODEL_BASIC [env:pro] build_flags -D MODEL_PRO lib_deps Adafruit GFX Library Adafruit SSD1306代码中通过宏控制功能差异void setup() { #ifdef MODEL_PRO oled.begin(); // Pro版初始化OLED #endif }4. 一键部署与自动化PlatformIO最强大的地方在于它的CLI工具可以轻松实现自动化构建。常用的命令有pio run -e jlink编译jlink环境pio run -e serial -t upload编译并烧录serial环境pio run -e debug --target clean清理debug环境4.1 持续集成配置在GitHub Actions中配置自动化构建name: CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - uses: actions/setup-pythonv2 - run: pip install platformio - run: pio run -e jlink - run: pio run -e serial4.2 批量生产烧录对于量产场景可以编写Python脚本实现自动烧录import subprocess def flash_firmware(port): subprocess.run([ pio, run, -e, production, --target, upload, --upload-port, port ]) ports [COM8, COM9, COM10] for port in ports: flash_firmware(port)4.3 版本管理技巧在platformio.ini中定义版本号[env] build_flags -D FW_VERSION\${sysenv.get(GIT_TAG, dev)}\然后在代码中显示版本void setup() { Serial.begin(115200); Serial.print(Firmware Version: ); Serial.println(FW_VERSION); }