linux下STM32开发环境搭建

目录

参考: 

前言:

安装 JAVA 环境

安装STM32CUBEMX

获取gcc-arm工具链

编译STM32代码

安装openocd

安装GDB调试工具


参考: 

JAVA环境下载:Java SE Runtime Environment 

STM32CUBEMX下载:STM32CUBEMX

gcc-arm工具链下载1:gcc-arm-none-eabi

gcc-arm工具链下载2:gcc-arm-none-eabi

openOCD下载:openOCD

openOCD官方文档

GDB源码包--安装教程


前言:

        本文最终目的是在 ubuntu 16.04 系统下开发STM32。

        用到了 STM32CUBEMX 去生成带有 Makefile 的STM32基础工程,然后使用 gcc-arm-none-eabi-gcc 工具链对程序进行编译。再通过 openocd 加 CMSIS-DAP的方式连接到目标板(这里是一块STM32F103C8T6)加下载程序。最终使用 GDB 工具进行调试程序。 


安装 JAVA 环境

      实验安装旧版本的STM32CUBEMX是需要另外安装JAVA环境的,而新版本的STM32CUBEMX包不需要,猜测是自带了JAVA的环境。如果是安装较新版本的STM32CUBEMX,可以先尝试跳过这一步。

        JAVA安装包的地址详见文首“参考”项。下载 linux 版本的压缩包。将其放到 linux 系统下进行解压,注意你文件放的路径。

1:使用下面命令打开 profile

sudo vi /etc/profile

2:在 profile 文件最后添加如下代码,其中 JAVA_HOME 后面的路径写你解压包放的地方。 

 export JAVA_HOME=/home/XXX/jdk1.8.0_301
 
 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
 
 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib\

3:重启 linux 系统

4:输入 java -version ,若上述在 profile 中添加环境变量无误,就会出现相应的版本信息


安装STM32CUBEMX

        下载地址详见文首“参考”项,下载 linux 版本的包。注意上一步安装的 java 版本,不要将 CUBEMX 的安装包的版本选的太高,否则在安装过程中可能会出现java环境版本太低导致安装失败的情况。但如果是安装较新版本的自带java环境的STM32CUBEMX,则不需要考虑java版本匹配的问题。在这里我用的是 5.5 的版本。将其放到 linux 系统下进行解压。

        在解压包中找到 SetupSTM32CubeMX-5.5.0.linux,注意不同版本名称不同。执行下面命令,给与最高的权限

sudo chmod 777 SetupSTM32CubeMX-5.5.0.linux

        然后再运行 SetupSTM32CubeMX-5.5.0.linux

./SetupSTM32CubeMX-5.5.0.linux

        接下来的操作就和 windows 里面一样了。正常安装即可。安装完成之后在你的安装目录下就有一个名为 STM32CUBEMX 的 可执行的文件,正常运行就可以使用STM32CUBEMX了。


获取gcc-arm工具链

        下载地址详见文首“参考”项,我是在第一个地址下载,第二个地址上已经停止发布新版工具链了。后续版本仅在第一个地址上发布。

        将下载好的 gcc 包放到 linux 下解压。记下文件路径。执行以下命令打开 /etc/profile

sudo vi /etc/profile

         在文件最后添加如下代码,将工具链的路径置于系统的环境变量之下,注意不同版本的把路径中版本名替换掉。

export PATH=$PATH:/home/***/gcc-arm-none-eabi-10.3-2021.07/bin

        重启系统 linux 系统 

        输入 arm-none-eabi-gcc -v,正确安装就会显示出版本信息

        若遇到其它情况,可能是有些依赖没有安装,可以尝试下面两条指令安装。

sudo apt-get install lsb-core
sudo apt-get install lsb-core lib32stdc++6

编译STM32代码

        做好上述准备步骤之后,打开 STM32CUBEMX,选择芯片,配置参数生成代码,注意生成类型选择为 Makefile 类型。

        生成完后在工程目录中打开终端,输入make 即可对其进行编译。编译成功后就会生成 build 文件夹,里面就会有 .bin .elf .hex文件

        至于代码的编写,可以使用vim,也可以使用 vscode。网上有很多关于 vscode 的使用。


安装openocd

        openocd 可以在 linux 上运行并且支持几乎所有的 arm 调试器。下载地址详见文首“参考”项。解压之后进入目录输入如下命令进行配置

sudo apt-get install libhidapi-dev
/*因为 linux 上默认是没有 HID 设备驱动的,所以需先安装一个 HID 库*/

./configure --enable-cmsis-dap
/*因为我是用的 DAP 进行调试,所以要使能 DAP。可以不用输入 enable 相关内容,
这样就只会配置一些常见的调试器*/

sudo apt-get install libusb++-dev
/*若在 configure 时提示错误,找不到 usb.h,原因是没有安装 libusb 库,执行此语句安装*/

        等待配置完成后,就会弹出如下提示

 

         可以看到 CMSIS-DAP 这行是 yes 。

        然后再输入如下指令编译并安装

sudo make 
sudo make install

         在安装完成之后将 contrib 目录中的 60-openocd.rules 文件复制到 /etc/udev/rules.d目录下

 cp contrib/60-openocd.rules /etc/udev/rules.d/

        因为这个文件中包含了所有支持调试器的 USB 接口描述,还需要删除以前复制进入这个文件内的规则文件,比如 49-stlinkv1.rules 49-stlinkv2.rules 49-stlinkv2-1.rules 99-jlink.rules 等 ,没有就不用理会。

        重启系统来加载规则

        若安装成功则在 /usr/local/share/ 路径下会出现 openocd 的文件夹。其中在 scripts 文件夹下就会有 interface 和 target 这两个文件。分别是调试器的配置文件和目标芯片的配置文件。其中内容会在配置连接时用到。

        使用 DAP 连接上目标板使用如下指令

openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg

        上述是简写路径,openocd 会自动在其 script 路径下搜索脚本 ,连接成功后,会出现以下界面

        然后另外启一个终端,输入 telnet localhost 4444 用来连接 openocd,这个在上图中就有提示。

        然后输入如下指令,即可下载程序

halt  
/*挂起STM32,相关于关机,不执行halt,无法把程序写入到 STM32 的 FLASH*/

flash write_image erase /**/**/download.elf
/*写入镜像并预先擦除。写入支持的类型可以详见文首“参考”项的openOCD 文档*/

reset
/*复位STM32*/

        下载程序过程有些麻烦,但一般是用 GDB 调试程序,需要时才下载程序。


安装GDB调试工具

        GDB调试工具作为 GNU 编译器下标准的调试工具,在编写调试过程中会频繁被使用到。我实验过两种方式安装 GDB, 一种是下载单独的 GDB 源码包进行编译安装,详见文首“参考”项。第二种简单一些,在 gcc-arm 工具链中有 arm-none-eabi-gdb 的存在。我这里使用第二种方法。

        启动 GDB 进行调试之前,需要使用前面提到的 openOCD 连接到目标开发板。可以在上图倒数第二行看见提供了 3333 端口给 GDB。输入如下命令,即可将 GDB 与调试器连接上,同时 openOCD 端也会收到连接信息。

arm-none-eabi-gdb xxx.elf
/*加载调试文件并打开 GDB 程序*/

target remote localhost:3333
/*输入连接指令,连接到本地的 3333 端口*/

        接下来还需要输入如下代码来完成所有的初始化操作

monitor reset
/*monitor 意为向连接的外部软件发送指令,此处为向 openOCD 发送指令*/

monitor halt
/*挂起MCU*/

load
/*加载上述 xx.elf 文件,即下载到 MCU 的 flash*/

        接下来就可以正常的使用 GDB 进行调试了,具体的命令不做阐述。 

        上述使用 GDB 调试的步骤还是有点麻烦,但我们可以写一个 “.gdbinit” 的文件来简化每次连接输入的代码量。如下图,是我在 ".gdbinit" 文件中写入的内容。以后连接就只需要输入 arm-none-eabi-gdb xxx.elf 就好。GDB 会自动去执行 “.gdbinit” 中的文件。

target remote localhost:3333
monitor reset
monitor halt
load

        但在当前工程目录下写 “.gdbinit” ,在打开 GDB 程序时会出现以下问题

warning: File "/home/xyy/debug_test/base/.gdbinit" auto-loading has been declined by your `auto-load safe-path' set to "/usr/share/gdb/auto-load:/usr/lib/debug:/usr/bin/mono-gdb.py".

        观察 GDB 输出信息,发现是“安全路径保护”会禁止当前目录下的 “.gdbinit” 执行。有多种解决办法,这里说一种最方便的。在/home/xxx 目录下新建一个 “.gdbinit” 文件,在其中输入如下代码

set auto-load safe-path /home/xxx/你的工程目录中 .gdbinit 所在的路径

        这样就允许了你工程目录中 .gdbinit 的执行。

        还可以进一步减少连接 GDB 调试时的执行代码量,对于 arm-none-eabi-gdb xxx.elf 这条指令

,我们可以在工程的 Makefile 文件中以添加目标的方式来简化,如下 

debug:
    $(PREFIX)gdb build/xxx.elf

        其中 PREFIX 环境变量就是 “arm-none-eabi-”,后面的 build 是 STM32CUBEMX 生成 .elf 文件所在的目录。

        然后在终端输入 make debug 就可以加载调试文件并打开 GDB 程序,若前面关于 “.gdbinit” 的操作无误的话,就会自动执行连接到本地 3333 端口,然后 reset,halt,load程序。一步搞定。至于GDB的使用,网上有许多教程,这里就不赘述了。

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值