18.5 普通嵌入式开发环境
STM32
STM32 是意法半导体(STMicroelectronics, ST)从 2007 年开始推出的 32 位微控制器(MCU)系列,基于 ARM Cortex-M 内核,现在是嵌入式开发里最主流的 MCU 之一。
安装 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 官网 备份下载最新压缩包后进行解压。(写作文章时,下载无需注册登录,仅需点击以访客身份下载即可,填入信息,注意下载链接会被发送到邮件中,请确保邮件地址可以收信。)
解压后进入 Linux 兼容层的 bash:
$ /compat/linux/usr/bin/bash 定位到解压缩文件夹并运行其中的SetupSTM32CubeMX-{版本号}安装脚本({版本号} 对应你下载的 STM32CubeMX 版本),指定安装的目录即可。
创建桌面快捷方式:
在 ~/Desktop 下创建 STM32CubeMX.desktop 文件,然后写入:

安装其他工具
使用 pkg 安装:
或者使用 ports 构建:
编译与烧录
使用 STM32CubeMX 创建项目,在 Project Manager 的 Project 里的 Toolchain/IDE 栏选择 CMake,在 Code Generator 里选择 copy all used libraries into project folder 和 Generate peripheral initialization as a pair of '.c/.h' files per peripheral。
生成项目后修改 CMakeLists.txt:
注意
该演示针对的是 STM32F103C8T6 等 STM32F1x 的芯片,请根据实际情况修改 CMakeLists.txt。
该演示使用的是 openocd 烧录,也可换为 stlink。
为了在终端使用 arm-gcc-embedded 的工具,应把其二进制文件加入 PATH 中。
对于 sh/bash/zsh,写入 ~/.profile:
对于 fish,写入 ~/.config/fish/config.fish 文件:
对于 csh,写入 ~/.cshrc:
开始编译:
最后烧录到开发板:
Espressif 乐鑫科技
Espressif 乐鑫科技 的主要项目是 ESP-IDF,这是他们为 ESP8266、ESP32 等芯片提供的官方开发框架,以 Apache 2.0 许可开源。里面包含 Wi-Fi/Bluetooth 协议栈、FreeRTOS、各种外设驱动、组件库和示例代码。
警告
ESP-IDF 官方尚不支持 FreeBSD,其官网文档也仅列出 Windows/Linux/macOS 的支持。
在 ESP-IDF 仓库的
tools/idf_tools.py文件下,有:但这是把 FreeBSD 平台映射到 Linux 的手段,是一种“兼容性 hack”,并非官方的直接支持。
虽然通过一定手段能在 FreeBSD 上成功编译 ESP-IDF,但稳定性不如官方平台,也可能会出现未知错误,因此并不建议在生产环境中使用。
安装 esptool 和 xtensa-esp-elf
使用 pkg 安装:
或者使用 ports 构建:
安装 ESP-IDF
下载最新的 ESP-IDF RELEASE 压缩包
注意
ESP-IDF 的版本可能会更新,请检查 ESP-IDF 的 GitHub 仓库 来获取最新版。
安装必要工具
使用 pkg 安装:
或者使用 ports 构建:
初次运行 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 用户:
编译与烧录示例
擦除整个 Flash
参数说明:
把
--chip改成你的芯片型号,如esp32s3、esp32c3;--port端口可根据dmesg | grep usb或usbconfig查找,通常是/dev/cuaU0或/dev/ttyU0
更多子命令帮助:esptool.py {子命令} --help,如 esptool.py write_flash --help
编译项目
执行编译操作:
烧录固件
使用 esptool.py 烧录:
参数说明:
-z:压缩模式,速度更快0x1000:常见起始地址(bootloader 后),如果是完整固件常从 0x0 开始firmware.bin你编译的固件
或者使用 idf.py 烧录:
Arduino
Arduino(阿尔杜伊诺)是一个开源的电子原型平台,2005 年由意大利伊夫雷亚交互设计学院(Interaction Design Institute Ivrea, IDII)的学生和老师发起,最初目的是用于教学(交互设计硕士课程),让非专业人士也能轻松做电子项目。2006 年,面对缺乏资金的窘境,伊夫雷亚交互设计学院(2001-2006)停办。Arduino 的原型却被保留了下来……
与 FreeBSD 项目的愿景一致,Arduino 愿景是让 Arduino 可供任何人使用。
技巧
Arduino 是一千多年前,一位意大利国王的名字(Arduin of Ivrea,意为“勇敢的朋友”)。而在这位国王的出生地,意大利北部一个如诗如画的小镇 Ivrea(伊夫雷亚),有家叫 di Re 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,你的名字究竟该怎么读?,Arduino 中国微信公众号载。运营主体为 Arduino 在中国的外企独资公司,法定代表人为创始人 Federico Musto 先生。
Arduin of Ivrea,关于这位国王的有记载文献或许并不算多,大英百科全书中也只有寥寥数语。
故障排除与未竟事项
FreeBSD 上的 PlatformIO
待撰写。
FreeBSD 上的 Linux 嵌入式开发
待撰写。
FreeBSD 上的 RISC-V 嵌入式开发
待撰写。
最后更新于