《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]

Posted Bruceoxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]相关的知识,希望对你有一定的参考价值。

笔者在前面写了Windows版的开发环境搭建,今天来了Linux版本的。

好了,言归正传,接下来说说STM32的开发都需要那些软件吧,而且都是开源免费的,随便你玩!

(1) STM32CubeMX:STM32CubeMX是一个配置STM32代码的工具,用于生成带makefile的HAL库工程。注意STM32CubeMX是依赖Java的,所以要确保你电脑上安装了JRE。

(2) VSCode:超好用的编辑器,支持Windows、Linux、Mac,关键还免费,可谓业界良心了。

(3) GNU Arm Embedded Toolchain:ARM用的GNU工具链,包括编译器(gcc),调试器(gdb),链接器(ld)和其它工具,支持Windows、Linux、Mac。

(4) OpenOCD:一个开源的片上调试器(Open On-Chip Debugger)。

1准备工作

1.1更新软件源

更新软件源:

$ sudo apt-get update wget

安装git工具:

$ sudo apt-get install git

1.2安装 Oracle Java 8

ST的产品是基于Java开发的,因此需要java运行时环境(JRE)。这里就提前安装好。

方法一、自动安装

$sudo add-apt-repository ppa:webupd8team/java
$sudo apt update
$sudo apt install oracle-java8-installer

设置为默认 JDK

sudo update-java-alternatives -s java-8-oracle

方法二、手动安装
oracle Java官网下载地址

(以jdk-8u261-linux-x64.tar.gz为例)

a.创建目录:

$sudo mkdir /usr/lib/jvm

b.解压缩到该目录:

$sudo tar -zxvf jdk-8u261-linux-x64.tar.gz -C /usr/lib/jvm

c.修改环境变量:

$vi ~/.bashrc

在文件末尾追加下面内容:

#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_261 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH  

使环境变量马上生效:

$source ~/.bashrc

d.将此 JDK 注册到系统中

$sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_261/bin/java 300

e.查看java版本,看看是否安装成功:

$java -version

如果你安装了多个版本的jdk,你可以通过以下命令在这些版本之间切换:

$sudo update-alternatives --config java



2 STM32CubeMX软件安装与使用

2.1 STM32CubeMX安装

2.2.1 STM32CubeMX下载

首先去ST官网下载STM32CubeMX。

STM32CubeMX下载地址

下载后,解压压缩包,会有如下四个文件。

其中有三个文件分别对应三个操作系统平台。
├── SetupSTM32CubeMX-6.0.1.app # MacOS 安装
├── SetupSTM32CubeMX-6.0.1.exe # Windows 安装
└── SetupSTM32CubeMX-6.0.1.linux # Linux 安装

在 Ubuntu 中,执行如下命令即可安装

$sudo ./SetupSTM32CubeMX-6.0.1.linux

SetupSTM32CubeMX-6.0.1.app文件夹是MAC系统的安装包,SetupSTM32CubeMX-6.0.1.linux是Linux系统的安装脚本,安装时需要将整个压缩文件放在Linux系统中的某个目录下按安装,Linux系统安装时其实调用的SetupSTM32CubeMX-6.0.1.exe文件,因此需要将SetupSTM32CubeMX-6.0.1.exe和一同放在Linux系统才能进行安装,SetupSTM32CubeMX-6.0.1.exe是Windows的安装包。

笔者使用的Ubuntu16.04系统。不管任何系统,除了初始化安装方式不一样,安装过程都是一样的。好了,我们开始安装吧。

2.2.2 STM32CubeMX安装步骤

接下来正式开始安装。

同意许可声明,然后点击“next”。

同意ST privacy and Teams of use,点击“next”。

选择安装路径。

接下来就是开始安装。

等待安装完成。


最后点击‘Done’即可。

【注】安装时需要将所有文件en.stm32cubemx_v6-0-1.zip压缩的所有文件放在同一目录。
安装后默认在/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/bin目录下,运行STM32CubeProgrammer即可:

$ ./STM32CubeMX

创建快捷方式:

$sudo vim  /usr/share/applications/STM32CubeMX.desktop

接下来,再浏览文件夹/usr/share/applications,有STM32CubeMX.desktop文件,现在可以在快捷方式中打开软件。

可将其拖到右侧。

2.2 HAL库安装

2.2.1 HAL库在线安装

打开安装好的 STM32CubeMX 软件, 进入库管理界面(Help -> Manage embedded…),会有一个列表, 勾选上你要安装的HAL库, 点击“Install Now” 直到安装成功。 如下图:

这种方式比较简单,需要联网在线下载,可能需要等待一段时间。如果刷新之后,可以看到最新版本,以及一些老版本HAL库。

等待安装完成即可。

2.2.2 HAL库离线安装

离线安装的前提是需要下载好离线包,方法有两种:1.从库管理界面直接导入离线包。2.直接解压离线包到指定路径下。

方法1.导入离线包

方法2.直接解压

先在Help -> Updater Settings设置HAL库路径

直接解压HAL库离线包,放在前面设置的库路径下。

2.3新建工程

接下来从选择自己型号MCU,到生成代码并成功运行的创建过程。

1.打开STM32CubeMX,进入MCU选择器

进入选择器时会联网更新数据库,可能需要等待一下。

2.选择对应型号MCU

【注】第一次使用某单片机,在点击生成代码以后,如果没有相应的固件,STM32CubeMX软件会提示需要下载固件,点击确定即可在线下载。保持联网,在线安装很快,当然也可先安装HAL库,参见上一节内容。

3.时钟源选择

如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC(如下图)。如果使用默认内部时钟(HSI),这一步可以略过。

4.选择GPIO(LED)引脚

我这里使用一个GPIO引脚(PB0)控制LED亮灭。

以点亮LED为例。在我的电路中,LED1连接的引脚是PB0,我把引脚PB0设置为输出。

5.配置时钟Clock

STM32CubeMX配置时钟的界面非常方便,有很多提示(比如最大时钟),很多地方直接点击选择就行了。默认高速时钟是使用内部(HSI),而且CPU时钟配置的比较低。以我选择的STM32F103,外部8M晶振为例(如下图)。

6.工程管理

工程管理器的内容比较多,大部分都默认即可,这里讲述几个要点(如下图)

以上操作就基本配置完成了一个简单的Demo工程,Toolchain/IDE 选择 Makefile,通过 STM32CubeMX 生成 Makefile 工程。

7.生成工程
最后只需要点击“生成代码”即可。

最后工程目录如下:

8.添加代码

当然,以上生成的代码还不够完善,需要添加自己的应用代码。添加在主函数添加一下应用代码:

HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);

【注】

1.延时500ms时间需要你时钟配置正确。
2.LED对应引脚需要与你开发实际一致(本文以PB0为例)。

3 GCC编译工具

编译代码需要编译器,Linux系统的编译器是GCC,GCC编译的程序只能在X86上运行,不能运行在嵌入式的硬件平台,因为嵌入式平台大都是ARM体系结构,因此这就需要一个在Linux环境下能使用GNU编译ARM体系结构的编译工具,这也就是交叉编译工具

所谓交叉编译工具就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行

做过嵌入式开发的朋友都知道,在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台

嵌入式开发流程大致就是在宿主机完成目标的开发工具,使用功能交叉编译工具生成固件,将固件烧写到目标机,在开发初期,还需要在线调试等工作,这就需要诸如J-link等调试工具。

STM32属于ARM体系结构,在Linux环境下开发也需要借助交叉编译工具。

gcc-arm-none-eabi就是一个基于ARM的交叉编译工具链,而且还是开源的,适用于Arm Cortex-M和Coretex-A系列处理器,包括GNU编译器(GCC),以及GDB,不仅适用于Linux,还适用于Windows,MacOS上的交叉编译。

好了,直接看下载地址吧。

GNU-Toolchain下载地址

【注】这里要选择GUN-RM下的工具,GUN-A是Cortex-A系列的交叉编译工具。

接下来就是开始安装配置交叉编译工具链。

1.拷贝gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2到虚拟机中的/opt/目录下。

2.解压gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2,用tar命令。

$sudo tar -xvf gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2 //必须用超级用户模式

3.编辑~/.bashrc文件。

#vi ~/.bashrc

在文件最后增加一行

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

保存退出

4.运行 source ~/.bashrc 让文件生效

5.检查

方法一:
在命令行下输入 arm-n然后按tab键看会不会自动补全

方法二:
输入:arm-none-eabi-gcc -v

表示配置成功!

【注】
我们有时候输入arm-none-eabi-gcc -v 会提示
bash: /opt/gcc-arm-none-eabi-10.3-2021.07/bin/arm-none-eabi-gcc -v: No such file or directory
问题是32位于64位不兼容造成的。

解决方法如下:

$sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

再执行arm-none-eabi-gcc -v,会有如下信息,说明OK了。

4 Visual Studio Code安装与配置

4.1 Visual Studio Code安装

1.根据使用的操作系统,直接从 Visual Studio Code 官网下载安装最新版。

Visual Studio Code 下载地址

安装很简单,将code_1.59.1-1629375198_amd64.deb拷贝到Ubuntu中。

$ sudo dpkg -i code_1.59.1-1629375198_amd64.deb

安装完成后,在文件夹/usr/share/applications有Visual Studio Code快捷方式文件,可将其拖到侧边栏,就可以在快捷方式中打开软件。

打开界面如下:

2.打开 VS Code,点击 “Extensions” 图标,搜索 C/C++ 插件(由 Microsoft 提供),点击安装。

3.安装中文插件。

重启应用,Visual Studio Code就是中文界面了。

4.2安装EIDE

在 VS Code 的扩展应用商店搜索 EIDE, 并下载安装。

安装成功后, 在左侧应用栏就能够看到一个类似于 CPU 的图标, 表示安装成功。

接下来就是配置 EIDE。点击 VS Code 左下角【管理】, 并选择【设置】选项, 进入VS Code 设置界面。

在用户设置-扩展-Embedded IDE中, 需要更改的配置如下 (路径相关设置 根据自己实际情况 进行设置)。

ARM.GCC:Install Directory:/opt/gcc-arm-none-eabi-10.3-2021.07
ARM.GCC:Prefix:arm-none-eabi-

4.3创建新的工程项目

点击‘打开文件夹’,选择STM32CubeMX创建的工程路径。

最后打开的工程如下:

接下来就是配置工程。

VS Code只是一个编辑器,它检查代码的时候并不会去读makefile,因此有些宏定义需要自行配置。

新建c_cpp_properties.json配置文件,输入一下内容:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "/opt/gcc-arm-none-eabi-10.3-2021.0/arm-none-eabi/include",
                "${workspaceFolder}/Core/Inc",
                "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc",
                "${workspaceFolder}/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy",
                "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32F1xx/Include",
                "${workspaceFolder}/Drivers/CMSIS/Include"
            ],
            "defines": [
                "USE_HAL_DRIVER",
                "STM32F103xE"
            ],
            "compilerPath": "/opt/gcc-arm-none-eabi-10.3-2021.0/bin/arm-none-eabi-gcc",
            "intelliSenseMode": "gcc-x64",
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": "",
                "path": [
                    "${workspaceFolder}"
                ]
            }
        }
    ],
    "version": 4
}

name:这是用于标记使用的平台的标签。除了Linux还可以选Win32或Mac。也就是说,这个json里“configuration“下可以写三组配置,只要每组配置前面写上不同的平台,即可在不同的操作系统上使用就会自动适配不同的配置。

includePath:头文件路径。第一个目录是C语言标准库的目录, 剩下的几个目录直接从Makefile里复制然后稍微修改下即可。"${workspaceFolder}"表示项目文件夹;

defines:全局宏定义,这里的宏定义只写在源码中。在MDK是通过配置Project Options里的全局宏定义的。

compilerPath:编译器的路径。

intelliSenseMode:因为我用的是gcc所以选gcc-x64。

browse:源文件搜索路径。用来做代码补全和查找定义的。这个路径和includePath不同,browse.path是自动递归所有子目录的。而include.path默认只看本目录。

c_cpp_properties配置说明

新建tasks.json文件,如果没有则需要创建tasks.json文件,内容如下:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "build",
                "type": "shell",
                "command": "make",
                "args": [
                    "-j4"
                ] 
            },
            {
                "label": "clean",
                "type": "shell",
                "command": "make",
                "args": [
                    "clean"
                ] 
            }
        ]
}

这个文件创建了两个任务,分别叫做build和clean,build任务就是在bash里执行了make -j4,也就是使用多线程编译,clean任务就是在bash里执行了make clean。

Tasks配置说明




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


欢迎订阅我的微信公众号

以上是关于《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]的主要内容,如果未能解决你的问题,请参考以下文章

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 3]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 3]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Windows版 - 2]

《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Windows版 - 2]