你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

MiniPro STM32H750 开发指南_V1.1-STM32CubeMX简介

[复制链接]
STMCU小助手 发布时间:2022-10-5 22:11
STM32CubeMX简介' b, m2 s3 D8 d: e1 ~3 m
STM32CubeMX是由ST公司开发的图形化代码自动生成工具,能够快速生成初始化代码,如GPIO、时钟树、中间件等,使用户专注于业务代码的开发。现在ST主推HAL库,经典的标准外设库已经停止维护了,新产品也只提供HAL库的代码,因此,我们学习HAL库是更加有优势的,由于HAL库具有低耦合、通用、抽象了硬件层,使得开发者无需太过关注硬件驱动的实现,使得开发更加的简单快速,更容易维护,因此被越来越多的产品所使用。2 R8 @* B! v) M6 a) ^; `% o

* A5 }/ _! O" P3 e10.1 STM32CubeMX的作用
6 V( X) ~1 c: O  gSTM32CubeMX具有如下特性:. k8 ]' R, T9 t# h/ Q/ x- t
①直观的选择MCU型号,可指定系列、封装、外设数量等条件" ~, f# M, q! h9 {5 L
②微控制器图形化配置; `$ h0 H% z& N" s# N& y
③自动处理引脚冲突' Y3 B) O6 m! M/ P3 N' E5 W
④动态设置时钟树,生成系统时钟配置代码
( {" U4 T0 E/ a; g9 ^1 s⑤可以动态设置外围和中间件模式和初始化- D4 o8 C- a1 l9 a
⑥功耗预测
! D7 ^' q" d" z9 V2 F⑦C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC* Z3 |5 t7 ^. p. `6 u' J  d8 X
⑧可以独立使用或者作为Eclipse插件使用; M. p6 w- u) c1 I9 W) K3 H8 N
⑨可作为ST的固件包、芯片手册等的下载引擎; E! t; _3 |5 T1 v/ B( j/ y+ t
这里特别说明一下STM32CubeMX和STM32Cube固件库的关系,STM32CubeMX图形工具配置生成的代码,是基于STM32Cube固件库的,并且可以在图形工具中直接下载STM32Cube固件库。也就是说,我们使用STM32CubeMX配置出来的初始化代码,兼容STM32Cube库,例如硬件抽象层代码就是使用的STM32的HAL库。不同系列的STM32芯片,会有不同系列的STM32Cube库,而STM32CubeMX图形工具只有一个,所以开发不同的STM32系列芯片,选择不同系列的STM32Cube库即可,它们的关系如下图所示:
; D  b" a# s, J4 ?* b
) k* |9 q) D9 H 6b8824c5e64c4b7e8b2482a2719054dd.png
! k  S& X6 L8 m$ H6 }. p
, v! S/ s4 k( q) u图10.1.1 STM32CubeMX和STM32Cube固件库的关系; w& e0 k" n! n4 M- h
当然,自动生成的驱动代码我们不去仔细专研其原理的话,对学习的提升很有限,而且在出现BUG的时候难以快速定位解决,因此我们也要了解其背后的原理。, i2 M' K7 y# ?2 f- G% j" n* R
4 H0 S" ?1 m/ g" p3 b
10.2 安装STM32CubeMX
. @0 Y4 s8 K: h7 KSTM32CubeMX运行环境搭建包含两个部分,首先安装Java环境,再安装STM32CubeMX。
5 Z, O0 Z+ w9 Y4 x0 ~  ?6 ]. `10.2.1 安装JAVA环境
) j, e+ G* z) Z/ z$ b2 D/ p- y安装Java运行环境,大家可以到Java官网www.java.com下载最新的Java软件,也可以直接从光盘资料获取安装包,目录如下:A盘6,软件资料1,软件3、STM32CubeMXJava安装包,Java安装包文件下有x64和x86两个文件夹,分别是64位和32位的电脑的安装包,大家根据自己电脑的位数选择即可。比如64位电脑选择x64文件夹的jre-8u301-windows-x64.exe安装包,并根据提示安装即可。安装完成之后提示界面如下图10.2.1.1所示。6 {' G2 {% Q0 C- S

- Q1 @. ?" c1 o 2aaa03ac1cf241f5a32442a4c5c55cb8.png / h! T, N4 d1 E  V

- o% @( N4 h' K$ f6 H# O图10.2.1.1 Java安装成功提示界面7 j/ `5 P8 |; t+ p4 C6 Q4 F+ g
安装完Java运行环境之后,为了检测是否正常安装,我们可以打开Windows的命令输入框,输入:java –version命令,如果显示Java版本信息,则安装成功。提示信息如下图10.2.1.2:$ t/ C1 q9 w( o' y
) R* m" `4 G' y- I1 X
01f42aa2fd474bb6a4fd0c265fbafe73.png ) _$ V2 }0 M6 {% l
6 l/ g3 m8 Z; v3 p9 I$ L! i
图10.2.1.2 查看Java版本1 ^+ S6 @0 o, o6 t. @
10.2.2 安装STM32CubeMX6 x. E$ D+ n8 L) S
在安装了Java运行环境之后,接下来我们安装STM32CubeMX图形化工具。该软件可以直接从光盘资料获取,目录如下:A盘6,软件资料1,软件3、STM32CubeMX,也可以直接从ST官方下载,下载网址为:https://www.st.com/en/development-tools/stm32cubemx.html。
4 U/ C) ]# A* B% y: L接下来我们直接双击SetupSTM32CubeMX-6.3.0.exe,安装步骤如下。4 e/ ^2 p' v7 h/ A' `: C' S
; u% {, G- F' G2 L/ T; X4 d! s
42c4e54ffb48491e9b2814ab84fc068a.png
! Q$ J6 Y. x: g- D1 n8 }9 C+ A( R; ]
图10.2.2.1 启动安装
5 r) Z% n- x- x5 H7 o+ v3 A: }% U+ A  ]8 b4 U
78896877c4844d9584030f54e5887e99.png
- v4 |! N" U+ F3 @
. f7 C( D  o, }7 a# t* e图10.2.2.2 接受本许可协议6 k3 o% f8 y" @/ U/ T" I) c, j( e

$ F4 e+ `9 ]5 {+ y0 h 24b220122f5b4843bb66b5d54e20b207.png $ I( G- X( q; ~" j1 h# E' ^, u2 L

; R6 }9 K, H) V2 ~1 ?* Q图10.2.2.3 勾选第一项即可
4 a7 b0 [. ]  R+ K* b, ~& b" a
9 n# B8 Y  ]7 h5 b  L( e& |7 ]2 v4 \& P 7d9b175a87d44ff990619eceac292534.png 5 O. N0 z% ~. J& v

3 n$ I4 r% l7 N3 ]  @  P图10.2.2.4 指定安装路径
7 u7 z* r& H3 G0 d6 E  E) x. D2 ]
dbc882d3cbe34570b894bce804032203.png
/ n. k7 w& F+ _8 D+ J: {! h4 r  o6 ]5 i, d  f
图10.2.2.5 创建快捷方式8 F- ]7 R  N* k2 V* G- x
. e) o7 g6 g$ E
ca5159540b774ee08b71fd26dfe7683a.png & ]9 V4 C6 ~  k* w7 Y- Q: V
# A( W3 X/ N/ D+ K, f& j" @9 h7 y, N+ d
图10.2.2.6 安装进度提示
. Y! I: q- w# ]* ~: K1 x8 \) z7 c; k8 N; i- @
e393a885bc8948d9af990e34addede36.png
, a6 ^* N1 N0 v6 q+ N
/ z/ K/ l( A6 v- x3 a图10.2.2.7 完成安装
" t. o# ~* N1 i0 n: f+ t6 l7 j5 z5 I. r- K' f8 C
10.3 使用STM32CubeMX新建工程  n8 K7 r+ P# |3 z8 D
大多数情况下,我们都只使用STM32CubeMX来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在STM32CubeMX中完成的,需要用户自己根据需求来实现。+ S4 L2 V! `& U& l, ?1 U. K( @  O+ o
10.3.1 打开STM32CubeMX
% w1 D! I; ]) z/ @) B% G双击桌面STM32CubeMX快捷方式图标,如图10.3.1.1所示。
1 `) U8 Q, J2 E+ F9 x6 B; K. M5 K9 U# y/ K6 y1 x$ K$ V
08f4e903d63c4d6c96acca79a0a54137.png 4 @& v& V! g( _  n) f0 o

4 N/ K* ~: T, L1 W图10.3.1.1 CubeMX快捷方式
% x$ ]: G; e$ @/ ~) H打开后CubeMX主界面如图10.3.1.2所示。. o( M- c( J! Q3 a' @; m: i. J

0 v: V8 p5 v3 W( b) K f76372a7f0ba458db3f683a0d519e22f.png 5 y/ f. b! Y; Z. J1 l
# ~+ i0 l  \1 |. L
图10.3.1.2 CubeMX主界面  s! |! `8 e  a' s9 k7 b9 b7 T

! C) s6 I) F. i$ u1 y. [10.3.2 下载和关联的STM32Cube固件包- o3 b4 L  w9 W
我们知道STM32CubeMX图形工具只有一种, STM32Cube固件包却有多种,需要选择我们工程对应的固件包。
, I* A0 b) q" p( d为了方便,新建工程前,我们先来下载和关联STM32Cube固件包,点击Help->Manage embedded software packages,如图10.3.2.1所示。
" D9 K& o. u! I9 I  C' M, F+ R- s# m4 b0 |
fe1b49e0023047c58b2e4b54efc0f664.png , G3 @' c( r" A, F& ?# G

, Y+ W' W  Q& ^# s图10.3.2.1 管理固件包
* T. l* A4 u$ F9 P然后弹出管理界面,在该窗口找到STM32H7列表选项,勾选1.6.0版本。这里选择1.6.0版本是因为我们的光盘的固件包是这个版本的。关联STM32Cube固件包有两个方法,如图10.3.2.2所示.
' F. L4 p, a$ e! V! z, W3 }1 e! [1 E  S3 J: U" k
2521539f00184e71af5ca5d5c22c37a3.png % |3 Y3 Q9 |8 X0 T9 `% y6 d  t1 {+ t
5 z' _6 h3 D4 n9 ^$ u% ^
图10.3.2.2 下载和关联STM32Cube固件包
$ K" O* y4 \% m) O2 _6 D2 D5 f方法二:下载好之后,会自动关联,所以不需要多讲什么。
  @; M% f% B: V( o  O, w6 Q方法一:点击后,弹出下面的窗口,然后选择光盘中的对应的固件包,注意这里是压缩包的形式,如图10.3.2.3所示。( ~7 F" ]. M! v) ?" C$ b0 x
  C9 n# w: H" ~; D8 f  X" d% T
3caae082e1b34342a9c1ebb0ccb237f5.png 0 \8 M. u: v) x9 ?0 B9 ~+ S7 s

: a5 ~# |5 y! L: R图10.3.2.3 关联本地STM32Cube固件包
7 e$ o/ H+ k) A: K
( V' Z, k- {. l0 G6 r' o& R 2d3e8bc463da4cc6a4f5c04f2938caa8.png
1 f) E' {1 `% T7 J
& Q9 G8 q0 ]3 V/ R8 k& r# e3 {; ^6 H图10.3.2.4 等待关联
/ k6 p* p" K. @
" o: {7 X4 q; T7 L& _1 U5 |, b 2beab16e1d644c66a13be05e9a731712.png
& ?- [& G' X2 ]( J! x' W% T
5 _6 q" {: Z; O" x: f6 S. o; S图10.3.2.5 关联成功
6 c2 f+ F1 {% b1 x! A) f关联好固件包我们就可以开始新建工程了。
. S8 ~8 d" ?2 W. o# [. `9 Y( Q
. x6 u$ w: c2 O3 P! C; O7 T10.3.3 新建工程6 |5 ~3 |0 {' T; b
使用STM32CubeMX配置工程的一般步骤为:- O9 z4 b2 _' i* C! R+ W4 Y, l
1,工程初步建立: M, T1 S. h) j5 J
2,HSE和LSE时钟源设置
: m; J+ Q8 ~3 s/ P$ p3,时钟系统(时钟树)配置( ]) b8 s+ k5 {$ b
4,GPIO功能引脚配置
; b! M7 }" I: u4 P3 y6 m& Q( }3 Y5,Cortex-M7内核基本配置(限定项)8 s! u( l( n+ Q8 c
6,生成工程源码  c$ f) m, d5 v  g6 f% ]
7,用户程序
. }% h9 r% W9 g: j; K接下来将按照这7个步骤,依次教大家使用STM32CubeMX工具生成一个完整的工程。5 ^' v3 T2 |% C! V" T
1 工程初步建立
4 Y& j* l1 f6 u' h3 v- x方法一:依次点击“File”,“New Project”即可建新工程。如果之前打开过的话,左侧最近打开的过程一列会有打开的工程列表,直接点击这些工程也可以打开。
# {  i2 ]* P4 ~8 f$ f0 O& h方法二:直接点击ACCESS TO MCU SELECTOR。
/ I% r: f/ U" K, g具体操作如图10.3.3.1所示。
/ w9 N3 j% `# R1 m1 D# O! A
3 k# E) K$ \2 N6 d& Q3 k9 K 9d88191b91d2453798558b2fab3013cc.png
# q/ K) o4 E* W, [7 Q1 _6 q) Q% N0 Y- p% C7 Y
图10.3.3.1 新建工程
8 E# ]( J& @! C5 \: O点击新建工程后,第一次可能会联网下载一些的文件,可能等待时间比较长,可以直接选择取消即可。6 e- l& C# k- H/ b+ o

7 Q! Y( ]6 h/ D/ w3 n f2b8d735c6844bbdb2f3a0b207cf4c12.png " N1 o9 u. i4 ~' n3 O# Z

7 _6 c- p9 g9 s% d% F! K& z图10.3.3.2 启动时联网更新检测, [% w) `5 X1 r& c- u
之后都可以进入芯片选型界面,如图10.3.3.3所示。
0 J2 R; V6 N6 r$ \: n2 k6 ]1 a
/ N" i, Z+ d0 }; A! l5 ^  J: R 04fe32f9e9e34cd280d2971a15291eba.png
0 G* S# T5 ?$ F5 {/ q5 A. e1 s7 Z: r- v! ?7 V
图10.3.3.3 芯片选型界面1 I$ a1 O6 T9 l" _) D0 C; s
选择具体的芯片型号,如图10.3.3.4所示。5 }5 F! u' f1 K4 A: O/ u' X
- P8 e: N4 ?3 T+ V
5ef380dee8164135ba87012e1f1b5d14.png
* O+ k* g7 r0 L5 n# b" }$ ^4 j  P/ _& W4 U
图10.3.3.4 选择具体的芯片型号
# G- M  w; \" R5 E4 \# J+ \选择了芯片型号后,弹出主设计界面,如图10.3.3.5所示。9 M- I, E, B1 F. X
# _7 @+ S% o- Z+ v' y4 b4 x
2f8bafee018940a5bf042381fb138238.png
, [4 ~7 Y5 U3 |4 g/ F$ c, Z4 c# `- ^; ]- |9 ]9 Z0 c
图10.3.3.5 主设计界面6 Q: c" a. Y4 W6 K0 J) N
2 HSE和LSE时钟源设置
+ v% G8 X; U% w& v进入工程主设计界面后,首先设置时钟源HSE和LSE。如图10.3.3.6所示。0 f: K% V( c6 g$ P: k

4 `8 l7 k9 |- q' N. I" f+ z 58e319bb3c794065bcf122aa759ba45f.png 4 r) U) B* }5 O9 L% b
$ q* O) N) F0 H# |7 N) m, C9 Q, X
图10.3.3.6 设置时钟源HSE和LSE
# S( ?+ g" A# f! p3 ~' ~. V图10.3.3.6中的标号3和4,我们都选择了Crystal/Ceramic Resonator,表示外部晶振作为它们的时钟源。我们开发板的外部高速晶振和外部低速晶振分别是:8MHZ和32.768KHZ。所以HSE时钟频率就是8MHZ,LSE时钟频率就是32.768KHZ。- }" [6 p& F. C" x7 V- Z7 }
选项Master Clock Output 1 用来选择是否使能MCO1引脚时钟输出,选项Master Clock Output 2用来选择是否使能MCO2引脚时钟输出,最后一个选项Audio Clock Input(I2S_CKIN)用来选择是否从I2S_CKIN(PC9)输入I2S时钟。这里大家要注意,因为选项Master Clock Output 2和选项Audio Clock Input(I2S_CKIN)都是使用的PC9引脚,所以如果我们使能了其中一个,那么另一个选项会自动显示为红色,也就是不允许配置,这就是STM32CubeMX的自动冲突检测功能。
" l! ~3 @; S. W% x$ `$ N! i3 时钟系统(时钟树)配置- \& M0 q! M( u: x* W
点击Clock Configuration选项卡即可进入时钟系统配置栏,如下图10.3.3.7所示:  b. ~& r5 {1 t( K

/ N5 w& E/ x5 }2 A! P  w6 \9 G ab3ebcd95b9f4b01b4f51d4557233736.png 8 i3 ~7 C# `: t2 P5 x
. }/ C5 I. I: i
图10.3.3.7 时钟系统配置栏) @1 h4 A' y9 v9 v, b4 m8 \  _2 L
进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32H7时钟系统框图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。: G: V" Q. G- E
这里,我们将配置一个以HSE为时钟源,配置PLL1相关参数,然后系统时钟选择PLLCLK为时钟源,最终配置系统时钟为480MHz的过程。同时,还配置了AHB,APB1,APB2、APB3、APB4和Systick的相关分频系数。由于图片比较大,我们把主要的配置部分分两部分来讲解,第一部分是配置系统时钟,第二部分是配置SYSTICK、AHB、APB1、APB2、APB3和APB4的分频系数。首先我们来看看第一部分配置如下图10.3.3.8所示:: [  v- t/ O) _7 }# q" M

! w- s, s) P9 T9 C 4f007c4bfbef4bd5adf42f41ca5ca410.png % {  P9 d8 N# u( M3 u9 j+ m

9 t+ O  c) f! E图10.3.3.8 系统时钟配置图7 ]& K' y2 {+ L( m! }' w: h
我们把系统时钟配置分为七个步骤,分别用标号1~7表示,详细过程为:# A* A! _- D9 L, Q4 g
1、时钟源参数设置:我们选择HSE为时钟源,所以我们要根据硬件实际的高速晶振频率(这里我们是8MHZ)填写。4 j8 p: ?3 T* s
2、时钟源选择:我们配置选择器选择HSE即可。& I' t0 {/ s3 q
3、PLL1分频系数M配置。分频系数M我们设置为2。7 r8 y+ u3 X& w- r
4、PLL1倍频系数N配置。倍频系数N我们设置为240。
/ C" q! i9 I' s4 b# h# [1 \7 }4 z9 \5、PLL1分频系数P配置。分频系数P我们配置为2。* X7 o# k( M6 D' C$ s
6、系统时钟时钟源选择:PLL,HSI还是HSE。我们选择PLL,选择器选择PLLCLK即可。
. ?  }! v. j- `" {7、经过上面配置以后此时SYSCLK=480Mhz。4 h# j1 `2 [0 V5 l: r
经过上面的7个步骤,就会生成标准的480MHz系统时钟。接下来我们只需要配置AHB、APB1、APB2、APB3、APB4和Systick的分频系数,就可以实现sys.c文件中的sys_stm32_clock_init函数配置的部分时钟系统。配置如下图10.3.3.9所示:
9 a0 w7 \" u: \9 X" [# f. A+ I; X+ D# {$ ~8 V9 e/ M& [
20380754b67542f485169ea6c225ed4f.png
5 Q* K; G: F9 F7 ]
8 h, w; v) \3 w7 _图10.3.3.9 AHB、APB1、APB2、APB3和APB4总线时钟配置
+ D7 k! b. W3 lAHB、APB1、APB2、APB3和APB4总线时钟以及Systick时钟的最终来源都是系统时钟SYSCLK。其中AHB总线时钟HCLK是由SYSCLK经过AHB预分频器之后的来,如果我们要设置HCLK为240MHz(最大也就240Mhz),那么我们只需要配置图中标号8的地方为2即可。得到HCLK之后,接下来我们将在图标号9~12处同样的方法依次配置APB3、APB1、APB2和APB4分频系数分别为2,2、2和2即可。注意!systick固定为480MHz,配置完成之后,那么HCLK=240MHZ,Systic=480MHz,PCLK1=120MHz,PCLK2=120MHz,PCLK3=120Mhz,PCLK4=120MHz,这和我们使用sys_stm32_clock_init函数配置的时钟是一样的。- Z% P8 _8 {: b0 g, e# H

+ D% F" V% P) |+ Z( J4 GPIO功能引脚配置! _+ I! o  ], Y$ {/ }2 F* X# \$ X
本小节,我们讲解怎么使用STM32CubeMX工具配置STM32H7的GPIO口。MiniPRO STM32H750开发板的PB4、PE5和PE6引脚连接一个RGB灯,我们来学习配置这三个IO口的相关参数。这里我们回到STM32CubeMX的Pinout&Configuration选项,在搜索栏输入PB4后回车,可以在引脚图中显示位置,如下图10.3.3.10所示:
% ?6 o/ s! I9 g5 N/ n+ q$ ]9 V
e29207bb74bc422491c2d53bab79f936.png
, E7 r+ z! a+ @9 z
! C% I6 t  e! c图10.3.3.10 搜索引脚位置
4 F: C9 [' O$ Q接下来,我们在图10.3.3.11引脚图中点击PB4,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。操作方法如下图10.3.3.11所示:
  Q1 \$ Q2 R' R$ r0 I9 ?1 [
0 a. W0 X/ Q% T0 W7 P' v; c 8cc19553781b4ee0a36d288e809846cc.png
( F; |" i! l. ?& Y9 |1 I; H( ^, p' s% S( ~, ~$ Q6 p1 {
图10.3.3.11 配置GPIO模式
9 P6 S* Y9 w+ }- o8 X, M* N同样的方法,我们配置PE5和PE6选择功能为GPIO_Oput即可。设置好即可看到引脚从灰色变成绿色,标识该管脚已经启用。这里我们需要说明一下,如果我们要配置IO口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完IO口功能之后,还要配置IO口的速度,上下拉等参数。这些参数我们通过System Core下的GPIO选项进行配置,如图10.3.3.12所示。
& v" i; b2 _; r! A9 I
: e. _" e, m0 S+ A 9373fbb950ab4c8d9d94241868fefccb.png . [) b6 f! n% |. p" g7 V
4 d% G' w9 g& T1 v
图10.3.3.12 GPIO选项2 e. }; W) O9 c
我们先配置PB4,PE5和PE6配置方法一样的。点击图10.3.3.12的2号框里面的PB4,配置如图10.3.3.13所示。$ b/ R8 J! q+ L" _3 F0 y: u, D$ f/ I
7 Q9 a. H4 L) e8 \9 U, z7 {' X2 Z
e993781fe3204a7a9079d1cad26ac8ff.png
" ~5 a: h+ Y" Y2 B! X9 d+ x( p; J! s! I% u$ V+ a, w- B  W) @
图10.3.3.13 配置GPIO口详细参数
: L3 N. R% b& _) s6 f# G2 S/ sGPIO output level是IO的初始值,为了开始让RGB灯熄灭,我们设置初始值输出高电平。/ a; p1 r9 C0 C" @6 O( N" N
GPIO mode默认是推挽输出,不需要更改。
" C% ?7 y2 t! o" ~. C  EGPIO Pull-up/Pull-down默认是不上下拉,我们改为上拉。
) w% q, R# ?7 c; b2 ~0 e" ZMaximum output speed输出速度配置,默认是低速,我们设置为中速(可以不改)。! Y/ R# Z4 t$ m! z) ~( S
User Label用户符号,我们可以给PB4起一个别的名字。
$ z; W% _5 a4 z$ nPE5和PE6也是按照这样的方法配置即可。
0 ]: c" m1 I( j" o7 W: n$ h* D# Q5 Cortex-M7内核基本配置
. G: P  l5 X0 P: Q这里我们主要配置Cortex-M7内核相关的参数。我们依次点击Cortex_M7 进入配置界面,操作过程如下图10.3.3.14所示:1 U  c# l9 e$ N4 S) I

2 Y) K8 f2 C+ S 0628c60d36a342b4a2281df87bd74956.png   e7 N" I  C/ K. o& Z; L
/ V  W% e) |1 G6 P+ n
图10.3.3.14 Cotex_M7配置0 T- ~2 l2 a0 a* w
该界面一共有两个配置栏目。第一个配置栏目Cortex Interface Settings下面有两个配置项:' f+ S4 Z( w: n) n
% ]1 e$ u$ R% L( {1 \
1.CPU ICache:使能I-Cache。" R* T# T- }3 ~- J2 i& y+ {
2.CPU DCache::使能D-Cache。
3 V, T$ U8 c! D% R" f/ _+ m' n上面这2个参数是CM7内核相关配置。第二个配置栏目Cortex Memory Protection Unit,是用来配置内存保护单元MPU,在我们后面的实验会讲解MPU配置。& v3 I& u6 O- f" q
6 生成工程源码3 H- p, ^9 Y2 `9 _$ f' t
接下来我们学习怎么设置生成一个工程,Project Manager-> Project选项用来配置工程的选项,我们了解一下里面的信息。
  R& W9 J/ [" G& b+ a; fProject Name:工程名称,填入工程名称(半角,不能有中文字符)1 F# l5 j6 ?0 }
Project Location:工程保存路径,点击Browse选择保存的位置(半角,不能有中文字符)* J- r9 ^# |% {# s( d" f
Toolchain Folder Location:工具链文件夹位置,默认即可。
$ F* S! ^  m7 R  x& v" ^: hApplication Structure:应用的结构,选择Basic(基础),不勾选Do not generate the main(),因为我们要其生成main函数。
1 Z5 [, _) h  lToolchain/IDE:工具链/集成开发环境,我们使用Keil,因此选择MDK-ARM,Min Version选择V5.27(最新)。  v5 x: X  L' n( ^! s/ g/ q$ O, Y
Linker Settings 链接器设置:
8 T+ |0 A) ?+ v7 `7 ~Minimum Heap Size 最小堆大小,默认(大工程需按需调整)。
+ y9 J% r, D$ X& i6 }0 LMinimum Stack Size 最小栈大小,默认(大工程需按需调整)。* y8 O' N; z( q5 q7 A& W& j& ]' k
MCU and Firmware Package是 MCU及固件包设置:. E4 t, {5 {" O+ _& Q9 U
MCU Reference:目标MCU系列名称。
+ r5 O, ]7 S; G# e; wFirmware Package Name and Version :固件包名称及版本。
8 V% e& T% x8 e# |勾选Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。(这里因为我有两个版本的固件包,所以它默认使用最新的,这个关系不大,就用新的)。 最后工程配置,如图10.3.3.15所示。  L( a: R4 x- C2 c* E

% U. Y+ ~% t4 w6 K$ a4 `9 C  f 2cef5102baf548b483433a1cb8784ae6.png $ W: |8 K0 T7 A' }8 S
6 X5 v8 K2 ^+ p9 s
图10.3.3.15 工程配置2 |' T( }, I, F; z6 ~3 k
打开Project Manager-> Code Generator选项,Generated files 生成文件选项,勾选Generate peripheral initialization as a pair of ‘.c/.h’files per peripheral,勾选这个选项的话将会将每个外设单独分开成一组.c、.h文件,使得代码结构更加的清晰,如图10.3.3.16所示。, w8 Z) J+ h% j& Q

1 l1 s1 N/ x3 G6 m  b a6fc082692d74979982c6dbd15894bcb.png / H3 m9 ]( B" u2 B: N4 [' O

9 \) p! p) P$ Z图10.3.3.16 代码生成器设置- p4 h$ O8 I: y
至此工程最基础配置就已经完成,点击蓝色按钮(SENERATE CODE)就可以生成工程。9 C$ v. m% H- [) K# p

8 U, J: r" |; ?( | 018411a849b843e2a465e6647cf48528.png
& w! A  U6 K% M! C+ Z: Q
# R  Q# @: F. e9 P* S; Z" w图10.3.3.17生成工程* \5 ?0 E4 Y7 @2 Z
在弹出来的窗口中点击Open Project就打开MDK工程。
6 v- {- ], I. w! j; S7 j8 S" v& f6 e
ad2edfbe13f04b14bfbd0f1d48d477ab.png
) E. `$ O+ i' ~& l/ h, z
) R7 q# O* p! M) o3 S图10.3.3.18 打开工程) l1 ^" s' i2 D* Q% d8 v; M' Z
完整的STM32H7工程就已经生成完成。生成后的工程目录结构如下图10.3.3.19所示:4 N1 @  L3 V) ?2 k

7 V/ Z0 ]4 u1 o: s# V7 P 395ce43578ab42e1b2791ab5abf69fa0.png
) f5 |" K! n- R( h2 X' S# L- \1 @8 f& m7 A6 R* B
图10.3.3.19 STM32CubeMX生成的工程目录结构- S* ~1 m& q; d. t3 _
Drivers文件夹存放的是HAL库文件和CMSIS相关文件。+ ~/ \* B: p+ h* d) {
Inc文件夹存放的是工程必须的部分头文件。
& e+ l6 `# [4 h7 iMDK-ARM下面存放的是MDK工程文件。
: d: c$ |  \4 k1 i- qSrc文件夹下面存放的是工程必须的部分源文件。8 H( C0 `' B5 {" T
Template.ioc是STM32CubeMX工程文件,双击该文件就会在STM32CubeMX中打开。
6 J: p% |9 J5 Q4 p+ k% K! |9 v# x5 B5 W5 p( N: L
7 用户程序
4 h  F6 S' m- k- Z+ k+ j) x8 Z在编写用户程序之前,首先我们打开生成的工程模板进行编译,发现没有任何错误和警告。
3 I6 F, Z- y1 K# z0 N接下来我们看看生成的工程模板的main函数,这里我们删掉了源码注释,关键源码如下:6 U% G7 X8 I( |2 X  M- q& j+ m

( d1 }/ @# ~5 @% Z
  1. int main(void)
    8 S% Y5 u# Y% [% Q& X. ^% U. `
  2. {1 ^# F# }- J) e; e" [1 g& g
  3.   SCB_EnableICache();
    : m7 I2 ^/ A& t, s6 m6 Q
  4.   SCB_EnableDCache();$ f8 U. ?6 L; m
  5.   HAL_Init();4 F) b5 u  a8 V: S' n3 W6 Y
  6.   SystemClock_Config();
    , Y$ J5 j6 M- h; \1 X, |1 z' }
  7.   MX_GPIO_Init();9 |' j& D& q, D5 H; k6 T
  8.   while (1)
    ! Z5 _% P  W; c( J4 x
  9.   {5 D2 |  o" O5 e, g# E  T
  10.   }) B* q! K8 b9 A4 u  t! l
  11. }
复制代码
$ V7 `& h: M1 J$ b! }
大家需要注意,STM32CubeMX生成的main.c文件中,有很多地方有“/* USER CODE BEGIN X /”和“/ USER CODE END X */”格式的注释,我们在这些注释的BEGIN和END之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。% S) w+ @$ ?& X' J5 v+ n! ~
我们编写一个跑马灯的用户程序,程序具体如下:  A5 T0 N3 L4 W+ y

+ |2 u% }+ l' [- Q. b+ M6 J; r+ B
  1. /**; b# K, y5 t4 f: A; q# h% N
  2.   * @brief  The application entry point.% t1 q; H5 |8 s
  3.   * @retval int
    1 c3 Z+ i  L0 b- e. p/ i
  4.   */
    2 |" i  Q2 t) X0 a4 g
  5. int main(void)
    3 ^2 t: d% R. L2 r$ ?
  6. {
    # d/ K% D5 ~4 \0 G) a4 a1 ^
  7.   SCB_EnableICache();
    ; U8 R# C* `1 q) ^; t
  8.   SCB_EnableDCache();, g$ S! D. w( J6 \9 Q2 c4 `
  9.   HAL_Init();  g( a& d4 a/ p2 [
  10.   SystemClock_Config();! m4 x' V2 c' p, B5 O
  11.   MX_GPIO_Init();0 C' O8 p" w! c# N& b/ X3 t
  12.   while (1). }3 p+ v. G1 i
  13.   {
    2 M9 h4 A- i3 D+ v2 G' x$ H& i
  14.     /* USER CODE BEGIN 3 */
    1 j/ Q1 Y; H; d0 J& M
  15.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);            /* PB4置1 */
    : j: M  C8 c  K
  16.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);         /* PE5置0 */ - e+ g- Q5 {3 E' U
  17.     HAL_Delay(500);7 o$ }1 v" Y( @+ p7 Q, o
  18.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);            /* PE5置1 */
    5 ]# r9 u# Q1 y- u7 ^
  19.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET);         /* PE6置0 */2 Y9 `1 b: E6 [
  20.     HAL_Delay(500);/ \3 O3 h0 w7 x5 S
  21.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_SET);            /* PE6置1 */
    % e  I$ r) E1 P
  22.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);         /* PB4置0 */
    6 K" y# M: p9 _
  23.     HAL_Delay(500);
    ( L# U# X6 a+ C& u1 Y+ h- S& ^; q& Y$ X
  24.   }
    # J' G6 C; p# a( J, ^/ D5 M
  25.   /* USER CODE END 3 */
    - S* h- h2 Z9 I1 e/ L0 |- F
  26. }
    % N# r8 p4 ]# n
复制代码

+ b) j. _! O" u6 J3 X编写好程序后,编译没有任何警告和错误。可以直接下载程序MiniPRO STM32H750开发板中(使用DAP下载,请注意配置MDK),算法只需要128K的算法就可以了。
$ a0 |5 ~: A' A3 u4 \9 a, v8 _本小节使用STM32CubeMX新建的工程模板在我们光盘目录:“4,程序源码\标准例程-库函数版本\实验0-4 Template工程模板-使用STM32CubeMX配置 ”中有存放,大家在编写用户代码过程中可以参考该工程的main.c文件。3 x+ ~) a& M4 B0 |+ d: f
$ w  B! c( ?+ A% v3 a; J
10.4 STM32CubeMX新建工程使用建议
/ ^% a* z! f0 k5 w  O, G- m① 使用CubeMX的环境搭建工程,工程文件夹路径、文件名不要带任何中文及中文字符,否则会遇到各种报错;. r! R8 ~5 n# m, i% C: ?! M$ p$ l
② 本书以新建工程-HAL库版本为基准来展开,不对CubeMX的使用过多讲解。使用CubeMX可以帮助我们快速搭建工程,使用户专注于应用开发,但STM32的开发与硬件密切相关,对STM32开发来说,抛开底层只专注做应用并不实际,毕竟无法使用一套通用设计来满足不同用户的需求;$ `8 f2 j$ J7 r2 {
③ 关于新建CubeMX的工程路径中有中文的情况的解决:. Q) Z* y7 Y. r$ J2 ?
如果我们配置的CubeMX工程路径里面有中文可能会报以下的错误:6 t( ?) r- Z7 W, p3 l: G' y
$ O  L  P! z" m( k4 ]' v
6a0ea7fc68a34b38b6cbbe29be45918d.png
- G: z; x( x- A' b* k2 `- f/ |' b1 V4 l% X9 b  z" P
图10.4.1 直接编译报错
2 C8 w; V5 n1 j; j/ S& P/ w  j造成错误的原因是CubeMX对中文的支持不友好,且生成的MDK工程默认通过工程中的CMSIS那个绿色的控件选择启动文件而不是直接添加启动文件(startup_xxx.s)到我们的工程中,而有中文路径时就会找不到,有两个解决办法:
+ f! N2 e- B' f& e) A1、用CubeMX生成的工程不要放置在包含中文路径的文件夹下;& i, @6 `) ~! [9 z
2、添加启动文件到我们的工程中,我们新建一个Application/MDK-ARM分组,把startup_stm32h750xx.s添加到这个分组,如图10.4.2所示:3 p6 N2 P7 Y" u: o9 U
: k9 i2 E" Z6 n) n  C$ F
eb03a007e4f7462ab26aed9c965a459d.png 4 ]8 j6 X+ H: q# s! S, O

" f" B/ x$ c4 \) r+ G, j; Y% p1 H图10.4.2 STM32CubeMX生成的工程目录结构- y. b2 Z! T* b+ g7 N, q2 j7 k
④ 关于配置的文件CubeMX工程(.ioc后缀)名字有中文的情况,我们建议重新新建工程或者把生成的工程文件重命名为英文。因为带中文的CubeMX工程生成的MDK的Output目录有中文,MDK也会报错,尽管可以重新设置MDK工程的Output目录和添加③所描述步骤的启动文件,使本次编译通过,但下次重新用CubeMX生成工程时,仍旧需要重复修改配置。
& o% ^/ B# f: o5 q/ d————————————————- x" R1 a  ^6 t
版权声明:正点原子
' e- e* U$ _! ^6 h" G, ?
: {* e  [' S- I* ^
赞 收藏 评论0 发布时间:2022-10-5 22:11

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版