type
status
slug
date
summary
tags
category
password
icon
10-17:VSCode 开发STM32环境配置 (建议Linux环境/WSL 均可)
Steps:
- 使用OpenOCD 下载代码
- 使用VSCode 对 代码打断点调试
- 配置PX4本地编译环境,编译PX4 固件
- 使用OpenOCD 调试PX4固件 (TODO)
参考资料:
先了解一下openOCD工具是什么:
开放式片上调试器(OpenOCD)旨在提供调试,嵌入式目标的系统内编程和边界扫描测试设备。
OpenOCD的功能需要调试仿真器来辅助完成,调试仿真器是一个提供调试目标电信号的小型硬件单元。常用的有Jink、STLink等
它还允许GDB调试:它允许ARM7(ARM7TDMI和ARM720t),ARM9(ARM920T, ARM922T, ARM926EJ–S, ARM966E–S), XScale (PXA25x, IXP42x), Cortex-M3 (Stellaris LM3、意法半导
通过下面的OpenOCD架构图我们能更好的认识OpenOCD。
可以看出OpenOCD提供了GDBServer,可以通过它进行GDB相关的调试操作。
提供TeInet Server,可以通过Telnet连接对目标板进行烧录、重启等操作。
OpenOCD的配置基于TCL脚本,可以使用默认自带的TCL脚本,也可以编写自定义的脚本。
ok,可以开始下载一些程序上手了,因为自己用主机配置,做了内网穿透,所以就选择完整的Linux Ubuntu平台开发(WSL2的systemd命令用不了,而且权限管理和windows的容易搞冲突,有点麻烦)。
开始安装
OpenOCD烧录工具
打开终端直接安装就好,这样还能自动安装其他依赖包
我发现这个版本是0.11.0,官网上最新的已经是0.12.0了,差了一个大版本,所以就选择官网下载,手动编译安装:
参考:
完成了。
注意安装位置在/usr/local/share/openocd/
在进行后面之前,想说明一个概念:什么是交叉编译:
交叉编译(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) 是一种为嵌入式系统设计的二进制接口标准,用于确保在不同的嵌入式平台上可移植性和互操作性。但是:gcc-arm-none-eabi ubuntu的官方已经停止维护了,找到一个博客
用的gdb-multiarch,但是只是解决了gcc-arm-none-eabi里面没有gdb的问题。
我看到他还用直接官网下载的方式,这个靠谱,就按照这个做了。
我们下载好过后解压到/opt目录,这个目录的作用如下:
(主要存放可选的程序。想删掉程序的时候,你就可 以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。)
来源:
记得一个copy命令来移动,因为/opt目录需要sudo权限。
解压文件的命令也要学哦,我下载的文件压缩方式是:xz,
ls -lh可以更人性化的显示文件的大小,让你看得更清除。
然后添加环境变量:
我这里也遇到了gdb的问题:
,这里暴雷了,arm-gnu-gdb更新太慢了,目前的我ubuntu22的python是3.10,而ubuntu20的才是3.8。这里有两个选择,一个是继续用22,手动下载python3.8,并且更改python的位置。我感觉这个办法有点糟糕。
还有一个博客看到了一点思路:
他选择的是一个全新的tool chain,
不过鉴于目前许多资料都是原来的,我目前还不打算初学的时候更换,所以我看到他还说,直接忽略这个gdb,换成gdb-multiarch
这里我分析了报错,加入一个环境变量,使用miniconda虚拟环境来满足python的需求:
有问题,这个全局变量是python的,我们换一种思路,改为给按照报错,他寻找了一个虚拟环境,我们对应创建即可
这个时候我先换成wsl2来玩玩,因为它是ubuntu20的,我先配一下内网穿透(软件用的tailscale,比较简单,就不介绍了):
起sshd服务的时候出了问题,下面是解决方法;
gdb一遍过:
在wsl2里面就需要安装 usbipd:
这里有个坑,纯纯傻逼微软,自己doc没有更新:
这个是微软官方doc,subcommand是错的:
下面这个issue解决了问题:
wsl subcommand removed - Docs say otherwise
Updated Aug 30, 2024
完成:
这里也是和官方doc不一样,不过看命令行提示以及mannual就能解决问题。
同样也是安装openOCD,注意安装目录:
OK,基本上完成,可以进入vscode配置环节;
正好这学期学了编译器,大概了解了一些llvm的东西,clangd这个语言服务器比gcc快太多了,搞上。
ubuntu上安装最新clangd
仿照前面下载arm-gcc,这里我们也把软件解压到opt目录,并加入bin到环境变量
这里有个不一样的,你可以直接用vscode下载clangd插件,然后它没有检测到clangd的时候会提示你下载,不过记得最后把下载到的内容的/bin目录加入环境变量。
clangd安装好了,不过对于工程项目,它需要使用一个compile_commands.json文件来实现项目代码跳转,代码补全等,cmake方法的话,只需要加入set(CMAKE_EXPORT_COMPILE_COMMANDS ON)或者cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1即可,但是makefile的解决方法一般是加入bear工具,参考知乎,不过我后面打算还是拿cmake写,makefile大项目写起来难受。
安装cortex_debug:
在vscode上安装,插件下载。
烧录部分需要查看板子的stlink引脚,方法在这篇博客有借鉴:
我在我们板子的硬件原理图上找到的是TMS和TCK:(是JTAG调试里面的名称)
TMS (test mode selection input):
- 意义:测试模式选择,用于控制JTAG的状态机转换。
- 作用:通过在每个TCK时钟周期上为TMS输入不同的值,可以改变JTAG状态机的状态,从而选择不同的测试或操作模式。
TCK (test clock input):
- 意义:测试时钟,用于同步JTAG接口上的操作。
- 作用:通过在TCK的上升或下降沿对数据进行采样和更新,实现JTAG接口上数据的同步传输。
然后JTAG的引脚是比较多的,我们的板子一般好像没有提供那么多,看看JTAG和SWD的区别:
主要是这个 图,TCLK就是SWCLK,TMS就是SWDIO,TDO就是SWO
我手里的是ST-Link:
ST-Link是STMicroelectronics公司推出的一款调试器,它支持STM32系列微控制器的调试和编程。ST-Link通过USB接口与PC连接,并可以通过调试软件(如ST-Link Utility)与目标板上的MCU进行通信。ST-Link支持多种调试接口,如JTAG和SWD等,并且它还可以用于芯片的编程和闪存的擦除等操作。
打算就用SWD调试接口了。
这里是硬件原理图,看到TMS(SWDIO)是PA13,TCK(SWCLK)是PA14。
TMS(SWDIO)是PA13,TCK(SWCLK)是PA14
找到对应部分,连线即可。
连接完成后,开始下载调试环节:
这个是看到一个gdb调试:
还有一个下载环节:
上面这个比较长的命令是使用openocd下载的命令,这个不太好,我这里只是阶段性的校验当前工作的准确性,目前完成了测试,到此已经可以下载烧录,使用clangd优化代码补全,成功点灯,接下来是配置vscode,并且探索debug功能,还有就是想办法把大二上期的代码移植过来,写一个makefile。
解析SVD的:
上面那个链接很多教程都说用来找svd文件,哥们研究半天也没找到svd文件在哪里,结果发现别人前几个月已经把data部分删除了,svd文件都没了,乐。
还有一个svd的仓库:
cmsis-svd-stm32
modm-io • Updated Aug 26, 2024
一个usb的问题:
Picoprobe with openOCD on RPI-400
Updated Nov 21, 2021
查看用户和用户组(所有):
向用户增加用户组
重启wsl。结果没用,还是下面这个文档有用!!!
在补上一条这个命令,这个是参考下面的问题搞出来的,就不需要重启wsl2
评价是:爽!
下面这个是嵌入式工作室刘学长的博客,偶然发现竟然是他的,给我提供了很大帮助这篇博客。感谢
- 作者:liamY
- 链接:https://liamy.clovy.top/article/linux/embeded/startup
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章