【stm32】bash自动配置buildenv

就是写一个stm32_buildenv.sh文件。截取edgetx开源代码写的。项目庞大的时候一个运行一个bash脚本实现多个功能容易导致脚本代码太长,可以放文件夹保存起来。

同时代码要什么用什么,模块化的抄代码也挺好没必要过度的学习工具的使用,嵌入式工具小到一个c和h都是工具,学不完,所以写下来方便未来抄。

开头

bash 复制代码
#! /usr/bin/env bash

set -e

作用:设置脚本在遇到任何错误时立即退出,防止错误累积。

在这时候写一点编译环境的相关注释。

参数和初始化

bash 复制代码
PAUSEAFTEREACHLINE="false"
STEP=1

pause after eachline这是我写的参数,这里定义一些参数使用。

bash 复制代码
for arg in "$@"
do
	if [[ $arg == "--pause" ]]; then
		PAUSEAFTEREACHLINE="true"
	fi
done

作用 :解析命令行参数,如果传入 --pause 参数,则启用功能。举一反三使用,项目大了什么功能都要模块。

查看版本

不同Ubuntu版本默认安装软件名称会有变化,说明编译环境很重要。

bash 复制代码
if [[ $(lsb_release -rs) != "22.04" ]]; then
  echo "ERROR: Not running on Ubuntu 22.04!"
  exit 1
fi
bash 复制代码
# 在构建脚本中检测Ubuntu版本
UBUNTU_VERSION=$(lsb_release -rs)
 
case "$UBUNTU_VERSION" in
    "20.04")
        # Ubuntu 20.04特定配置
        ;;
    "22.04")
        # Ubuntu 22.04特定配置
        ;;
    "24.04")
        # Ubuntu 24.04特定配置
        ;;
esac

一般是win不用查看了毕竟下软件方式不同了,不用检测版本。

正式步骤模版

bash 复制代码
echo "=== Step $((STEP++)): Checking if i386 requirement is satisfied ==="
bash 复制代码
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

每一步开头和结尾。这里的i386是检查是不是32位的x86架构,也就是很老的电脑cpu。不管看看就行。这里结尾时之前的单步运行参数的呼应,调试用。

例子:

bash 复制代码
echo "=== Step $((STEP++)): Updating Ubuntu package lists. Please provide sudo credentials, when asked ==="
sudo apt-get -y update
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

下载必要软件并配置

bash 复制代码
echo "=== Step $((STEP++)): Installing packages ==="
sudo apt-get -y install \
    build-essential \
    cmake \
    gcc \
    git \
    lib32ncurses-dev \
    lib32z1 \
    libsdl2-dev \
    software-properties-common \
    wget \
    zip \
    python3-pip-whl \
    python3-pil \
    libgtest-dev \
    python3-pip \
    python3-tk \
    python3-setuptools \
    clang \
    python3-clang \
    libusb-1.0-0-dev \
    stlink-tools \
    openocd \
    npm \
    pv \
    libncurses5:i386 \
    libpython2.7:i386 \
    libclang-dev \
    python-is-python3 \
    openssl
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

这里是开源软件提供的,只是要编译stm32不需要这么多软件使用。

这些工具组合起来可以完成 STM32 项目的:

  1. 代码编译(C/C++ 源码 → 机器码)

  2. 链接和优化

  3. 生成 HEX/BIN 固件文件

  4. 通过 ST-Link 或 OpenOCD 烧录到芯片

  5. 调试和验证

保留这几个就行

bash 复制代码
# 编译基础
build-essential cmake gcc

# ARM 工具链(通常需要额外安装)
# 如:arm-none-eabi-gcc, arm-none-eabi-binutils

# 烧录调试
openocd stlink-tools libusb-1.0-0-dev

# Python 构建脚本支持
python3-pip python3-setuptools
软件包 作用
openocd 开源片上调试器(STM32 烧录和调试)
stlink-tools ST-Link 编程器工具(ST 官方调试器支持)
libusb-1.0-0-dev USB 开发库(编程器 USB 通信支持)

还有一些工具也可以下载

software-properties-common 是管理Ubuntu软件源的重要工具,特别是当涉及到安装第三方软件或使用PPA时。它使用户能够轻松地添加、删除和管理软件源,从而获得更广泛的软件访问和更新选项。

JavaScript 运行时 Node.js 的默认包管理器。它允许开发者轻松地下载、安装、共享和管理项目的依赖库和工具。(可能用于 Web 界面)

pv用于写的bash脚本使用管道|的时候使用。(大文件操作时显示进度)

OpenSSL 是一个开源的加密工具包,广泛应用于网络通信中,提供对称和非对称加密、数字签名等功能,确保数据传输的安全性。

clang LLVM 编译器(替代或辅助 GCC)

git,wget,zip

网络获取的资源

这里我们用stm32必要的交叉编译工具链为例子,这里就是解压,放在opt里,交叉编译工具一般都放这里,最后添加环境变量。

交叉编译器(大部分arm都可以用)

wget讲解一下(实际直接wget就行)

选项 含义 效果
-q 安静模式 抑制大部分输出信息,保持界面简洁
--show-progress 显示进度条 在安静模式下仍然显示进度信息
--progress=bar:force:noscroll 进度条样式控制 强制使用特定格式的进度条

📊 进度条样式详解

--progress=bar:force:noscroll 可以分解为:

  • bar:使用条形进度条(而不是默认的点状进度)

  • force:强制显示进度条,即使输出不是终端

  • noscroll:进度条不滚动,保持在同一行更新

结合其他常用选项:

bash 复制代码
wget -q --show-progress --progress=bar:force:noscroll \
    --no-check-certificate \    # 跳过 SSL 证书检查
    --timeout=30 \              # 设置超时时间
    -O toolchain.tar.xz \       # 指定输出文件名
    https://example.com/toolchain.tar.xz
bash 复制代码
echo "=== Step $((STEP++)): Fetching GNU Arm Embedded Toolchains ==="
# EdgeTX uses GNU Arm Embedded Toolchain version 14.2.rel1
wget -q --show-progress --progress=bar:force:noscroll https://developer.arm.com/-/media/Files/downloads/gnu/14.2.rel1/binrel/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Unpacking GNU Arm Embedded Toolchains ==="
pv arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz | tar xJf -
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Removing the downloaded archives ==="
rm arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi.tar.xz
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Moving GNU Arm Embedded Toolchains to /opt ==="
sudo mv arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-eabi /opt/gcc-arm-none-eabi
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Adding GNU Arm Embedded Toolchain to PATH of current user ==="
echo 'export PATH="/opt/gcc-arm-none-eabi/bin:$PATH"' >> ~/.bashrc
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please press Enter to continue or Ctrl+C to stop."
  read
fi

DFU固件升级工具

dfu-util(Device Firmware Upgrade utility)是一款开源的固件升级工具,主要用于USB设备的固件烧录工作。 其工作原理是通过USB的DFU(Device Firmware Upgrade)模式对设备进行固件的下载和上传操作。 dfu-util在多种操作系统平台上都可以运行,它支持绝大多数具有DFU功能的USB设备。

DFU允许用户:

  • 固件升级:通过USB连接将新的EdgeTX固件刷入遥控器
  • 恢复模式:当无法正常启动时,通过DFU模式进行恢复
  • 批量生产:在生产线上快速烧录固件
bash 复制代码
echo "=== Step $((STEP++)): Fetching USB DFU host utility ==="
wget -q --show-progress --progress=bar:force:noscroll http://dfu-util.sourceforge.net/releases/dfu-util-0.11.tar.gz
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Unpacking USB DFU host utility ==="
pv dfu-util-0.11.tar.gz | tar xzf -
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Building and Installing USB DFU host utility ==="
cd dfu-util-0.11/
./configure
make
sudo make install
cd ..
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished. Please check the output above and press Enter to continue or Ctrl+C to stop."
  read
fi

echo "=== Step $((STEP++)): Removing the downloaded archive and build folder of USB DFU host utility ==="
rm dfu-util-0.11.tar.gz
rm -rf dfu-util-0.11
if [[ $PAUSEAFTEREACHLINE == "true" ]]; then
  echo "Step finished."
fi

这里写工具获取,没写使用,以后补,同时openOCD也是。

结尾

bash 复制代码
echo "Finished setting up EdgeTX development environment."
echo "Please execute: source ~/.bashrc"

有些就echo一个done即可,编译一些库用bash脚本成功是否最先看finished和done,没有就找error。

相关推荐
reembarkation2 小时前
自定义分页控件,只显示当前页码的前后N页
开发语言·前端·javascript
楼田莉子2 小时前
vscode搭建C/C++配置开发环境
c语言·开发语言·c++·vscode·学习·编辑器
我要精通C++2 小时前
lua虚拟机的垃圾回收机制
java·开发语言
22jimmy2 小时前
MyBatis动态sql
java·开发语言·mybatis
那我掉的头发算什么3 小时前
【数据结构】双向链表
java·开发语言·数据结构·链表·intellij-idea·idea
拾光Ծ3 小时前
【C++】STL之list模拟实现:关于链表容器的双向迭代器你知道多少?
开发语言·数据结构·c++·list·visual studio
666HZ6663 小时前
Java Stream流
java·开发语言
数模加油站3 小时前
最新R(4.4.1)及R-studio保姆级安装配置详细教程及常见问题解答
开发语言·windows·数学建模·r语言
编程指南针3 小时前
2026新选题-基于Python的老年病医疗数据分析系统的设计与实现(数据采集+可视化分析)
开发语言·python·病历分析·医疗病历分析