type
status
date
slug
summary
tags
category
icon
password

week01——环境配置

环境准备

  • ubuntu 22.04.3 LTS amd64(使用VMware虚拟机)
  • openocd烧录调试工具
  • VScode
  • ARM GNUToolchain编译链
  • STM32CubeMX

流程以及目标

环境配置的总体流程如下:
  • 安装pc端应用
    • 安装VScode
    • 安装STM32CubeMX
    • 安装openocd
    • 安装arm-none-eabi-gcc编译链
  • 配置VScode
    • 安装插件
    • 配置json文件
  • 调试
    • 使用STM32CubeMX生成代码并使用Makefile编译
    • 尝试调试
目标:能够通过vscode编写程序,然后通过arm gnu toolchain编译链(也就是arm-none-eabi-gcc编译链)进行交叉编译,然后通过openocd将程序烧录到开发版上并进行调试。

安装PC端应用

安装VScode

直接在ubuntu上的软件商店里面就有vscode了,直接安装就好了

安装STM32CubeMX

安装STM32CubeMX直接上官网安装即可:STM32CubeMX官网
装这个玩意主要还是因为像看看项目的Makefile到底应该怎么写,怎么写才比较规范。但是这个玩意生成代码的时候要下载的东西真的多,以至于之前虚拟机磁盘空间不够了。然后跟着网上的狗屎教程做了一遍,直接把虚拟机搞爆了,不得不重装一次虚拟机。所以这里就浅浅说一下VMware虚拟机磁盘扩容一些东西。
在VMware中直接磁盘空间的时候会提示还需要在虚拟机中进行配置。在网上好像没有找到能够直接进行虚拟机磁盘分区扩容的方法,大部分的思路都是删除原有分区然后再重新进行分区,但是这样子就会导致原来的数据都会丢失,好像是不可避免的。但是我因为之前乱搞已经把系统搞爆炸了,所以重新装虚拟机就相当重新分区了。再次重装时又会让我分配磁盘的大小,我就没有再尝试重新分区扩容的方法了。下面记录一条终端里面有关磁盘的指令
在终端的输出中我们能发现我们在VMware虚拟机中配置的磁盘大小,实际上就是下面这个目录的大小:
notion image
这里可以就能发现根分区应该是/dev/sda3

安装openocd

  • 什么是openocd?
  • 下载vscode的作用就不说了,openocd是为了调试,也就是去支持一些协议,如jtag协议等,好像就是一个用来进行协议转换的东西。openocd是一种仿真器,能够提供调试信号,因为电脑一般是不支持这些调试信号的,所以需要openocd来进行信号的转换(或者说是协议的转换)
  • 使用apt命令安装
  • linux实际上自带了openocd。在linux终端中输入下面的指令就可以进行安装了
    • 安装结束之后发现这个openocd的版本确实跟其他的队友说的一样低了一个大版本,如下图:
      notion image
      所以选择删除这个老版本的openocd,选择在官网上下载
  • 从github上下载
  • 参考网上的教程,在终端中输入指令:
    • 如果出现无法识别git指令的时候只需要在终端中输入下面的指令下载git即可
      使用git指令的时候我没有仔细看openocd被装到哪个地方了,写笔记的时候已经把安装包删掉了,好像是放在用户主目录下面)
      这个很重要,下面配置openocd引导环境的时候需要使用
      然后需要安装openocd的相关依赖库,在终端中输入下面的指令:
      接下来要进入openocd安装包的目录(当然不进入目录也是可以的,只是要使用./),然后生成openocd的引导环境
      在终端中依次输入:
      以及:
      引导环境创建成功之后就可以使用make指令进行编译然后使用make install指令进行安装了,也就是在终端中依次输入:
      安装openocd的时候执行make install指令的时候一定要sudo,毕竟是安装一些东西,而且不是安装到当前用户的目录下的,而是安装到其他地方(这个路径也很重要,后面的配置需要用到):
      notion image
      如果没出什么问题的话,在终端中输入:
      就能查看openocd的版本信息了,如下图:
      notion image
      安装结束之后就可以将openocd的安装包删除了(这样可以节省点空间)。同样是在openocd的安装目录下,在终端中输入指令
  • 当然也可以在官网上进行安装,但是我自己没有尝试,所以就只在这里摆一个openocd的官网链接了)

安装arm-none-eabi-gcc编译链

这实际上是一个交叉编译链,在STM32CubeMX上生成的Makefile中就使用了这个编译链
  • 什么是交叉编译
    • 交叉编译(Cross compiling)是指在一个平台上进行编译,生成在另一个不同平台上运行的可执行程序或库文件的过程。通常,交叉编译用于开发跨平台软件或嵌入式系统。
    • 为什么需要交叉编译?主要有 3 个原因:
        1. 嵌入式系统开发:嵌入式系统通常运行在资源有限的硬件设备上,如嵌入式处理器、微控制器或单片机。这些设备通常不具备强大的计算能力和存储容量,因此需要在更强大的计算机上进行交叉编译,以生成适合嵌入式设备的二进制文件。
        1. 跨平台开发:在开发跨平台软件时,交叉编译可以简化开发流程。例如,如果你要开发一个同时运行在 Windows、Linux 和 macOS 上的应用程序,你可以在一种平台上编译应用程序,并生成可在其他平台上运行的可执行文件。
        1. 提高编译效率:有时候,主机平台上的编译器和开发环境可能更加强大和高效,因此进行交叉编译可以提高编译效率。通过利用更强大的计算机资源,可以更快地生成目标平台上的二进制文件。
        交叉编译器的命名规则通常遵循一定的约定,以便清晰地标识其适用的平台和体系结构。通常至少包括 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) 是一种为嵌入式系统设计的二进制接口标准,用于确保在不同的嵌入式平台上可移植性和互操作性。
  • 使用apt命令安装
  • 可以直接在linux终端中输入下面的指令安装编译链:
    • 但是我自己选择的是在官网上安装ARM GNU Toolchain
  • 官网安装
  • 先摆上一个官网链接:ARM GNU Toolchain
    • 实际上在VScode中Cortex-Debug插件的介绍中也给出了这个网址,说明Cortex-Debug是建议使用官网安装的(无端猜测)
      因为我使用的是ubuntu 22.04.3 LTS amd64,所以需要下载:
      notion image
      下载完成之后我是直接解压到用户的主目录下了
      然后需要进行环境变量的配置。如果不进行配置的话,也可以在cortex-debug插件的setting.json中进行设置,但是两个都没有的话就等着报错吧)
      这里我选择直接配到环境里面。
      在用户的主目录下打开终端,输入:
      在文件的最后加上:
      也就是在原来的环境变量的基础上加上编译链的bin目录。由于.profile文件是用户配置文件,所以当登录的时候都会执行一次,结果就是每一次登录的时候环境就自己配好了,并且不会影响到系统以及其他用户的环境变量。
      如果不出意外的话,这个时候在终端中输入:
      就将显示编译链的版本信息了:
      notion image

配置VScode

安装插件

需要安装的插件有两个
  • cortex-debug
  • c/c++
直接在vscode的插件里面搜索下载即可

配置json文件

  • 生成代码
  • 首先需要先使用STM32CubeMX生成一份代码。
    • 进入STM32CubeMX,点击File->New Porject之后,输入型号等信息后直接点击Create Code,然后在工程目录下将工具链修改成Makefile,如下图:
      notion image
      然后把该填的填上,直接生成代码即可
  • 创建一个json文件
  • 使用VScode打开STM32CubeMX生成的代码的时候里面是没有json文件的,这个时候就可以在VScode的debug界面中点击下图中的create a launch.json file,这样就可以在当前的工程目录下新建一个.vscode文件夹并创建一个json文件了
    • notion image
      因为之前从来没有配过vscode的json文件,就在这里浅浅谈一下json文件是干嘛的
    • launch.json是vscode用于调试的配置文件
    • 有一些json文件还能起到类似环境变量的作用。如在配置Cortex-debug的时候,官方给出的使用指南中给出下面这一段话:
    • cortex-debug.armToolchainPath - there are many versions of this for customization for each OS. This is the directory that contains all the GNU toolchain executables. There are many, and currently, we rely on gdb, objdump, and nm. Maybe different in the future.
      • You don't need this setting if all the GNU executables are already in your PATH and have the default prefix. If they are not in your path, then ABSOLUTE Paths maybe required.
      • 也就是说cortex-debug.armToolchainPath这个参数可以在环境变量中给出路径,也可以在插件的json文件中给出路径
  • 配置json
  • 参考网上的json文件配置,这里需要配置的参数有以下几个
    • name:这个参数应该是可有可无的,表示调试配置的名称,就设置成"Cortex Debug"了
    • type: 指明调试的类型,或者说是指明调试器的类型。需要设置成"cortex-debug"
    • request:表示调试请求的类型,可以是 "launch"(启动调试)或 "attach"(附加到正在运行的进程进行调试),这里选择 "launch"
    • servertype:指明是由谁提供调试服务的,选择"openocd"
    • cwd:工作目录,即程序的当前工作目录 "${workspaceRoot}"
    • executable: 可执行文件的路径,通过make指令创建的可执行文件是在build文件夹里面的,如下图:
      • notion image
        所以就设置成"./build/temp.elf"
    • device:指明设备,因为现在还在用综设的板子,所以设置为"STM32F401RE",
    • configFiles:设置文件,这个很重要,在openocd中是有提供的:
      • notion image
        在上图中的interface目录中有调试设备,也就是STLink的设置文件;在上图中的target目录中有目标设备,也就是STM32F401RET6的设置文件
        因为我并没有把openocd中的这两个目录配置到环境变量中,所以在这里设置json文件的时候需要写绝对路径,所以将configFiles设置为:
        最开始设置这个参数的时候遇到了一个小小的警告坑。我发现interface目录下有stlink-v2-1.cfg,这跟我们综设使用的STLink型号完全一样,所以我最开始配置的时候STLink的配置文件选择的是stlink-v2-1.cfg,但是运行的时候终端的输出中就藏了一个警告:
        是说stlink-v2-1.cfg这个配置文件已经过时了,需要换成stlink.cfg。
    • svdFile: 这个参数为debug时查看STM32上的寄存器提供了支持,可以在下面的github仓库中找到:STM32-svd
    • 直接使用git clone指令复制到本地就好了。
      • 在下载下来的文件夹里面就能够找到综设使用的STM32F401的svd文件了
        notion image
        所以将svdFile设置为:
    • runToEntryPoint:表示程序的入口点,设置为"main",

调试

安装GDB以及编译链的配置

经过上面的准备步骤之后,本以为就大功告成了,结果运行的时候出现:
notion image
发现原来的编译链里面好像是没有GDB的(我已经将编译链配置到环境变量中了)
这个时候根据网上的教程,就需要在终端中输入:
ncursesw是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面,与Linux内核的配置有关。
此外网上说这个编译链还需要py3.8支持,但是ubuntu 22.04.3 LTS amd64上自带的py是py3.10,所以还需要安装一个py3.8,并且不能让这两个py出现冲突,也就是需要让这两个py版本并存
根据网上的教程,安装py3.8的步骤如下:
  • 更新系统软件
  • 在终端中输入下面的指令:
    • 安装GCC编译器
    • 实际上linux是自带了GCC编译器的,可以在终端中输入:
      • 如果已经安装了gcc,那么就能看见gcc的版本信息了:
        notion image
        如果显示gcc不是一个指令的话,就说明没有安装gcc,此时需要在终端中输入:
    • 安装其他依赖
    • 需要在终端中输入:
      • 根据知乎吧主所说的:
        Python 的部分功能依赖于对应的库(如 OpenSSL、SQLite3、LZMA 等),如果在编译时未能找到这些库,仍然可能完成编译。此时的 Python 解释器看似可以工作,但在需要使用特定功能时就会出问题。例如 OpenSSL 出现问题会导致无法正常使用 pip。故建议按本节提示安装所有可选依赖项,并在下一节编译时仔细检查有无报错信息。
        但是我目前还没有遇到这些问题
    • 下载源代码
    • 直接在官网上下载对应版本的py就好了,我下载的是py3.8.12。官网:python下载
    • 配置
    • 需要进入安装包的目录,然后在终端中输入下面的指令:
      • 知乎吧主在这里使用了三个可选项,含义如下:
      • -enable-optimizations:用 PROFILE_TASK 启用以配置文件主导的优化(PGO)
      • -with-lto:在编译过程中启用链接时间优化(LTO)
      • -enable-shared:启用共享 Python 库 libpython 的编译
      • 配置通过之后,就会生成Makefile,这个时候就能通过make指令进行编译安装了
    • 编译
    • 在安装包的目录下,在终端中输入:
      • 就可以进行编译了。但是经过我的实操,发现这玩意编译真的久,所以还是建议按照知乎吧主的方式多分配几个CPU:
        按照吧主的提示:
        编译结束后,注意仔细查看一下输出,检查可能存在的错误:
        如果出现类似如上的警告,说明编译时有部分软件包不可用,导致编译出的 Python 有部分可选模块不可用。检查上一节中提到的依赖是否都已安装,或求助于网络搜索引擎,安装对应软件包后再次编译即可。
        但是我还是没遇到......
    • 安装
    • 只需要在终端中输入:
      • 根据Makefile里面的提示:
        If you have a previous version of Python installed that you don't want to overwrite, you can use "make altinstall" instead of "make install".
        所以为了保证原有的py3.10还能用,就需要使用altinstall
    • 链接动态库
    • 输入指令:
      • 使用
      • 如果上面的所有步骤都没有出错的话,这个时候在终端中输入:
        • 将输出:
          notion image
          py的安装就大功告成哩。
      此时在终端中输入:
      就将提示gdb的版本信息:
      notion image
      至此gdb就安装成功哩。

      STLink驱动

      如果使用的是WSL的话,实际上是需要安装usbipd的:
      notion image
      但是因为我使用的是虚拟机,而VMware已经考虑到了这个问题。所以当主机连接上可移动设备的时候,我可以在VMware中配置这个可移动设备是连接在主机上还是连接在虚拟机上,就相当于我有一台linux主系统的机器了。
      在VMware界面中点击虚拟机选项
      notion image
      然后点击可移动设备,在选择usb设备即可实现usb设备与主机和虚拟机之间的连接切换了。
      此时在linux上就能看见连接上了usb设备了
      notion image
      并且在终端中输入指令:
      也能查看虚拟机连接的usb设备的信息:
      notion image

      调试与烧录

      调试

      当我准备开始调试的时候,又出现了下面这个问题:
      notion image
      这里说gdb服务器意外退出,并且在终端中可以查看详细信息。
      在终端中显示下面的信息:
      notion image
      所以我就尝试着看着这个报错改
      在一个帖子的评论区我发现了这个问题的解决方法:
      • 在终端中打开文件夹/etc/udev/rules.d
      • 下载 openocd 规则
      • sudo wget https://raw.githubusercontent.com/raspberrypi/openocd/rp2040/contrib/60-openocd.rules
        • 确保文件 60-openocd.rules 现在位于 /etc/udev/rules.d 中
      • 添加组plugdev到您的用户
      • sudo usermod -a -G plugdev
      • 重新启动Linux。
      然后就可以正常打断点进行调试了

      烧录

      我发现使用这一套工具的时候,就只能debug,但是我想只烧录程序要怎么办呢?
      实际上我只使用了openocd的调试功能。openocd还支持使用telnet协议进行程序的直接烧录。只烧录程序有下面两种方式:

      使用端口连接方式

      • 将openocd连接到硬件调试器
      • 在命令行中输入:openocd -f <接口配置文件> -f <目标芯片配置文件>
        • 这里的配置文件实际上就是json文件中的.cfg文件。以我自己的配置为例,就应该在终端中输入:
          在输出的信息中,有提供telnet的端口号(这里使用telnet端口连接):
          notion image
      • 连接端口
      • 在命令行中输入:
        • 输入命令:halt,目标芯片挂起,相当于关机
        • 输入命令:flash write_image erase <要下载的文件> <目标地址>,将文件下载到目标芯片flash。注意这里需要下载的是bin文件,也就是二进制文件;而目标地址,对于综设使用的板子,需要下载在flash的位置,也就是0x08000000。如果不写目标地址的话就默认是从0x00000000开始的。
        • 输入命令:reset,目标芯片复位
      这样程序就成功烧录到板子上了。但是这样要输入三四条指令,感觉不太方便,所以有下面这种方式

      直接下载方式

      以我自己的配置为例,直接在命令行中输入:
      即可实现一行下载
      贴主对上面的一些参数做出了一点解释:
      • openocd -f /usr/local/share/openocd/scripts/interface/stlink-v2-1.cfg \ -f /usr/local/share/openocd/scripts/target/stm32f4x.cfg用于连接OpenOCD
      • c表示要执行的选项,-c init 用于初始化
      • c "reset halt; waithalt; flash writeimage erase /home/shinuohui/code/test/temp/build/temp.bin 0x08000000" 表示执行命令,其中 reset halt; wait_hal 先停止单片机 (分号不能少),这句非常重要
      • c reset -c shutdown,表示复位单片机,且退出OpenOCD
      不难发现直接下载方式就是把上面的端口方式中的所有指令合在一起了,同样也是先链接openocd,然后停止单片机,烧录程序,复位单片机。唯一的不同就是这种方式不需要再链接端口了,并且只有一条命令,这样就可以在Makefile里面将这个指令定义成伪目标了。
      在这两种方式中都出现了一个erase参数,字面意思就是擦除的意思。在网上我没有查到相关的信息,只能通过枚举的方式来判断这个erase参数是不是控制烧录程序前是否要进行自动擦除。
      枚举情况如下:
      情况
      结果
      第一种方式 ,有erase参数 ,测试不闪灯代码
      成功写入,不闪灯
      第一种方式 ,有erase参数,测试闪灯代码
      成功写入,闪灯
      第一种方式,无erase参数 ,测试不闪灯代码
      成功写入,不闪灯
      第一种方式,无erase参数,测试闪灯代码
      成功写入,闪灯
      第二种方式,有erase参数,测试不闪灯代码
      成功写入,不闪灯
      第二种方式,有erase参数,测试闪灯代码
      成功写入,闪灯
      第二种方式,无erase参数,测试不闪灯代码
      成功写入,不闪灯
      第二种方式,无erase参数,测试闪灯代码
      成功写入,但是不闪灯
      结论如下:
      • 第一种方式的erase好像没有什么用
      • 第二种方式的erase方式决定了写入的时候是覆盖写入还是追加写入
      所以之后只烧写程序的时候就使用第二种方式,然后带erase参数就好了
      在进行烧录的时候还遇到了一个问题,就是我在尝试能不能烧录16进制文件的时候发现地址错误:
      notion image
      如上图,写入的地址与我设置的地址不同,但是因为二进制文件能进行烧录,所以我也没有继续深究了。

      参考

       
      Paper2PX4
      Loading...
      Noah
      Noah
      永远年轻,永远热泪盈眶
      公告
      ❗❗复习笔记问题❗❗
      由于兼容性问题
      导入md文件可能导致了一些格式错误
      🌹如发现格式错误,请联系我~🌹
      🌹如博客内容有误也欢迎指出~🌹