18.5 通用嵌入式开发环境

嵌入式系统开发是计算机科学与技术学科的重要分支,其技术成果广泛应用于物联网(Internet of Things,IoT)、工业自动化控制、消费类电子等诸多领域。本章详细介绍如何在 FreeBSD 操作系统上搭建主流的嵌入式开发环境。

STM32 开发环境

STM32 微控制器概述

STM32 是意法半导体(STMicroelectronics,ST)自 2007 年起推出的 32 位微控制器(Microcontroller Unit,MCU)产品系列,该系列产品基于 ARM Cortex-M 处理器内核架构,目前已成为嵌入式开发领域应用最为广泛的 MCU 平台之一。

STM32CubeMX 安装与配置

STM32CubeMX 是意法半导体官方提供的图形化硬件配置与代码生成工具,其核心功能是帮助开发者快速完成 STM32 项目的硬件初始化代码生成。本节介绍如何在 FreeBSD 平台上安装 STM32CubeMX。

在 FreeBSD 平台进行 STM32 嵌入式开发,推荐采用 STM32CubeMX 进行项目初始化配置。需要说明的是,STM32CubeMX 官方仅支持 Windows、Linux、macOS 三大平台,因此在 FreeBSD 上运行该软件需要借助 Linux 兼容层。

关于在 FreeBSD 上安装 Linux 兼容层的详细教程,请参考本书其他章节,推荐使用 FreeBSD 官方维护的 linux-rl9 兼容层。

在开始安装 STM32CubeMX 之前,请确保系统已安装 OpenJDK(版本要求不低于 17.0.6)作为运行时依赖。

注意

建议在 /compat/linux/home 目录下为当前用户创建专用的主目录,并以非特权用户身份完成 STM32CubeMX 的安装流程,以避免不必要的 root 权限操作带来的安全风险。

例如:

# mkdir -p /compat/linux/home/username
# cd /compat/linux/home/
# chmod 775 -R username 

配置好兼容层后,到 STM32CubeMX 官网arrow-up-right 下载最新压缩包后进行解压。写作本文时,下载无需注册登录,仅需点击以访客身份下载即可,注意下载链接会被发送到邮件中,请确保邮件地址可以收信。

解压后进入 Linux 兼容层的 bash:

定位到解压缩文件夹并运行其中的 SetupSTM32CubeMX-{版本号} 安装脚本({版本号} 对应你下载的 STM32CubeMX 版本),指定安装的目录即可。

创建桌面快捷方式:

~/Desktop 下创建 STM32CubeMX.desktop 文件,然后写入:

STM32CubeMX

安装其他工具

除了 STM32CubeMX 外,还需要安装一些必要的开发工具链和调试工具,才能完成完整的嵌入式开发流程。本节介绍如何安装其他开发工具。使用 pkg 安装:

或者使用 ports 构建:

编译与烧录

完成开发环境搭建后,就可以开始进行 STM32 程序的编译和烧录工作。本节介绍如何编译和烧录 STM32 程序。使用 STM32CubeMX 创建项目,在 Project ManagerProject 里的 Toolchain/IDE 栏选择 CMake,在 Code Generator 里选择 copy all used libraries into project folderGenerate peripheral initialization as a pair of '.c/.h' files per peripheral

生成项目后修改 CMakeLists.txt

注意

该演示针对的是 STM32F103C8T6 等 STM32F1x 的芯片,请根据实际情况修改 CMakeLists.txt。

该演示使用的是 openocd 烧录,也可换为 stlink。

为了在终端使用 gcc-arm-embedded 的工具,应把其二进制文件加入 PATH 中。

对于 sh/bash/zsh,写入 ~/.profile

对于 fish,写入 ~/.config/fish/config.fish 文件:

对于 csh,写入 ~/.cshrc

开始编译:

最后烧录到开发板:

Espressif 乐鑫科技开发环境

ESP 系列芯片概述

除 STM32 平台外,乐鑫科技(Espressif)的 ESP 系列芯片亦是物联网(IoT)开发领域的主流选择,该系列芯片以其集成度高、功耗低以及出色的 Wi-Fi 和蓝牙连接能力而著称。

Espressif 乐鑫科技arrow-up-right 的核心开发项目为 ESP-IDF,这是该公司为 ESP8266、ESP32 等芯片系列提供的官方开发框架,以 Apache 2.0 许可证开源发布。ESP-IDF 框架包含完整的 Wi-Fi/Bluetooth 协议栈、FreeRTOS 实时操作系统内核、各类外设驱动程序、功能组件库以及丰富的示例代码。

警告

需要明确的是,ESP-IDF 官方尚未正式支持 FreeBSD 平台,其官方文档仅列出了 Windows、Linux、macOS 三大平台的支持说明。

值得注意的是,在 ESP-IDF 仓库的 tools/idf_tools.py 文件中存在以下配置:

但这仅为将 FreeBSD 平台映射至 Linux 平台的兼容性处理手段,并非官方意义上的直接支持。

尽管通过一定的技术手段可在 FreeBSD 上成功编译 ESP-IDF,但其稳定性仍不及官方支持平台,且可能出现未预期的错误,因此不建议在生产环境中采用此配置。

esptool 与编译工具链安装

在开始使用 ESP-IDF 之前,需先安装一系列基础工具,包括固件烧录工具和交叉编译工具链。本节介绍 esptool 及相关工具的安装方法。

使用 pkg 二进制包管理器安装:

或者使用 ports 构建:

安装 ESP-IDF

ESP-IDF 是乐鑫科技官方提供的开发框架,包含了完整的开发工具链和组件库。

下载最新的 ESP-IDF RELEASE 压缩包

注意

ESP-IDF 的版本可能会更新,请检查 ESP-IDF 的 GitHub 仓库arrow-up-right 来获取最新版。

安装必要工具

使用 pkg 安装:

或者使用 ports 构建:

初次运行 ESP-IDF 安装程序

下载完 ESP-IDF 后,需要运行安装脚本进行环境配置。本节介绍如何初次运行 ESP-IDF 安装程序。然后开始编译 ESP-IDF:

此时脚本会自动下载这些工具:

技巧

如果下载过慢,可以复制终端里的下载链接然后使用工具加速下载。

注意

第一次运行 ./install.sh 会卡在 Python 包安装阶段并报错:

原因

PyPI 和 Espressif 的 extra-index 里根本没有 FreeBSD-amd64 的预编译 wheel(官方只提供了 linux-amd64、win-amd64、macosx 等)。同时 espidf.constraints.v5.5.txt 文件里还强制写了 --only-binary cryptography--only-binary tree-sitter-c,导致 pip 拒绝从源码编译。

解决方法:修改 constraints 文件

这行命令旨在放开源码编译限制,把文件中所有 --only-binary 都注释掉,允许 pip 从源码编译 cryptography、tree-sitter-c 等包。

修改完成后,重新执行:

这样才能让安装脚本顺利通过 Python 环境阶段。

成功编译后,就可以开始激活 ESP-IDF 的环境:

对于 sh / bash / zsh 用户:

对于 fish 用户:

编译与烧录示例

完成 ESP-IDF 环境配置后,就可以开始编译和烧录示例程序了。本节介绍如何编译和烧录 ESP-IDF 程序。

擦除整个 Flash

在烧录新固件前,通常需要先擦除芯片上的 Flash 存储空间,以确保新固件能够正常运行。

参数说明:

  • --chip 改成你的芯片型号,如 esp32s3esp32c3

  • --port 端口可根据 dmesg | grep usbusbconfig 查找,通常是 /dev/cuaU0/dev/ttyU0

更多子命令帮助:esptool.py {子命令} --help,如 esptool.py write_flash --help

编译项目

擦除 Flash 后,就可以创建并编译 ESP-IDF 项目了。本节介绍如何编译 ESP-IDF 项目。执行编译操作:

烧录固件

使用 esptool.py 烧录:

参数说明:

  • -z:压缩模式,速度更快

  • 0x1000:常见起始地址(bootloader 后),如果是完整固件常从 0x0 开始

  • firmware.bin:你编译的固件

或者使用 idf.py 烧录:

Arduino 开发环境

Arduino 平台概述

Arduino 是一款深受电子爱好者与教育工作者喜爱的开源硬件平台,其设计理念以简易性与可访问性为核心。本节介绍 Arduino 开发平台的配置与使用方法。

Arduinoarrow-up-right(中文常译为阿尔杜伊诺)是一个开源电子原型开发平台,于 2005 年由意大利伊夫雷亚交互设计学院(Interaction Design Institute Ivrea, IDII)的师生共同发起创立。该项目的初衷是服务于教学用途(具体为交互设计硕士课程),旨在让非专业背景的人士也能够便捷地开展电子项目开发。2006 年,由于资金困难,伊夫雷亚交互设计学院(2001-2006 年存续)宣告停办,但 Arduino 项目原型却得以保留并持续发展。

值得一提的是,Arduino 项目的愿景与 FreeBSD 项目的开源理念具有共通之处,Arduino 的官方愿景arrow-up-right明确提出要让 Arduino 平台能够为任何人所使用。

背景知识

Arduino 这一名称源自一千多年前的一位意大利国王——伊夫雷亚的阿尔杜因(Arduin of Ivrea),其名字含义为“勇敢的朋友”。而在这位国王的出生地——意大利北部风景如画的伊夫雷亚镇(Ivrea),有一家名为“di Re Arduino”(意为“国王 Arduino 的”)的酒吧,Arduino 项目的联合创始人曾是这家酒吧的常客,项目名称即由此而来。

Arduino 安装方法

本节介绍 Arduino 开发环境的安装步骤。

使用 pkg 二进制包管理器安装:

或者使用 ports 构建:

然后加载模块:

加入到 /boot/loader.conf 永久生效:

注意

FreeBSD ports 上的 Arduino IDE 只有 1.8.x 版本,而最新的 Arduino IDE 已经到了 2.x 版本,这是因为 1.8.x 是基于 Java 编写的,易于移植,而 Arduino IDE 2.x(从 2.0 开始)基于 Theia(VS Code 衍生)和 Electron/Chromium 框架,这在 FreeBSD 上移植更复杂,因为 Electron 需要 Linux 专有依赖,且 FreeBSD 的 Chromium port 存在兼容性问题。

如果对此感兴趣,读者可尝试移植。

Arduino IDE

参考文献

故障排除与后续研究主题

嵌入式开发环境的搭建与使用过程中可能会遇到各类技术问题,本节旨在记录一些常见问题的解决思路,并预留后续内容的撰写位置。

课后习题

  1. 查找 PlatformIO 在 FreeBSD 上的相关资料,补充其完整的安装与配置流程,在 FreeBSD 上创建一个 STM32 项目并成功编译烧录。

  2. 适配 stm32cubemx2 到 FreeBSD。

最后更新于