【stm32】bash自动配置buildenv - 教程

news/2025/10/1 13:39:34/文章来源:https://www.cnblogs.com/yxysuanfa/p/19122387

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

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

开头

#! /usr/bin/env bash
set -e

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

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

参数和初始化

PAUSEAFTEREACHLINE="false"
STEP=1

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

for arg in "$@"
doif [[ $arg == "--pause" ]]; thenPAUSEAFTEREACHLINE="true"fi
done

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

查看版本

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

if [[ $(lsb_release -rs) != "22.04" ]]; thenecho "ERROR: Not running on Ubuntu 22.04!"exit 1
fi
# 在构建脚本中检测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不用查看了毕竟下软件方式不同了,不用检测版本。

正式步骤模版

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

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

例子:

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

下载必要软件并配置

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" ]]; thenecho "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. 调试和验证

保留这几个就行

# 编译基础
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-toolsST-Link 编程器工具(ST 官方调试器支持)
libusb-1.0-0-devUSB 开发库(编程器 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:进度条不滚动,保持在同一行更新

结合其他常用选项:

wget -q --show-progress --progress=bar:force:noscroll \--no-check-certificate \    # 跳过 SSL 证书检查--timeout=30 \              # 设置超时时间-O toolchain.tar.xz \       # 指定输出文件名https://example.com/toolchain.tar.xz
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" ]]; thenecho "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" ]]; thenecho "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" ]]; thenecho "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" ]]; thenecho "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" ]]; thenecho "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模式进行恢复
  • 批量生产:在生产线上快速烧录固件
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" ]]; thenecho "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" ]]; thenecho "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" ]]; thenecho "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" ]]; thenecho "Step finished."
fi

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

结尾

echo "Finished setting up EdgeTX development environment."
echo "Please execute: source ~/.bashrc"

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java17及以上版本如何抵御TemplatesImpl注入

最近有一篇写的很好的关于java17反序列化绕过模块化的文章:https://mp.weixin.qq.com/s/DrUUAJaLig_RtXZWaAm1IQ 关于本篇的方式方法也比较传统,直接jep290在java运行时增加命令行参数: -Djdk.serialFilter=!com.su…

详细介绍:【C++实战(53)】C++11线程库:开启多线程编程新世界

详细介绍:【C++实战(53)】C++11线程库:开启多线程编程新世界pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

wordpress让小工具支持简码汕头百度seo在哪里

2006-2023年各地级市债务余额数据 1、时间:2006-2023年 2、来源:整理自wind 3、指标:地区、地方政府债-债券数量(只)、地方政府债-债券余额(亿)、地方政府债-债券余额占比(%)、城投债-债券数量(只)、城投债-债券余额(亿)、城投债-债券余额…

将图片某个区域批量填充白色(jsx代码)

// 定义源文件夹和目标文件夹路径 var sourceFolderPath = "C:/Users/***/Desktop/拆分/"; var destFolderPath = "C:/Users/***/Desktop/结果/";// 定义要填充的区域坐标 (x, y, 宽度, 高度) var…

青岛做网站哪个公司好网站建设报告论文

电影《楚门的世界》中描述过这样的故事:楚门这个快乐单纯的青年,一直以为自己是平凡小镇上普通的保险推销员。直到有一天他发现这世界上的一切都是为他精心安排的。他会遇到谁、在他身上将要发生什么事件,都是按照剧本被人操纵的。甚至连他的…

详细介绍:四数之和_优选算法(C++)双指针法总结

详细介绍:四数之和_优选算法(C++)双指针法总结pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

网站建设 嘉定宣传片制作公司前景

内存操作命令 直接对DRAM进行读写的操作,uboot常用的内存操作命令有md,nm,mm,mw,cp和cmp. md命令: 显示内存值 # md md - memory display Usage: md [.b, .w, .l, .q] address [# of objects] b:1个字节 byte w:2个字节 world l:4个字节 long of objects 以word 为单位的1…

《初等数论(第四版,北京大学出版社,潘承洞,潘承彪著)》阅读笔记+心得

I、整除理论 一、自然数与整数 这里的自然数定义和各种规律以及反证法的定义就不再赘述,我们从归纳法开始讲起。 1.归纳原理 归纳原理: 设 S 是 N 的一个子集,满足条件: (i) \(1 \in S\) (ii) \(n \in S\),那么有…

完整教程:Ansible Playbook

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

免费招聘的网站自己的网站什么做优化

我的施工之路Python 绘图入门这是施工系列第18篇,同时也进入到一个新的阶段:Python绘图篇。作为绘图模块的第一篇,与大家一起过过最基本的Python绘图原理。掌握基本的绘图原理很有必要,各个常用绘图库的原理基本都是相通的。所以了…

做企业云网站的企业邮箱丰都网站建设公司

Web页面中的特殊效果,如菜单效果,对话框效果都需要通过定位属性来实现。定位样式position属性可以控制元素的定位类型position属性值可以为sataic、fixed、absolute、relativeposition属性的语法结构- position:value;定位属性static默认值。没有定位&am…

深圳做分销网站的公司大学生心里健康网站设计与建设

深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守护进程是生存期长的…

完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?

完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

没有网站怎样做外贸wordpress文章换行符

前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。 但是对于很多情况,顺序结构的代码是远远不够的,这时我们就要使用判断语句即if else语句。 …

珠海哪里学网站开发拓者设计吧官网app

计算机专业毕业后大致的工作方向是软、硬、网、图 四大类 尤其以软件、网络为现今的首选 从岗位上分,又可以分为技术道路、营销道路两大方向 if 你选择作技术,then 从现在开始,牢记: 天道酬勤!!&#xff…

制作网站首先做的工作重庆网站排名优化教程

系统配置:Windows XP 32位R 3.1.1一、安装RMySQL:1,安装RTools并配置环境变量:我的电脑——属性——高级——环境变量,在系统变量一栏中选择PATH,点击编辑,在后面添加RTools的路径(如:D:\Rtools\bin;D:\Rtools\gcc-4.6.3\bin;D:\R…

做网站需要购买服务器吗wordpress 果酱小程序

13 集合 实现方法时,不同的数据结构会导致性能有很大差异。 13.1 集合接口 Java集合类库将接口(interface)与实现(implementation)分离。 可以使用接口类型存放集合的应用,一旦改变了想法,可…

NOIP2025模拟赛28

T1 T2 T3 T4\(\color{#52C41A} 普及+/提高\) \(\color {#3498DB} 提高+/省选-\) \(\color {#3498DB} 提高+/省选-\) \(\color{#9D3DCF} 省选/NOI-\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68a2efb9c5d9c2f14c2…

markdown笔记文件批量打上时间戳

解决了给一个文件夹(包含子文件夹)下的所有.md文件在最前面添加时间戳。 例如`Typora 笔记迁移 Obsidian 图片链接处理.md`修改为`20251001-Typora 笔记迁移 Obsidian 图片链接处理` 打上时间戳的笔记能够更好配合笔…