STM32CubeMX专案配置详细教学,点亮LED

想在这纪录一下我使用STM32CubeMX的经验适合完全没用过的人,已经有开发经验的就不用看了,我第一次使用STM32CubeMX来开发我自己做的开发版,在一开始我都是使用STM32标准库的方式做开发,有兴趣的可以看到我第13届铁人赛:https://ithelp.ithome.com.tw/users/20141979/ironman/4820

很幸运得了 [Arm Platforms] 类组的优选,我在文章有提到标准库开发和STM32CubeMX的HAL、LL库开发的差异STM32的开发生态,Cube、HAL库、LL库,这边就不重复说这些的差别了,总之学标准库会让你对嵌入式单晶片这块领域更有Sense,基本的学完後再来去深入探讨进阶功能,如何让程序执行快更有效率。

我从标准库衔接到HAL库使用上没遇到甚麽问题,我必须说学过标准库过後再去碰STM32CubeMX所产生出来的配置专案完全不觉得陌生,在我眼里就只是标准库删掉一堆功能函示作精简的版本。

STM32CubeMX的安装我就不描述了,直接从建立1个新的专案GPIO点亮LED开始,首先点开来 STM32CubeMX 软件会出现以下画面
https://ithelp.ithome.com.tw/upload/images/20220214/20141979mOe3xv5J4U.png

按了上图 ACCESS TO MCU SELECTOR 的部分来创建个专案,开完後会出现下图的选择MCU/MPU型号的列表。
假设你身边有ST官方出的开发板可以选择第二项,以开发板型号做创建专案

https://ithelp.ithome.com.tw/upload/images/20220214/20141979nv36rlgFJb.png

我这边是选择 STM32F030CC 的 MCU 型号,这边的话就选择自己身边有的开发版 MCU 型号做选择吧不会影响我这点亮LED的范例,左半边是根据MCU/MPU的规格去做筛选,选择好後後会反黑再点右上角的 Start Project 开始专案会出现下列配置函示的介面。

https://ithelp.ithome.com.tw/upload/images/20220214/20141979fmV2B33uuO.png

首先要来配置能烧入程序的 IO 口 SWCLK 和 SWDIO
1.点选 SYS
2.点选 Debug Serial Wire 配置烧录口
3.会显示两个角位框框变成绿色
至於下面两个选项的作用是用来唤醒 MCU 或者让 MCU 休眠的 IO 口,目前用不到先不选取

再来是选取左边的 GPIO 选项,对着右边的 MCU 选择你要配置 GPIO 的口如下
https://ithelp.ithome.com.tw/upload/images/20220214/20141979YHO4LzsCOx.png

1.点选GPIO
2.点选你要的IO口就会跳出1个选单,再选你要的功能我这边是选 PA1 GPIO_Output

选完後中间的介面就会跳出进阶的设定,如下图
https://ithelp.ithome.com.tw/upload/images/20220214/201419793AWn2qMAMS.png

可以看到左上方的界面出现了1个 PA1 还有一排的规格,下方则是 PA1 的初始化
1.GPIO output level (GPIO 口默认状态,可配置为 High 和 Low)
2.GPIO mode (GPIO 口的模式,可配置成 Output Push Pull 和 Output Open Drain)
(至於这模式的差别我在之前的文章有提到了:GPIO口的八种模式)
3.GPIO Pull-up/Pull-down(GPIO 口内部上拉VDD或下拉GND还有不上拉和不下拉)
4.Maximum output speed (GPIO 口的输出速度可以配置为高速、中速、低速,实际的数值可以查看参考手册的GPIO章节)
5.User Label (这是定义这个IO口名称的宏定义 #define,例如我打 LED_TEST 的话则会再 MCU 介面出现注解的感觉,程序码部分则会在最後产生专案里的 main.h 里面如下图)

https://ithelp.ithome.com.tw/upload/images/20220214/201419798N65rjqTse.png

要得GPIO口配置好了再来就是开启RCC,MCU需要震荡才会工作,点开左边的RCC选项後会看到下图介面

https://ithelp.ithome.com.tw/upload/images/20220214/20141979Y0ebLiEORe.png
1.点选RCC
2.可以选择你想开起的外部时钟,由於我自己做的开发版我两个外部时钟都有焊上去但我这边只选择使用外部高速时因震荡
3.显示这两个角位配置成外部高速石英震荡

Clock Configuration

要用的IO口都开好了,再来是 Clock Configuration 也就是时钟树(RCC)详细设置,点选上方的Clock Configuration 如下

https://ithelp.ithome.com.tw/upload/images/20220214/201419791o7pMuALFB.png

1.点选上方的 Clock Configuration 进入配置时钟树
2.设定外部石英震荡速度这边可以看到4-32代表说你只能挂这范围的石英,这边就根据各位的开发版的来决定。
3.经过PLL数据多工器来选择要使用HSE还是HSI,这边我选择HSE
4.这边我选择6倍频是因为我想让这颗MCU达到最高工作频率48MHz,每颗mcu能工作的频率不一样,还有很重要的一点再高阶一点的MCU些IO口的最高工作频率也会不同喔,要看 Datasheet 里的说明,假如我这边调7框框会变红色提示你错误配置
5.系统的 Clock 来源这边我选择PLLCLK
6.看到最後 PCLK1 的 APB1 的总线速度为48MHz,看这里的原因是APB1为GPIO口上的控制线

Project Manager

再来是要创造专案的设定,点选上方的 Project Manager

https://ithelp.ithome.com.tw/upload/images/20220214/20141979HZIBpWbZpD.png

1.Project Settings (专案设置)

Project Name :专案名称,这边我设置h01_GPIO (不要设置中文)
Project Location :专案要放的路径,这边我选择D槽创建1个STM32CubeMXLib的空资料夹
Application Struture:应用程序的结构,这里包含两个选项Basic:是基础的结构,一般不包含中间件(RTOS、文件系统、USB设备等),Advanced:相反就是包含中间件,一般针对相对复杂一点的工程。这边我们就设定基本(Basic)模式就好。
Toolchain Folder Location:这会在 Project Location 专案路径上建立资料夹,名称为 Project Name
Toolchain/IDE:这边是选择你要用的编译软件,这边我选择 MDK-ARM 是用Keil5,我比较习惯 Keil5 这边就看个人喜好瞜,後面的版本部分就选最高的就好

2.Linker Settings (堆栈设置)

这部分预设就好,这牵扯到程序码的运行速度入门这行先不要去玩这个,这地方是动到.s档组合语言的部分,等基本都完过再来理解这设置的用意吧

3.Thread-safe Settings

去看官方使用手册说明看完还是不确定,只看懂使用Keil5、STM32CubeIDE的话勾选 Enble multi-threaded support

4.Mcu and Firmware Package

这边就不用动了就直接预设的就好,这边是在选择要用HAL库版本

Code Generator

再来点选左半边的 Code Generator (代码生成器),这地方主要是在设定产生代码的样子

https://ithelp.ithome.com.tw/upload/images/20220214/20141979afJEFzg4Gv.png

1.STM32Cube MCU packages and embedded software packs

  • Copy all used libraries into the project folder - 将所有使用过的库复制到项目文件夹中
    这地方可以勾起来,这样工程才会包含所有基本的功能库,方便查看各个功能有甚麽样的函示
  • Copy only the necessary library files - 只复制必要的库文件
    假如你没有使用CAN、SPI、I2C等外设功能,就不会新增相关库文件到你工程下。
  • Add necessary library files as reference in the toolchain project configuration file - 在工具链项目配置文件中添加必要的库文件作爲参考
    这个勾选的话就不会HAL库的驱动文件只会有最基本配置初始函示,例如我要点亮1个LED的话勾选了这个选项我就要自己写操作暂存器来赋予值,有点像是暂存器开发,我觉得刚开始练习就勾1个就好,这样能快速练习一些基本功能。

2.Generated files (生成文件)

这里依个人需求选择,我个人习惯每个功能函示都有对应的地方居住所以勾选了第1个选项,这有点像是我之前标准库开发的方式,有兴趣的可以再去看看我的铁人文章,再来是,第2个我不想每次重新生成程序都备份旧的,第3个则是每次产生新文件时不取代掉我原本的打的程序

  • Generate peripheral initialization as a pair of'.c/.h' files per peripheral - 每个外设生成独立的'.c/.h'文件
    不勾:所有初始化代码都生成在main.c
    勾选:初始化代码生成在对应的外设文件。 如UART初始化代码生成在uart.c中。
  • Backup previously generated files when re-generating - 在重新生成时备份以前生成的文件
    重新生成代码时,会在相关目录中生成一个Backup文件夹,将之前源文件拷贝到其中。
  • Keep User Code when re-generating - 在重新生成时保留用户代码
    在main.c中添加了一段代码,重新生成时,会在main.c中保留你之前自己添加的这段代码。
    !! 注意:前提是这段代码写在规定的位置。也就是BEGIN和END之间,否则会被删除。 !!
  • Delete previously generated files when not re-generated - 删除以前生成,但现在没有生成的文件
    假设之前生成了i2c.c,现在重新配置没有i2c.c,则会删除之前的i2c.c文件。

3.HAL Settings (HAL库设置)

  • Set all free pins as analog (to optimize the power consumption)
    将所有空闲引脚设置爲类比输入,做低功耗产品时这个选项有必要勾选。
  • nable Full Assert
    使能所有断言,作为参数检查。
  • Template Settings
    模板设置这边预设就好,有兴趣的可以参考最新用户手册6节 Custom code generation 内容。

Advanced Settings

https://ithelp.ithome.com.tw/upload/images/20220214/20141979rvbV8rxndT.png

  • Driver Selector - 主要是选择要用什麽库做驱动,HAL库、LL库这两个差别我在之前的文章有做解释这边就不在描述了。
  • Generated Function Calls - 调用函数
    主要後面两个选项:Not Generate Function Call和Visibility (Static)
    1.Do Not Generate Function Call不生成函数调用
    也就是你代码不调用对应初始化函数。
    比如:你GPIO项勾选Do Not Generate Function Call,你main.c函数中就不会调用MX_GPIO_Init这个函数。
    这边我是选择要调用。

设定好後就可以按上面的 GENERATE CODE了,按完过一下子就会出现下列这视窗
https://ithelp.ithome.com.tw/upload/images/20220214/20141979w0RqKjPwr5.png
选择左边第1个,开启专案资料夹

https://ithelp.ithome.com.tw/upload/images/20220214/20141979ROB0zOjJWH.png
点开MDK-ARM里面就会看到下图
https://ithelp.ithome.com.tw/upload/images/20220214/20141979DuRrzXmnWK.png
点开h01_GPIO专案就可以开始写程序啦,在main.c这里打上这4行就可以插上LED於PA1就会闪烁了啦~
等明天比较有空我再来讲解程序的部分吧,今天花了半天在打这篇文,会想这样整理也有个好处,我之後想传承给实验室的学弟妹也比较好传承,包跨我铁人赛的文章也是。

假如对上述操作有什麽疑问都欢迎提出来。


<<:  撰写http request 的复杂一点的测试(Day26)

>>:  使用ssh 的方式使用git

资安事件回应篇

今天突然的好累QQ 所以来个半偷懒篇(?! 之前在写数位监识,或是资安稽核,还有其他文章时, 都会想...

[Day - 26] - Spring Swagger之我的SeaFood API 手册配制方法

Abstract 我们前面讲了许多Spring应用开发,但当我们开发好一套系统,势必要有一套API手...

学习笔记:一起进入 PixiJS 的世界 (二)

开始绘图吧! 有了基础场景後,就可以开始画图了,首先使用new建构出PIXI.Graphics()图...

Gin 表单

Golang Gin 表单 今天真的有点爆炸了,几乎没时间补文章,只能抽空拿点时间来写,如果在gin...

Day 08:八爪章鱼之 tmux 快捷键

今天的 Home 目录没有修改,https://github.com/simba-fs/2021-...