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

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

[复制链接]
STMCU小助手 发布时间:2022-10-5 22:11
STM32CubeMX简介8 T7 ]  c( F3 ~$ P2 p
STM32CubeMX是由ST公司开发的图形化代码自动生成工具,能够快速生成初始化代码,如GPIO、时钟树、中间件等,使用户专注于业务代码的开发。现在ST主推HAL库,经典的标准外设库已经停止维护了,新产品也只提供HAL库的代码,因此,我们学习HAL库是更加有优势的,由于HAL库具有低耦合、通用、抽象了硬件层,使得开发者无需太过关注硬件驱动的实现,使得开发更加的简单快速,更容易维护,因此被越来越多的产品所使用。
& }$ C9 r& t+ D, x: h+ u: ?
& }& J' O" P" j10.1 STM32CubeMX的作用7 S- Z  Z+ P2 Y2 G" r! \
STM32CubeMX具有如下特性:
5 q! y2 n( G$ {9 i①直观的选择MCU型号,可指定系列、封装、外设数量等条件
8 G; c- ?/ _! y% {" m& g②微控制器图形化配置
1 A- e9 ?( j) E" \* A+ p% M4 o, C③自动处理引脚冲突
2 N9 N- U" t7 ]' C# L④动态设置时钟树,生成系统时钟配置代码& Z" i0 U: q( i: o! l
⑤可以动态设置外围和中间件模式和初始化6 V3 v1 C) `2 p
⑥功耗预测' ]5 P2 O( d; z, ~7 o) \+ }8 e+ ^
⑦C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC
/ C  N4 a; q7 M) `⑧可以独立使用或者作为Eclipse插件使用& V* l% D8 _7 w3 G; Q
⑨可作为ST的固件包、芯片手册等的下载引擎' K% ]+ F! d- j2 W" d" d
这里特别说明一下STM32CubeMX和STM32Cube固件库的关系,STM32CubeMX图形工具配置生成的代码,是基于STM32Cube固件库的,并且可以在图形工具中直接下载STM32Cube固件库。也就是说,我们使用STM32CubeMX配置出来的初始化代码,兼容STM32Cube库,例如硬件抽象层代码就是使用的STM32的HAL库。不同系列的STM32芯片,会有不同系列的STM32Cube库,而STM32CubeMX图形工具只有一个,所以开发不同的STM32系列芯片,选择不同系列的STM32Cube库即可,它们的关系如下图所示:
+ \( w- {6 Q* U( U- W6 C1 z) m( P+ A6 ~8 i  t6 w
6b8824c5e64c4b7e8b2482a2719054dd.png 9 c! v/ X/ V5 Y+ Z
* E2 t: H$ I$ A' ~
图10.1.1 STM32CubeMX和STM32Cube固件库的关系: O. \: Y" N$ S3 C9 j3 _
当然,自动生成的驱动代码我们不去仔细专研其原理的话,对学习的提升很有限,而且在出现BUG的时候难以快速定位解决,因此我们也要了解其背后的原理。( L) Y& q" q  Y1 N7 |5 \2 \

; i! }9 h- r/ ~, ~10.2 安装STM32CubeMX9 |: |& j: S7 F9 y2 o! M
STM32CubeMX运行环境搭建包含两个部分,首先安装Java环境,再安装STM32CubeMX。- T  r+ O& e2 F
10.2.1 安装JAVA环境
% |7 x. s5 N+ U& k安装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所示。! T5 Z3 n! C3 ]2 r

1 i) q* n5 Q  S" {7 g# w 2aaa03ac1cf241f5a32442a4c5c55cb8.png # d4 ^( A) Q1 F4 h* s

; [9 o. {. Z5 Q) L9 G* W4 p6 M图10.2.1.1 Java安装成功提示界面
# q- |5 O" z0 r+ W安装完Java运行环境之后,为了检测是否正常安装,我们可以打开Windows的命令输入框,输入:java –version命令,如果显示Java版本信息,则安装成功。提示信息如下图10.2.1.2:; ]: N( }! b; x6 ]6 j  R
2 n6 p9 x" a  y
01f42aa2fd474bb6a4fd0c265fbafe73.png : N" e# K$ M; F  t* A
/ g9 ]" @( Z% M+ i7 U  n
图10.2.1.2 查看Java版本- p* u7 ~2 Q0 j; C
10.2.2 安装STM32CubeMX, S0 O/ Z( [8 n( `% i0 C
在安装了Java运行环境之后,接下来我们安装STM32CubeMX图形化工具。该软件可以直接从光盘资料获取,目录如下:A盘6,软件资料1,软件3、STM32CubeMX,也可以直接从ST官方下载,下载网址为:https://www.st.com/en/development-tools/stm32cubemx.html# K0 k* Y, Q# @9 R0 l, ~& y% ?
接下来我们直接双击SetupSTM32CubeMX-6.3.0.exe,安装步骤如下。
0 ?& y6 Z3 S3 W, b+ V
; }! o6 p4 V% j2 u4 n6 o 42c4e54ffb48491e9b2814ab84fc068a.png   H+ Z. r" o* b8 P- U( C
/ V. A; V8 |' c: x$ b  c6 w
图10.2.2.1 启动安装0 H, t7 H# \0 D: R4 a. }
, A+ O$ {9 l1 q# o; S/ D" ~
78896877c4844d9584030f54e5887e99.png * d: k0 X% h2 E. K  F
, H8 l; Z& l$ R6 T) t5 g
图10.2.2.2 接受本许可协议
) C) X% s& j- n# |: ]+ m
# J) M4 ~* v, e( N$ C 24b220122f5b4843bb66b5d54e20b207.png % j, P/ d: u, s4 d

9 h+ C; g) r$ S. F- ]图10.2.2.3 勾选第一项即可% C. c8 L! w6 r" o* N9 _

( f( ?; a! X2 \4 ^ 7d9b175a87d44ff990619eceac292534.png 4 `! P1 ~. H+ G
6 N' Y% D2 Z' }
图10.2.2.4 指定安装路径( n) B! ^/ `: P0 }  S% z

% c9 R5 q# H, m; Q dbc882d3cbe34570b894bce804032203.png 7 o) m" A7 g; m) v  J9 v/ m( Y# x

0 A) j' ^8 A9 p图10.2.2.5 创建快捷方式
* m# w+ n" k' B% S* a" u- g& R" r9 n* ~! F$ n1 L
ca5159540b774ee08b71fd26dfe7683a.png   h5 t+ j" W* H. `* r
' A3 s& v9 E) @3 ^- e8 C( Y- D
图10.2.2.6 安装进度提示# O: K" X5 l2 M6 L. |. J, m
  I$ `/ m2 q% k8 |" M) a
e393a885bc8948d9af990e34addede36.png
& ]% C* [, u/ g) `( J
; k5 K; m, E9 N; T# W1 Z; ?8 m图10.2.2.7 完成安装
- S0 |+ d& O) T. N- Z0 f8 l* c# q9 Z5 `0 N7 I+ T2 B. K1 ]3 J. k
10.3 使用STM32CubeMX新建工程( g, M" z4 }: I
大多数情况下,我们都只使用STM32CubeMX来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在STM32CubeMX中完成的,需要用户自己根据需求来实现。+ \5 Y* H( Q/ F) [) p6 [
10.3.1 打开STM32CubeMX
0 \  r& X% {# A8 r- @* F双击桌面STM32CubeMX快捷方式图标,如图10.3.1.1所示。
3 f; y) o: z+ T& f. h+ R! ~
& Q; i8 ~. N* I/ c7 R; } 08f4e903d63c4d6c96acca79a0a54137.png . C) j  P) v8 u# {

5 R, b# |' A8 c& s! x% S图10.3.1.1 CubeMX快捷方式
' g$ @5 [- T$ i8 l7 W- C( l打开后CubeMX主界面如图10.3.1.2所示。! s% ]' w- e4 i  Q

3 V$ z+ l2 Y5 B  O f76372a7f0ba458db3f683a0d519e22f.png
: i# M: t5 Q/ o( C. V. k  P: s; v, X* a
图10.3.1.2 CubeMX主界面7 `( o: y% X4 N& G
2 _8 h' h  H9 B( K
10.3.2 下载和关联的STM32Cube固件包
: M5 R& g) T' R: H我们知道STM32CubeMX图形工具只有一种, STM32Cube固件包却有多种,需要选择我们工程对应的固件包。
& q8 H1 H8 R# w3 y为了方便,新建工程前,我们先来下载和关联STM32Cube固件包,点击Help->Manage embedded software packages,如图10.3.2.1所示。# J% j8 a! H5 T( `& K0 q' ^) W
0 H/ T! a5 i2 t3 u  c8 u
fe1b49e0023047c58b2e4b54efc0f664.png
$ C% Q& O. c7 G; ~! H% {7 H2 \5 p- K
图10.3.2.1 管理固件包
0 [7 V8 w0 D# ^( |然后弹出管理界面,在该窗口找到STM32H7列表选项,勾选1.6.0版本。这里选择1.6.0版本是因为我们的光盘的固件包是这个版本的。关联STM32Cube固件包有两个方法,如图10.3.2.2所示.
1 X" |6 `' M# O
9 h: {6 S4 b7 ~5 C- k. P6 e 2521539f00184e71af5ca5d5c22c37a3.png
) x  O. K+ k6 ~" X' U0 y0 z6 g" q9 g! v& O8 X6 k- \. k
图10.3.2.2 下载和关联STM32Cube固件包- c0 ]" \/ q/ k7 p: C7 r# E, S
方法二:下载好之后,会自动关联,所以不需要多讲什么。7 Z7 X- F  ]0 y, N. k+ n
方法一:点击后,弹出下面的窗口,然后选择光盘中的对应的固件包,注意这里是压缩包的形式,如图10.3.2.3所示。, K" k: c5 ^4 T  }4 ~

6 ]( Y2 H& i; k0 d% m4 R 3caae082e1b34342a9c1ebb0ccb237f5.png
" U% @6 E6 f# I4 B% {" k& x
& n; ]" H- X% `$ Q+ e图10.3.2.3 关联本地STM32Cube固件包
- M1 [+ b' q, ?% [
8 h* c) d- o# q! B; K! o 2d3e8bc463da4cc6a4f5c04f2938caa8.png * {1 T' o: h2 \2 T; N, q
' S8 F( T' Z1 \5 Q8 a/ s& z
图10.3.2.4 等待关联/ O) e6 p# c1 \4 _/ R
* p1 K' `& y$ }' `+ a. |: [
2beab16e1d644c66a13be05e9a731712.png ! r  f: o* s5 E2 n) i
5 k- L0 e, ^/ f9 Y
图10.3.2.5 关联成功$ M; o% s+ b' ~4 r2 D0 i* r
关联好固件包我们就可以开始新建工程了。' }  c- _. Y- ~$ C( f

" K: {: V7 A; i& O" M* {4 f5 {$ T10.3.3 新建工程
+ C5 m, W  F- O9 e. ]' v使用STM32CubeMX配置工程的一般步骤为:
1 T3 D0 ^8 G* ]7 f8 R7 x+ t1,工程初步建立+ [  |8 k, h" G
2,HSE和LSE时钟源设置
) f! t' b- f9 E4 y; g3,时钟系统(时钟树)配置
2 J; ~0 i, t4 o9 Z4,GPIO功能引脚配置
3 i& M2 }2 J  W7 c! t% t5,Cortex-M7内核基本配置(限定项)
) E+ n& n7 ~6 J6 B- A# q6,生成工程源码, ?- j( |; `3 I9 G  O' C
7,用户程序6 H7 q* F3 V9 f8 P  }
接下来将按照这7个步骤,依次教大家使用STM32CubeMX工具生成一个完整的工程。
. F9 P! N$ ~1 ~& c! }1 工程初步建立
5 C. F) R6 U6 h) M- i# t; I方法一:依次点击“File”,“New Project”即可建新工程。如果之前打开过的话,左侧最近打开的过程一列会有打开的工程列表,直接点击这些工程也可以打开。# `" {$ s5 S, Y9 _
方法二:直接点击ACCESS TO MCU SELECTOR。0 F4 a& w! L+ D3 q( D
具体操作如图10.3.3.1所示。
& r8 `0 L% Q0 R6 f0 z4 l4 y
" m! z! V& K( \ 9d88191b91d2453798558b2fab3013cc.png , ?& {5 l( E4 X7 g( I% e
: P  j% j4 ]8 b0 @
图10.3.3.1 新建工程( v% a2 e, s3 s# B! g, q+ u* p% \
点击新建工程后,第一次可能会联网下载一些的文件,可能等待时间比较长,可以直接选择取消即可。
2 P/ s, B' r( b6 H0 \9 E7 u% l' N6 K3 `/ k9 i
f2b8d735c6844bbdb2f3a0b207cf4c12.png 7 n9 s3 v- @$ R2 X( R
+ T, w! w+ V# I3 F9 g& H' P: V/ w
图10.3.3.2 启动时联网更新检测! \- F9 N5 R8 U; p- E
之后都可以进入芯片选型界面,如图10.3.3.3所示。. t" f0 \! P# X. ]8 O* t

* F8 D' Y, t0 |; P) I 04fe32f9e9e34cd280d2971a15291eba.png
0 k) W7 a% a, Y7 Z
" O6 ^* E) I" L+ ^图10.3.3.3 芯片选型界面+ o. j/ v, I( e$ @
选择具体的芯片型号,如图10.3.3.4所示。
* z$ f3 W& l  X: n7 Y/ f( {1 N; A: b3 q& [0 i/ T7 E8 r
5ef380dee8164135ba87012e1f1b5d14.png
, s" F2 R& Q/ e' J
* D* N( R! L. d5 _9 ?. E图10.3.3.4 选择具体的芯片型号
' C8 ], B0 f1 S! J8 k选择了芯片型号后,弹出主设计界面,如图10.3.3.5所示。' [# F( \5 D, y4 `7 [8 F
8 @' o% C6 c- ^/ L3 d9 d, t9 G  C
2f8bafee018940a5bf042381fb138238.png
; r, {2 ^& t& w3 o& R4 K+ z( l/ h# e
图10.3.3.5 主设计界面
% q1 G2 ?$ d5 p1 g) R" s2 HSE和LSE时钟源设置
& {0 u0 O  M" W$ u' v' R2 V进入工程主设计界面后,首先设置时钟源HSE和LSE。如图10.3.3.6所示。3 g  f5 m$ q  w  {( h. w/ q

) w2 }% ~# P0 V0 R% \ 58e319bb3c794065bcf122aa759ba45f.png % ?  Z9 P3 U7 W7 n& M
: E- [) b$ n* ]- J1 Y. [
图10.3.3.6 设置时钟源HSE和LSE# i+ B3 e! o% |) z
图10.3.3.6中的标号3和4,我们都选择了Crystal/Ceramic Resonator,表示外部晶振作为它们的时钟源。我们开发板的外部高速晶振和外部低速晶振分别是:8MHZ和32.768KHZ。所以HSE时钟频率就是8MHZ,LSE时钟频率就是32.768KHZ。8 E. D( S: Q1 O' Z# V6 U+ e
选项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的自动冲突检测功能。
2 n" b- x* t+ U% V' N. P2 @, b3 时钟系统(时钟树)配置
" C' j, Q; ?/ l) [4 P7 m1 b点击Clock Configuration选项卡即可进入时钟系统配置栏,如下图10.3.3.7所示:0 X* K( m& |8 B

, l+ _2 o  x4 N$ @7 Q ab3ebcd95b9f4b01b4f51d4557233736.png / e* o7 B3 z3 n9 \5 n
+ W+ R$ }! L0 \  e2 E9 [, ?6 k
图10.3.3.7 时钟系统配置栏' e$ p' N: X3 o% u5 T1 s3 F
进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32H7时钟系统框图。从这个时钟树配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。
# D. r5 S3 D3 S  x; S$ J  z. b这里,我们将配置一个以HSE为时钟源,配置PLL1相关参数,然后系统时钟选择PLLCLK为时钟源,最终配置系统时钟为480MHz的过程。同时,还配置了AHB,APB1,APB2、APB3、APB4和Systick的相关分频系数。由于图片比较大,我们把主要的配置部分分两部分来讲解,第一部分是配置系统时钟,第二部分是配置SYSTICK、AHB、APB1、APB2、APB3和APB4的分频系数。首先我们来看看第一部分配置如下图10.3.3.8所示:% O) D0 c" x: B
' V& n% g) h; y: i  C
4f007c4bfbef4bd5adf42f41ca5ca410.png 5 g/ B, o8 H2 {2 a: ^" K! U
+ n+ F& C0 ]* G! Q2 f' X
图10.3.3.8 系统时钟配置图
& R8 M8 _; b1 |1 S$ q6 J9 `! r1 |我们把系统时钟配置分为七个步骤,分别用标号1~7表示,详细过程为:
$ Q5 q. v$ U; _. F1、时钟源参数设置:我们选择HSE为时钟源,所以我们要根据硬件实际的高速晶振频率(这里我们是8MHZ)填写。
+ ?1 D: ]5 P3 \2、时钟源选择:我们配置选择器选择HSE即可。; S( `* v+ T1 d* X
3、PLL1分频系数M配置。分频系数M我们设置为2。- f4 ^- k- u- `: A9 e: T- @
4、PLL1倍频系数N配置。倍频系数N我们设置为240。( K5 V* Q2 Q$ x- V$ r- c9 {5 \
5、PLL1分频系数P配置。分频系数P我们配置为2。
6 e4 ~6 e6 C5 Y* m6、系统时钟时钟源选择:PLL,HSI还是HSE。我们选择PLL,选择器选择PLLCLK即可。
( F0 O) @# t* d3 s% ~* S7、经过上面配置以后此时SYSCLK=480Mhz。
' Z; c, H; Y* r# R  _; S8 g+ O经过上面的7个步骤,就会生成标准的480MHz系统时钟。接下来我们只需要配置AHB、APB1、APB2、APB3、APB4和Systick的分频系数,就可以实现sys.c文件中的sys_stm32_clock_init函数配置的部分时钟系统。配置如下图10.3.3.9所示:& A) \# |( o1 ~# T$ e
( l) A$ z( {& @- W& [
20380754b67542f485169ea6c225ed4f.png
& G- n. p% Q5 m9 c6 G6 ?% q
8 v6 Z" x6 k' g# _8 P图10.3.3.9 AHB、APB1、APB2、APB3和APB4总线时钟配置/ o  v0 e! P& R+ B$ `. a
AHB、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函数配置的时钟是一样的。+ f) N! j+ W3 `+ L8 `/ A

$ i& C) s  A+ C1 h% Z. X4 GPIO功能引脚配置
8 x7 U' ~% j. N/ j  o; w3 g本小节,我们讲解怎么使用STM32CubeMX工具配置STM32H7的GPIO口。MiniPRO STM32H750开发板的PB4、PE5和PE6引脚连接一个RGB灯,我们来学习配置这三个IO口的相关参数。这里我们回到STM32CubeMX的Pinout&Configuration选项,在搜索栏输入PB4后回车,可以在引脚图中显示位置,如下图10.3.3.10所示:' E9 ?. H9 S2 u* ]# F5 y7 E

7 A  H9 B8 r- w: ~" @, f e29207bb74bc422491c2d53bab79f936.png
1 O8 W& }6 |  ^7 Z) N7 P, n1 V1 ?9 T/ m- w
图10.3.3.10 搜索引脚位置: c9 ^% ~  s  F5 C* G/ A# c9 Y
接下来,我们在图10.3.3.11引脚图中点击PB4,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。操作方法如下图10.3.3.11所示:* N, I4 ]: U+ N. u. s/ ^
/ ?5 B1 q% i/ c6 L
8cc19553781b4ee0a36d288e809846cc.png
- E9 O3 D) E" U# e5 v6 Q( Y" H
  l% i( G1 {  T+ \! d2 t4 j  o! n8 A& V图10.3.3.11 配置GPIO模式
& D) s7 d- l9 G0 X$ {同样的方法,我们配置PE5和PE6选择功能为GPIO_Oput即可。设置好即可看到引脚从灰色变成绿色,标识该管脚已经启用。这里我们需要说明一下,如果我们要配置IO口为外部中断引脚或者其他复用功能,我们选择相应的选项即可。配置完IO口功能之后,还要配置IO口的速度,上下拉等参数。这些参数我们通过System Core下的GPIO选项进行配置,如图10.3.3.12所示。
* X: O* ?& P2 d# G! g& w8 v$ w  P* Z
9373fbb950ab4c8d9d94241868fefccb.png - a* _4 o- S$ W

0 P) b2 d) z+ _' X图10.3.3.12 GPIO选项
& p" R' d  P  }" q  b我们先配置PB4,PE5和PE6配置方法一样的。点击图10.3.3.12的2号框里面的PB4,配置如图10.3.3.13所示。
" T5 O0 D, m! l: c" h8 m1 G  R- s
" ^8 j& E/ |. }+ y  c e993781fe3204a7a9079d1cad26ac8ff.png 3 p# y+ P. V& A' A  q; B0 `

6 `0 y6 A  g# O  V图10.3.3.13 配置GPIO口详细参数' Q2 o, K7 X$ W- `& v
GPIO output level是IO的初始值,为了开始让RGB灯熄灭,我们设置初始值输出高电平。
  ~( @3 S/ h( n4 h+ z2 zGPIO mode默认是推挽输出,不需要更改。5 C+ J9 j9 Z8 L, ?; O
GPIO Pull-up/Pull-down默认是不上下拉,我们改为上拉。; `9 o( t! |7 r7 D% w, s* h# N* x
Maximum output speed输出速度配置,默认是低速,我们设置为中速(可以不改)。
( o9 V7 _# p/ U) n0 H3 O6 mUser Label用户符号,我们可以给PB4起一个别的名字。& H- C, A7 h6 u& y+ h
PE5和PE6也是按照这样的方法配置即可。
% Q/ _, e' I  K* h# f5 Cortex-M7内核基本配置2 n' t9 k: h' q6 K& D" j$ |- |3 l. Q
这里我们主要配置Cortex-M7内核相关的参数。我们依次点击Cortex_M7 进入配置界面,操作过程如下图10.3.3.14所示:- A- a8 n8 V" [
! V% u5 A. o: {) k
0628c60d36a342b4a2281df87bd74956.png
8 M+ B. E7 o5 `. R+ `
/ r+ Y8 M: K+ B1 L) y0 E$ g8 }图10.3.3.14 Cotex_M7配置
0 Y- v# ~! s0 S' o' J/ T8 {该界面一共有两个配置栏目。第一个配置栏目Cortex Interface Settings下面有两个配置项:
! W' `7 S' a7 T' r9 f" b0 B8 t' X
1.CPU ICache:使能I-Cache。8 N+ r) |+ V0 X) \0 L# @9 q# L
2.CPU DCache::使能D-Cache。
! N: H& H% Q$ {8 G0 p/ ~) Q7 \: K$ k+ R上面这2个参数是CM7内核相关配置。第二个配置栏目Cortex Memory Protection Unit,是用来配置内存保护单元MPU,在我们后面的实验会讲解MPU配置。
( I- D( {. k3 f, v' \8 ]$ G' o; Z6 生成工程源码8 ^6 X) C3 z6 I, J7 \
接下来我们学习怎么设置生成一个工程,Project Manager-> Project选项用来配置工程的选项,我们了解一下里面的信息。
- ^% |, N: c. M  {+ e6 d& AProject Name:工程名称,填入工程名称(半角,不能有中文字符)" G2 K9 j3 r9 \& n. Y
Project Location:工程保存路径,点击Browse选择保存的位置(半角,不能有中文字符)4 r1 j3 s1 C+ f0 W4 R( h/ c: L# N
Toolchain Folder Location:工具链文件夹位置,默认即可。
0 X, k* Z" }- e  b  Z  XApplication Structure:应用的结构,选择Basic(基础),不勾选Do not generate the main(),因为我们要其生成main函数。+ W! G4 A8 K! H. o) r: t% Q" R7 K
Toolchain/IDE:工具链/集成开发环境,我们使用Keil,因此选择MDK-ARM,Min Version选择V5.27(最新)。2 [' ~8 ^: j: X. L) w% h/ ~9 y& L
Linker Settings 链接器设置:
. A: {, T0 B; XMinimum Heap Size 最小堆大小,默认(大工程需按需调整)。9 Z9 j7 s% t. x0 C- x
Minimum Stack Size 最小栈大小,默认(大工程需按需调整)。2 A; A/ a( f; q. d. [0 K* Z4 U
MCU and Firmware Package是 MCU及固件包设置:
( D9 o5 \1 U7 OMCU Reference:目标MCU系列名称。
) t* ^! g$ {1 Q9 F, A+ S* s0 F+ hFirmware Package Name and Version :固件包名称及版本。7 h! p$ U, A2 Q: F7 b1 V' b( x/ _
勾选Use Default Firmware Location,文本框里面的路径就是固件包的存储地址,我们使用默认地址即可。(这里因为我有两个版本的固件包,所以它默认使用最新的,这个关系不大,就用新的)。 最后工程配置,如图10.3.3.15所示。3 M; \/ s! ~- {& ~  P

$ k! S) T; p) X' J2 S5 L* { 2cef5102baf548b483433a1cb8784ae6.png # s7 M! f# p6 X4 w7 G

4 X; ^; Y: C( q8 p. A8 E图10.3.3.15 工程配置
* h! M) z2 [% E4 D8 ~% g; l打开Project Manager-> Code Generator选项,Generated files 生成文件选项,勾选Generate peripheral initialization as a pair of ‘.c/.h’files per peripheral,勾选这个选项的话将会将每个外设单独分开成一组.c、.h文件,使得代码结构更加的清晰,如图10.3.3.16所示。
) O4 z% T1 ~( e- O! L5 m. P; `: K5 M! P& v
a6fc082692d74979982c6dbd15894bcb.png
7 ?7 h1 S3 Z/ N; M9 M3 h& H+ `% {. {8 k9 ^3 g; I8 Z! I1 ~
图10.3.3.16 代码生成器设置. n; F5 _; _8 @1 F- S$ O$ ^2 j$ g2 ], N
至此工程最基础配置就已经完成,点击蓝色按钮(SENERATE CODE)就可以生成工程。
0 S* D5 w7 t; z& Q: h$ k* K2 T+ G+ I) D
018411a849b843e2a465e6647cf48528.png , o/ G6 a/ o, q4 [
0 f$ c4 i1 n  P  {3 Z8 P  V2 F
图10.3.3.17生成工程( B4 [/ k" o* t
在弹出来的窗口中点击Open Project就打开MDK工程。
: a/ k8 F8 K4 l7 M; u# u$ ~
  m" v% _# h- a& ]  p* y ad2edfbe13f04b14bfbd0f1d48d477ab.png
) i& z. p3 a$ M. S& B& i  i
0 a. j8 P) U+ ^+ H" j% K/ ~图10.3.3.18 打开工程
( N/ w$ s# y, O1 I完整的STM32H7工程就已经生成完成。生成后的工程目录结构如下图10.3.3.19所示:
/ B1 [" Q4 p% A' Q% c! F
+ ]) Q* {6 _5 W- n  j) X5 q 395ce43578ab42e1b2791ab5abf69fa0.png
) _) _) S! {1 q7 L, v: r& x! a: ]' \7 I1 M1 F9 L; E- T
图10.3.3.19 STM32CubeMX生成的工程目录结构
& n2 e/ j. {: t, \/ |Drivers文件夹存放的是HAL库文件和CMSIS相关文件。8 p# U) h) s0 J/ j! q4 W/ l
Inc文件夹存放的是工程必须的部分头文件。
1 x( b1 _5 F8 r$ J, BMDK-ARM下面存放的是MDK工程文件。, \3 K* }7 f! x9 g3 z# }& b
Src文件夹下面存放的是工程必须的部分源文件。
, I. Y- p% r5 c4 k9 ]5 GTemplate.ioc是STM32CubeMX工程文件,双击该文件就会在STM32CubeMX中打开。
) S$ `( l7 O$ }7 a
, H; k+ D$ {( U2 s9 M* u* _7 用户程序
3 |) l5 P. t) e在编写用户程序之前,首先我们打开生成的工程模板进行编译,发现没有任何错误和警告。* k4 F1 ~0 X; i- s( e# g5 S
接下来我们看看生成的工程模板的main函数,这里我们删掉了源码注释,关键源码如下:' b/ K" F2 @, X
* t5 E- L+ H1 C: f. F7 R! T
  1. int main(void)3 o1 ^) b2 T$ N: I2 G
  2. {
    3 P5 F% k5 j, D1 e$ @6 b
  3.   SCB_EnableICache();
    . u/ X) @: O5 g$ t$ }; t$ o4 c
  4.   SCB_EnableDCache();8 ]: v5 [% Z4 a, T2 m: S# K  x4 |
  5.   HAL_Init();: V' j; ^4 Q! J; v2 z
  6.   SystemClock_Config();; j( F) F8 R9 a0 a) c0 A
  7.   MX_GPIO_Init();
    ' p: @3 r2 D# ~
  8.   while (1)( P3 g) }" E9 ]) K
  9.   {8 O4 Q" e9 l- s# t9 v* ?
  10.   }: Y7 D1 u' q/ R  y, A
  11. }
复制代码
2 m; Q* u. r' O- O
大家需要注意,STM32CubeMX生成的main.c文件中,有很多地方有“/* USER CODE BEGIN X /”和“/ USER CODE END X */”格式的注释,我们在这些注释的BEGIN和END之间编写代码,那么重新生成工程之后,这些代码会保留而不会被覆盖。9 o; m) C, y' I) F# i$ [
我们编写一个跑马灯的用户程序,程序具体如下:
5 r7 }. h3 l9 n; ^6 }0 A) T
6 U5 O# K/ |7 |$ d% N7 E0 d$ p
  1. /**# Z8 O$ D: F1 A5 z# a8 l; g
  2.   * @brief  The application entry point.) U' w+ G8 u' v, y
  3.   * @retval int
    : L' `1 V, S: d' q$ R* E0 H
  4.   */' ^, F) f: `, y0 n2 ~  e# H
  5. int main(void)% ^. C; z- O1 w$ i, ?  r1 l: P
  6. {% M$ A/ a6 x7 I9 P, t
  7.   SCB_EnableICache();  u9 H( o! `' i+ N
  8.   SCB_EnableDCache();% b( }, s2 z: w, M3 e, S% S. r( o
  9.   HAL_Init();
    , c0 k5 F$ F# Q" }+ W. \- d
  10.   SystemClock_Config();
    & g" ]; J, `& r9 |% g0 w
  11.   MX_GPIO_Init();) H5 I$ }# l! n! c: c
  12.   while (1)( D" @+ |) ~7 Y6 q: z% h- q1 P: v2 J
  13.   {
    , |2 r4 N$ F: k$ q0 C& X1 l1 J
  14.     /* USER CODE BEGIN 3 */
    ) }! x( Y+ d9 B' y1 U
  15.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);            /* PB4置1 */
    / Z- l" F4 H4 D. f$ O( s9 E7 q$ n- D
  16.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);         /* PE5置0 */ % Z% l/ t" L' u1 o
  17.     HAL_Delay(500);/ ^$ R' a* t) L. i; a9 I
  18.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);            /* PE5置1 */
    % H! V/ G, O4 @! _3 P* r2 b
  19.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET);         /* PE6置0 */
    " R$ f+ l- _3 H  x
  20.     HAL_Delay(500);
    9 A+ L3 Q# ~$ q4 B, Y
  21.     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_6,GPIO_PIN_SET);            /* PE6置1 */- y9 u5 p1 e& O. K0 c4 L# h& Y
  22.     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);         /* PB4置0 */
    ! D% g' R. K5 t$ O- ]; Q& A
  23.     HAL_Delay(500);
    ( x6 b7 C5 }* Y  k: m
  24.   }
    ; n5 v% S) b8 ~- U1 E7 x
  25.   /* USER CODE END 3 */# P( _  A: P# S- v" R
  26. }
    3 \: m  j5 ]0 G+ s0 j  e
复制代码
- [) H# Z$ Q' o' |
编写好程序后,编译没有任何警告和错误。可以直接下载程序MiniPRO STM32H750开发板中(使用DAP下载,请注意配置MDK),算法只需要128K的算法就可以了。# p) ^' ~( K: n7 i4 g; G
本小节使用STM32CubeMX新建的工程模板在我们光盘目录:“4,程序源码\标准例程-库函数版本\实验0-4 Template工程模板-使用STM32CubeMX配置 ”中有存放,大家在编写用户代码过程中可以参考该工程的main.c文件。, z* M8 M: s  M) Z

( M/ X- T" P5 f( B; _6 o8 s8 e10.4 STM32CubeMX新建工程使用建议8 C- G6 h1 O2 C4 x8 M
① 使用CubeMX的环境搭建工程,工程文件夹路径、文件名不要带任何中文及中文字符,否则会遇到各种报错;* ^6 o% }/ ?  j% i
② 本书以新建工程-HAL库版本为基准来展开,不对CubeMX的使用过多讲解。使用CubeMX可以帮助我们快速搭建工程,使用户专注于应用开发,但STM32的开发与硬件密切相关,对STM32开发来说,抛开底层只专注做应用并不实际,毕竟无法使用一套通用设计来满足不同用户的需求;
) P, O9 Q! L) \+ e; c' F& R③ 关于新建CubeMX的工程路径中有中文的情况的解决:  o/ y0 ^6 T$ r6 C
如果我们配置的CubeMX工程路径里面有中文可能会报以下的错误:
0 u3 O% f+ ?. F5 T  I  }1 y% u- [$ A$ J" P1 L6 b& y
6a0ea7fc68a34b38b6cbbe29be45918d.png
) K' G0 ?$ L/ s1 j2 D8 o. |7 X: v
5 i3 y. V5 d" d图10.4.1 直接编译报错( X, _$ e; f- }8 o1 l
造成错误的原因是CubeMX对中文的支持不友好,且生成的MDK工程默认通过工程中的CMSIS那个绿色的控件选择启动文件而不是直接添加启动文件(startup_xxx.s)到我们的工程中,而有中文路径时就会找不到,有两个解决办法:) k  q- z' Y: }' ?- z5 j. F
1、用CubeMX生成的工程不要放置在包含中文路径的文件夹下;
7 g+ J3 n* ^' t; Z) |7 Y; L# N4 |2、添加启动文件到我们的工程中,我们新建一个Application/MDK-ARM分组,把startup_stm32h750xx.s添加到这个分组,如图10.4.2所示:3 n# E8 v9 e0 A3 P+ R

7 e: ~7 T& ^0 a  m7 |% M eb03a007e4f7462ab26aed9c965a459d.png 8 Z6 {$ a; o1 d5 f& j
/ F, Y& l# O: Q0 o- N8 t4 `
图10.4.2 STM32CubeMX生成的工程目录结构
$ ^% o5 Q5 B) l* v7 b④ 关于配置的文件CubeMX工程(.ioc后缀)名字有中文的情况,我们建议重新新建工程或者把生成的工程文件重命名为英文。因为带中文的CubeMX工程生成的MDK的Output目录有中文,MDK也会报错,尽管可以重新设置MDK工程的Output目录和添加③所描述步骤的启动文件,使本次编译通过,但下次重新用CubeMX生成工程时,仍旧需要重复修改配置。! E* j* E  p( k! Q6 B9 v- V
————————————————
; n8 ?1 T' b9 r1 L4 Q版权声明:正点原子, _6 N! z/ V. _6 x. m* z

6 K( y) h' Q5 u8 N
收藏 评论0 发布时间:2022-10-5 22:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版