4 项目原理
开发工具链的原理图:


这里有几个知识点需要明确。
- 可执行文件到机器码需要经过哪几个步骤
- .o .elf. .bin分别是什么
- 我们常说的编译,汇编,链接,调试是什么呢?
- GDB是什么,他跟VSCODE的launch.json有什么关系呢?
- 我们使用什么把可执行文件烧录到板子上呢?
这一部分知识适合大二上完成,大一的可能会很吃力
放一个学习视频 可以看第三章与第四章内容,涉及编译链接调试等内容,讲得很好,(优秀老师就是不一样啊,看看泥电)

简单介绍

从程序员编写的源文件到板子灯亮起,大致要经过编译汇编,链接,二进制转化,下载四个步骤。每个步骤都需要特定的软件完成。其中前三个步骤被集成到一个叫ARM GNU Toolchain的工具链中,下载则由openocd /stlink-tools(软件)+STLINK烧录线(硬件)一起完成。所以接下来我们只需要下载ARM GNU Toolchain与openocd就可以完成这个任务。
其他参考视频
b站视频 这个up主也可以,但是没有上面那么系统,大一的uu可以当作简单了解

5 安装 ARM GNU Toolchain
ARM GNU Toolchain简介
关于ARM GNU Toolchain的简介与交叉编译的知识,请看刘佬博客,袁佬的博客
这里只引用一下
交叉编译(Cross compiling)是指在一个平台上进行编译,生成在另一个不同平台上运行的可执行程序或库文件的过程。通常,交叉编译用于开发跨平台软件或嵌入式系统。
为什么需要交叉编译?主要有 3 个原因:
- 嵌入式系统开发:嵌入式系统通常运行在资源有限的硬件设备上,如嵌入式处理器、微控制器或单片机。这些设备通常不具备强大的计算能力和存储容量,因此需要在更强大的计算机上进行交叉编译,以生成适合嵌入式设备的二进制文件。
- 跨平台开发:在开发跨平台软件时,交叉编译可以简化开发流程。例如,如果你要开发一个同时运行在 Windows、Linux 和 macOS 上的应用程序,你可以在一种平台上编译应用程序,并生成可在其他平台上运行的可执行文件。
- 提高编译效率:有时候,主机平台上的编译器和开发环境可能更加强大和高效,因此进行交叉编译可以提高编译效率。通过利用更强大的计算机资源,可以更快地生成目标平台上的二进制文件。
交叉编译器的命名规则通常遵循一定的约定,以便清晰地标识其适用的平台和体系结构。通常至少包括 3 部分:[目标平台]-[目标OS]-[功能后缀]
- 目标平台:arm-, mips-, x86_64-, riscv64-
- 目标 OS:linux, win32, android, none
- 功能后缀:-gcc, -g++, -ld, -gdb
实际上命名也没有官方标准,也有很多命名确实没有按照这个规则。我们需要安装的 C 语言编译器应该是 arm-none-eabi-gcc,其中 EABI(Embedded Application Binary Interface,EABI) 是一种为嵌入式系统设计的二进制接口标准,用于确保在不同的嵌入式平台上可移植性和互操作性。
下载ARM GUN Toolchain
建议使用二进制文件安装,而不是gdb-multiarch

安装有些坑,解压后没有 Makefile 文件,需要手动安装。解压到 /opt/gcc-arm-none-eabi,然后添加环境变量,可以在 ~/.zshrc 中添加如下一行,每次启动 zsh 的时候就能够自动加入环境变量了。
export PATH=$PATH:/opt/gcc-arm-none-eabi/bin
正常情况下 arm-none-eabi-gcc 等工具应该能正常使用了,但可能依然无法使用 arm-none-eabi-gdb。如果你遇到如下报错:
arm-none-eabi-gdb: error while loading shared libraries: libncursesw.so.5: cannot open shared object file: No such file or directory
则,
sudo apt install -y libncursesw5
此外,ARM GNU Toolchain 还需要 Python3.8 支持,如果看到如下报错:
Could not find platform independent libraries <prefix>Could not find platform dependent libraries <exec_prefix>Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]Python path configuration: PYTHONHOME = (not set) PYTHONPATH = (not set)...Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encodingPython runtime state: core initializedModuleNotFoundError: No module named 'encodings'
则,
sudo apt install -y python3.8
如果你遇到报错:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package python3.8 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'python3.8' has no installation candidate
那就创建一个python3.8的虚拟环境。
csdn文章:创建一个3.8的虚拟环境
最后检验:

6 安装 usbipd
安装usbipd
(针对于wsl用户 ,Linux用户可以跳过)
没什么说的 直接下载到Windows上运行就可以了。
usbipd 是用于将 Windows 本地连接的 USB 设备共享给其他机器的开源项目,包括 Hyper-V 虚拟机和 WSL 2。
将USB 设备共享给 WSL
以管理员身份运行Windows PowerShell
插上STLINK, 输入
usbipd list
可以看到第一行成功读取 STM32 STLINK

要将3-1共享给WSL,输入:
usbipd bind --busid ?-?(这里问号是你自己对应的数字)

共享设备:
usbipd attach --wsl --busid ?-?

在WSL中输入
lsusb
结果如图
(注意我的STLINK驱动时ST-LINK/V2,后面会有用)

在 WSL 中完成设备使用后,可物理断开 USB 设备,或者从 PowerShell 运行此命令:PowerShell复制usbipd detach --busid <busid>
7 安装下载工具
该怎么把程序烧录到 STM32F401RET6 开发板上呢?一种办法是使用 stlink-tools,另一种办法是使用 OpenOCD。 ( 两者二选一即可)
stlink-tools 是一个开源的工具集,用于编程和调试 STMicroelectronics 制造的 STM32 设备和开发板。
安装stlink-tools
sudo apt install stlink-tools
确保将usb共享给WSL的情况下输入st-info --probe:

成功读取flash即为成功。
安装 OpenOCD
OpenOCD(Open On-Chip Debugger)是一个开源的调试和编程工具,用于嵌入式系统开发中与芯片上调试接口(如 JTAG、SWD 等)通信并进行调试、编程和仿真操作。
OpenOCD 提供了一种通用的接口和协议,可以与多种嵌入式芯片和调试接口进行交互。它支持各种处理器架构(如 ARM、RISC-V 等)和调试接口(如 JTAG、SWD、BDM 等),可以与目标系统上的芯片进行连接,并通过调试接口与芯片进行通信。
主要功能有两个:
- 调试功能:OpenOCD 支持寄存器读写、内存读写、断点设置、单步执行等调试操作,允许开发人员在目标系统上进行调试。它与 GDB 调试器紧密集成,提供了与 GDB 之间的通信接口。
- 编程功能:OpenOCD 支持对芯片进行编程,包括烧录程序代码、擦除芯片、写入 Flash 存储器等操作。它能够与多种烧录器(如 J-Link、ST-Link 等)集成,实现对芯片的编程。
直接使用包管理器安装
sudo apt install openocd
安装后在 /usr/share/openocd/scripts/ 下可以找到 interface 和 target 文件夹,后面使用 OpenOCD 会用到。
到此就完成了编译汇编链接下载,但我们还需要调试。下一页讲调试与CMakeLists.txt构建大型工程
Comments 1 条评论
(・∀・)