目录
- 我与 STM32CubeIDE
- STM32CubeIDE 安装
- STM32CubeIDE 配置介绍
- *STM32CubeIDE 进阶配置
- STM32CubeIDE 编程,编译以及烧录
- *STM32CubeIDE 中 FreeRTOS 的导入
我与 STM32CubeIDE
最开始学习 STM32 是用 Keil 的开发方式,但是由于我的 MacOS 无法安装 Keil 因此尝试去寻找替代的软件,阴差阳错找到了 ST 公司推出的 STM32CubeIDE。深入了解一番后发现 STM32CubeIDE 继承了 STM32CubeMX 的可视化快速配置,并且淘汰了传统的标准库,取而代之的 HAL 库则是将硬件抽象化,方便不同芯片类型的移植,因此整个编程的重新从硬件配置逐渐转移到专注于软件功能和算法的实现。
虽然对于像我一样的小白而言,IDE 提供的编程体验还是比较简单容易上手的,但是相应的缺点是国内的相关的系统性的资料挺少的,遇到问题只能去各大论坛网站和个人博客中去寻找解决方法。我在这个过程中前前后后走了许多弯路,创立博客之初既是为了总结归纳所学的东西,也是希望其他人能够避免走我走过的弯路。
STM32CubeIDE 安装
STM32CubeIDE 是一款免费的软件,我们可以直接进入 [ST官网](STM32CubeIDE - STM32的集成开发环境 - STMicroelectronics) 进行下载,MacOS、Windows 以及 Linux 等均支持下载安装。
MacOS(11.4)安装
下载对应的版本,双击运行开始安装。如果提示安全问题,可以在 系统偏好设置-安全性与隐私 中确认打开。安装后就可以双击点开 IDE 看看界面。
PS:
- 如果 MacBook 是 M 系列芯片的话,根据官方的回答是 IDE 可以通过 Rosetta 转译运行并且没有明显的 BUG,所以不用担心 IDE 的适配问题。
- 由于 MacOS 系统的大版本软件安全签名不大一样,因此尽量保持最新的 MacOS 系统,如果是旧版本的,官方也提供了旧版本的下载。如果仍遇到无法安装的情况可以搜索一下解决方法,这里不多赘述。
Windows10 安装
下载对应的安装包,安装包需要放在一个 没有中文 的路径下 以管理员身份打开 ,推荐按照默认的安装位置安装。安装后就可以双击点开,如果遇到了开始界面无法显示的问题或者弹出浏览器却无法加载出来时,需要检查是不是 以管理员身份打开 的(最开始没有注意到这个卡了半天。。。)
STM32CubeIDE 配置介绍
下面介绍一下 STM32CubeIDE 的基本功能,以下演示的系统环境为 Win10。由于已经用习惯了,所以就没有汉化。如果需要汉化的话可以上网搜一下类似的教程,十分简单。
下面将简单介绍一下项目创建以及功能配置,在学习使用这些功能时,我个人比较推荐的做法是先去网上找一找相关的配置(尽量找和你硬件一样的),先跟着他们配置把功能跑起来。在之后的学习中在逐渐深入原理。最后达到会根据数据手册来配置这些参数就可以了。
创建项目(Start a new STM32CubeIDE project)
双击打开后就可以看到 工作区选择(Workplace):
注意这里的路径不可以有中文出现,不然后续的编译会显示错误。选择后点击 Lauch 进入。
不出意外的话,我们能够看到这引导界面:(如果遇到这个界面无法显示,请检查是不是 以管理员身份打开)
左边一栏中,从上到下分别是创建新工程、在已有的配置文件(.ioc)创建工程、导入工程以及导入例程。
我们点击创建新工程,就会出现芯片选择界面:
这里可以选择你使用的芯片(同个系列的芯片有很多型号,他们主要区别在于封装不同以及内部存储 Flash、Ram 可能不同,所以需要根据具体的型号进行选择)
Tips:可以善于利用收藏⭐️ 功能,收藏几款常用的芯片以后就不用慢慢找了。
选择好芯片后我们就可以点击右下方 next 下一步:
填入我们的工程名称,选择编程语言后就可以点击 Finish 创建工程了。
下面是配置的界面:
在左边我们可以看到这是一个可视化的界面,在上方做从到右分别是用于引脚配置、时钟树设置、项目管理和工具选项。
引脚功能配置(Pinout & Configuration)
在这个页面下,我们可以进行引脚的配置。左边 Category 中我们可以看到有很多的分类。下面简单梳理一下:
-
System Core:主要用于配置和管理系统的功能。例如 MPU 核心设置,DMA 配置和管理,GPIO 设置管理,NIVIC 中断管理,RCC 时钟源管理,SYS 系统设置以及看门狗管理。
-
Analog:主要是用于配置一些有关数模转换的设置,例如 ADC、DAC 设置
-
Timers:主要配置一些定时器相关的配置。例如低功耗定时器、RTC、普通和高级定时器。
-
Connectivity:配置一些通信接口(配置只提供芯片相关引脚的启用,具体硬件的实现需要有外设的支持),例如 CAN、FMC、I2C、SPI、UART 等通信接口。
Tips:这个部分的设置和芯片型号有直接关系,演示用的 demo 使用的是 STM32H745 系列,通信接口会比 F407 的接口多一些。
-
Multimedia:用于配置媒体功能相关设置
-
Security:用于配置安全性能,这里提供随机数生成器 RNG
-
Computing:用于配置计算相关设置。这里提供 CRC 校验功能
-
Middleware:这里可以配置 FATFS,FreeRTOS 等
Tips:
如果在配置的时候发现选项变黄或者前面多了个 ⚠️ 不用担心,这个没有出错,出现警告的意思是告诉你支持这个功能的所有引脚中有几个已经被其他功能使用了。如果你继续选用此功能,系统会自动帮你寻找一个代替的引脚组合。
如果有红色出现则表示当前找不到替代的引脚,需要检查一下之前的配置是不是正确的。
除了直接在 Category 中配置以外,我们还可以直接点击右侧芯片的引脚来设置功能,通常 GPIO 输出输出用此方式设置。还可以使用 ctrl+click 点击已经设置的功能引脚查找相关代替的引脚。
最后需要记住,无论配置什么功能,最开始系统都是给个默认的引脚组合,如果和你硬件上连接的接口不一致你也无法通过编程来实现功能。因此养成结合你的实际硬件情况来检查和配置引脚的习惯是十分必要的。
时钟树配置(Clock & Configuration)
这里可以比较直观的配置我们的时钟,亮的地方我们可以进行配置,如果出错我们会看到提示。灰色的部分表示目前系统中没有调用这些时钟,当我们打开相关的功能后才会从灰色变亮。
工程管理(Project Manager)
在工程管理中我们可以看到工程相关的设置:
-
Project:工程名、位置、编译工具链、堆栈设置等,这些一般是采用默认就可以了。
-
Code Generator:一些代码生成的设置,同样一般保持默认就可以了。
其中在我有时候会将 Generated files - Generate peripheral initialization as a pair of ‘.c/h’ files per peripheral 勾上,这样生成出来的代码会将外设功能单独形成一组 ‘.c/h’ 文件,在编写驱动和驱动管理时是很实用的。 -
Advanced Settings:目前来说没用仔细研究过,默认就好了。
在完成配置后,我们就可以点击上方选项栏中的 Project-Generate Code 生成我们需要的配置代码了。
* STM32CubeIDE 进阶配置
除了上述的基本配置功能之外,ST 公司还推出了一些附加的软件功能包,例如 X-CUBE AI、X-CUBE-ALGOBUILD、 X-CUBE-TOUCHGFX等。
Software Packs 软件包管理
在 Pinout & Configuration 页面下,在可视化界面的上方可以看到 Software Packs,点击之后可以看到 Select Components 和 Manage Softeware packs。默认情况下,附加的功能组件包是没有安装的,因此我们需要点击 Manage Software packs 来下载相关的软件包组件。在下载之后,我们就可以在 Select Components 中启用。这里以 TouchGFX 为例介绍一下过程。
- 首先我们打开 Manage Software Packs,找到 X-CUBE-TOUCHGFX,点击所需要的版本,如果没有安装则点击后,下方 Install Now 会亮起,你需要先点击安装。安装之后点击就可以看到绿色亮起表示可以调用。
- 然后我们点击 Select Components 选择软件包,找到对应的软件包,点击启用即可。
- 返回页面后,我们可以看到左边 Category 中多了一个选项-Software Packs,子目录中就出现了我们杠杆该选择的 TouchGFX,这样我们就成功地调用了软件包。
类似的,其他软件包也是通过同样的方法进行安装调用。
STM32CubeIDE 编程,编译以及烧录
STM32CubeIDE 是基于 TrueStudio 的,因此很多插件的安装也类似,比如汉化的功能。这里简单介绍一下如何使用 STM32CubeIDE 来进行软件的开发和烧录。
如果之前接触过 Keil 的开发或者类似的嵌入式开发,我们都知道一个完整的代码功能首先需要先初始化配置和接口,然后才是进入软件开发。而采用 STM32CubeIDE 或者 STM32CubeMX 进行代码生成则把第一步给简化了,我们只需要在可视化界面上先做好配置,生成的代码就包括了引脚和功能的初始化,因此我们直接进入了软件开发。
代码编写以及 HAL 库使用
生成代码后,我们打开 “main.c” 文件,可以看到软件已经帮我们生成了代码。初始化的代码包括相关头文件和源文件的生成,引脚时钟的开启和引脚的初始化以及对我们配置的功能的初始化,我们可以直接开始软件开发了。这里需要注意的是当我们添加代码的时候,需要把代码放在特定的位置:
1 | /* USER CODE BEGIN */ |
如果添加在这个范围之外,那么我们再一次生成代码后,系统就会刷新掉除了用户代码之外的部分,这样你的代码在重新生成后就会消失。因此我们需要把代码放在这个区间中。
关于 HAL 库的学习其实没有想象中的那么困难,HAL 库的命名方式还是比较清晰的,如果读者之前使用过标准库开发过,那么只需要记住关键词然后在工程搜索相关的代码就可以在库中找到对应的函数。第二种方式是直接打开 Driver-STM32XXXX_HAL_Driver
文件夹查找手动查找。第三种方式是就直接上网搜相关的例程或者博客来看看,也能快速学会把 HAL 库用起来。
Tips:
STM32CubeIDE 比较方便的在于它的代码补全功能并不是像 Keil, VS 一样是实时显示的,而是需要使用快捷键
Alt + /
来实现。笔者一开始都是记住函数名的,直到一次机缘巧合才知道这个快捷键可以调出代码补全 QAQ。
从工程外部添加文件
有时候,把别人的代码例如驱动、算法拿过来跑一跑也是一种学习的方式。这个时候就需要将别人的文件加到我们的工程之中。
- 首先我们把我们所需要的文件放入工程文件夹中,然后返回 IDE,我们刷新一下列表可以看到我们刚刚加入的文件已经显示了,但是目前它虽然已经在了,但是编译器还不认识它。
- 我们右键我们的工程,打开偏好设置
Properties
,选择C/C++ Genernal
-Paths and Symbols
,在 Includes 中添加头文件所在的文件夹,然后再 Source Location 中添加源文件所在的文件夹。点击确认后就成功把文件加到我们的工程中了。
Tips:
如果是使用原子哥的代码,如果不加入他们的 sys 文件夹,则需要自己修改一下代码中的延时函数以及 u8,u16等关键字。
ST-Link 内部 Flash 烧录
安装 STM32CubeIDE 时就会安装 ST-Link 的驱动,我们可以点击右上方 help-ST-Link 更新 来更新一下固件(如果没有更新,在首次烧录时,会提示更新)
这里在介绍一个烧录方法,就是使用 STM32CubeProgrammer 进行烧录。这个方式以后还可以进行外部 Flash 的烧录。
外部烧录算法 的制作和使用可以参考 [STM32CubeProgrammer 外部 Flash 烧录算法制作](https://chrisz-nju.github.io/Quark/2021/08/13/STM32CubeProgrammer 外部 Flash 烧录算法制作/)
* STM32CubeIDE 中 FreeRTOS 的导入
(未完待续)