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

【经验分享】STM32CubeIDE使用说明 —— Keil项目迁移到STM32CubeIDE

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。; E6 X4 O) l9 d
* @. G/ x# |  C8 C4 v
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。
* d9 G  A4 B, w" ^& e6 P5 _, [
(7[HULSY5M5PEDSVH0SCNGJ.png

! ~) m, |! @7 I2 q' e
4 ]7 g, @1 r9 y! d
STM32F103C8T6亮灯程序

' b" H9 D8 f0 t9 p$ a+ Y2 e& N5 a: X: S

! [( o/ v" t4 G$ r) Y        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。  Z; `4 T, D( V! ], m/ S

$ f* G% R' |$ I
LQZK{H7EQAWA61RTUWK%V.png

$ t  Y1 j4 z, n% J# Y: Q/ b* T6 {8 a0 k- o& g$ g/ i
创建工程文件夹
" d: y& t6 [" A

3 p, U9 h0 u! E  x+ p7 C% o) e$ V
  f9 R% \4 V, F" A/ g& l0 e( ?) j        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
( R$ s% \! ~% b9 K1 S! x; k. B$ y0 v+ b& I* d+ @- k* c. r
8TEZDA$)K%9UMIWWPVN9ETF.png

) v$ }5 h9 ]" z
: n  b3 F3 L" Y1 w4 b6 _
STM32CubeIDE默认生成的文件
8 D& W: I% ?# I, X6 n
, D# ]. R- p7 Q' i* _/ c

8 A9 Q5 i: j6 y- A这里简单介绍下这三个文件:: `/ H+ S/ O4 s( {+ j

0 k4 f6 L1 G) n, L- L7 V.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。3 ^* @* U' j/ V' }8 Q: S: i7 [
) g* H, G7 g) f9 k( Y+ z7 Q' n* Q- V
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。+ D5 l, C9 W/ u* d- X
1 P2 s2 \# d$ M" Z* K
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。( y2 e. o+ \& i

  Y% Y, ?; H2 d! Y. V; v1 g+ D, r
I`V)S98ZS_$KWFM(~TWT_GR.png
$ T- N5 p9 |! j# ^0 x! G

* i; J8 m* a* [$ ~
拷贝文件到文件夹
9 ?. y# g0 d$ x+ c$ z
1 @! |, Z& R: t3 d5 O) u) P6 Q& d
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。
- D# z/ h' \2 D% Y- f& u9 M8 F" E7 M5 a1 J( v
T027`8H%TGTW(@$GRR}6PMT.png

5 R: [8 A$ Y5 b3 y' K
& ?% G  o7 s: ~: \' K
删除工程
. [1 [) s* k1 q& ~6 J: W/ v
6 {( T( w) d- o9 ~8 p
7 N% B6 P6 d5 T; C
        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。
9 |* r0 z: Q& {, @
' u, R2 @4 k) f7 r
S46$GH6(T@P7OI1T3Y45CHN.png

1 u  q2 W- n6 n* r/ |% o
! k' I! a9 {) Q0 G5 F! w
导入工程
/ L3 W( J' G- B
        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。/ h' ]! P, d; u- T9 ?( H& \

2 y5 |: G3 n( v( J6 A
J4N[77]P9GFMSI0FA88[G51.png

/ r3 U7 q6 X: I+ [1 }  L1 d" L( v8 m$ C# K# h5 h
空工程
  v0 c; u  l- a0 Y+ ?1 Q

9 V! ^' r  a/ o3 j$ G1 i! M% K: r& U) Q+ q
         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
4 P: i+ p2 e8 l4 m) I, g. V% ?/ p2 _. N2 U1 \5 I& |. Q
4PORY)@%5RH[@6XRM4%2`EX.png
  f, K5 O1 b) {8 m, O" i
: U1 Z% o1 h8 g" j
打开工程属性

, |6 w$ T- P& ?, \6 r1 _' O9 B4 J  [5 B4 O+ z
4 F9 {; Q; a/ i- H  Q! `% e
        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。
# q$ A: H1 }9 I+ U! l! H! C: x3 o
2 X2 L* x! j  P' P2 K
@2)JR(2@}FYZR8C$S_(I5.png
3 z& y4 m# ~' d& P: a

/ g# ~4 g5 r% n  I
引入文件

' W% `2 p' o5 \3 \& D& y        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。  M) }- I% j7 Z, B1 L% ?  m

: o  ]: ?' v2 a* _
0XSZEA_]~9E1831BOK)13TR.png

: @) L6 K7 R" L% M9 _, A; T5 P3 h! Q
添加文件到工程目录
# R" }/ {0 L# w, C4 t2 ?) F
# g0 @( Q9 Z% ~0 ~' U( `. ^  O! v
! q  j4 R! Q% s$ l/ \! L9 H
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。. l! Y. k8 U6 l! ~

. S1 b" W+ w3 G# l! ^/ }6 t
%4N[(O9GS)PF8)KT{8K(W}4.png
, p" z8 l9 I7 E- ]9 Y  m
, M* u3 q; I6 ~. a% y# ^7 {
添加包含路径

1 X# U4 }/ E- E8 q5 k- x% c" w2 c* s
6 C: z+ e# w; P7 y( O6 ^3 i
        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。' Y* T8 ~: H" X* E- `/ f1 n6 j9 K

0 y7 O! z$ ^* a. c2 _- W, d; f
@H`V2L@ZMIU~8`4QX(C$(A7.png
0 K9 @' j1 [& b' {" H! }7 ]
  R. d" M5 ~) t0 H9 U
头文件路径

9 H. A; B- [: E5 k& x- T
& Q! ?2 B. y4 a; i7 A5 t$ m
+ f% c* ~' N, x# s7 A: o% n0 @        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
% a# X6 Y  k: I/ j* e5 a2 R. q
# q8 w) D4 q/ x6 l& x2 x
E(X3}HN71FN2$%5~Y@U8PYE.png
) ?( A3 T- Z) w
& F+ {# t! [% D* y$ i1 k
预处理符号

4 q" n; S, w& w! Z! ]* r8 u& m3 r. E! C  i1 N* \1 U' \
1 ^1 o  B$ y/ Z" O" S, T
        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。+ {2 j( H8 k" d' o# u
% q6 m% B5 f8 e) G
        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。
& M2 y2 i- ]& C$ {# b) y* u
& N1 ?+ N9 R4 w- @- q' T$ _; E
QK6JV~FV841NN5IC5_WP3TX.png
0 m/ G9 O& p4 q: A+ h0 D3 e; d" v

! G9 p  i1 b& l! w
删除不需要的文件
% f/ b$ j; l2 j+ ]3 ]/ ?3 p
3 T3 Q: `8 O( }4 y& b5 h/ S

; `+ O& M; n8 W* Q6 g" u+ q        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。- c0 ~5 ]: \* K
- w) Q& s- Q$ O% m4 C
1X[4G7}`U8A}GLRJ)U2`4S0.png

* {+ X4 z( v' A4 w4 G$ n9 V: D3 m" ~6 N1 ^- K4 ?" {" v
排除文件夹

/ G  X3 V5 e+ U/ w2 W& p+ ?2 p, O  }7 n) H
: ?& G0 r3 P- g$ c5 t
        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。; k1 ]$ Z9 l2 V2 Y4 t7 E
* t) x$ |6 z" L) M* D* C
{TH`}RR2](L1@QC07D%X8PT.png
. G0 ]0 ?) L4 B1 o7 B" c

6 |+ b5 A$ L, E& s/ `5 {+ o* `
排除文件夹选项
6 c% n2 u, Z. B; z

9 G( N- L$ S: B* U( V' V1 Y! Q$ U5 I/ K' }# f
        注意到这时候被排除的文件就会有特别的标志显示。9 E+ e; R+ O7 l3 c; f5 ]. K3 u
" b. d' k4 ~8 Z: {
~6V)0DQ[NITU@XKKVE1``]C.png
9 H8 x' d- v, B3 D' I- j
# N6 y9 H  d) H4 o! _7 O# t
排除的文件夹
/ Y2 d3 d4 ^! o- S5 e$ _- M6 i
. k1 q4 ]3 d4 X" C- W# s
# h+ c+ a0 N7 _7 }2 J
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
) D( S. E3 a6 E. A8 U% w/ W3 O
# x& w1 L( O' d
X1L955JB{4QB57PVS()39]L.png

3 k+ J4 C0 ?3 n' O  g. Z, v/ @3 ?0 i, }! [9 @) b! P0 d9 d
Core文件夹对比

7 A; Q1 t, E  ^) V- Y$ |0 }, T$ _
, E2 o+ D! I% U7 r: t- d/ P
        Drivers下第一级目录,没使用到的全部删除。
4 Z( X1 @# F1 w* R
+ }+ B- l( ~3 W8 b$ ~: k5 d1 B
D_RA2IDV@QBUWP5BK4E2S[F.png
0 ~4 d( y! k4 Y6 G  Q2 A

) u  \& W$ M6 c$ a$ }6 y0 B5 z& Y
Drivers文件夹对比

# e/ t% N* M! d+ _" @* ~6 K& Z4 I2 i% e& Q( s" W! a
' V- H# ^- f: n1 O' B% V
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
0 j( a; ^6 |6 [+ O2 e2 S! @" ~8 B; a% ?- {1 n5 U4 C
E[5RZZ0MBEZ2M(1])VZ_7_A.png

" q, Q0 ?2 h+ ]7 N5 y3 l% h: t9 D& b8 F% `. k7 p8 j! b
CMSIS文件夹对比
/ z; a, w& s9 U* i2 X
& M$ h) ?7 C# J- o" W7 b7 p  a' S
6 s9 n7 [5 m) k* b
        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。7 F7 i- a# n% E1 s( @

: a4 Z4 X1 L! ~9 Z) J) N
}~YY~Z6Z[R_F65RU071Q13U.png

, K% I0 g5 |& C
8 c: x" D" L4 \9 Q8 A
HAL Driver文件夹
( Z+ O/ }" r) |. X- {4 l$ O
: T, x6 o( E- J" F8 x$ y; ]
0 G7 @1 Q6 P* P0 J
        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。; _) S9 j* S7 A. N, e+ y4 a6 s
2 J6 t5 s# N5 H3 Q+ a$ e
BWTOV(`)SVF2DW0~U35_}W4.png

7 p/ B! i" y6 h2 ~( ]  a
) ^; x; V  `0 |" ], m; H! N
STM32CubeIDE编译通过
7 b) n0 U9 L8 q0 X  A$ o& D# D

+ n, f4 n. u2 k" E0 h& p0 p
% F" H! R, z$ |$ S        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。9 c9 `( k$ e" y
6 n0 x# k( X7 @: a# }4 n0 X
Q~I4GG({CFUKFJX2BP`5~2P.png
; B* A2 S5 F& E: p  p$ z
( ?; i% p+ d7 r# G7 o& n9 D4 X) j
Keil编译
& |2 G" B( U  G9 }$ h
& N. g; ]  H% m0 ^( z+ \. J
+ W5 J! i; u6 l/ t
        如果需要调整优化等级,则可以再下图所示位置调整。# x4 y- Y3 v7 g9 c0 G! f* \$ G

. S. c1 l: B6 n
WSF@(%LYTF21TEC}ZRV7POD.png
9 l: [6 u) ^3 {/ x. t

% B2 t) n% O7 e% D9 g* d. v
调整优化等级
6 V" N5 b* M6 @$ k

/ s& G, a. l9 r8 L# a7 V4 U4 }8 L% V( C4 m5 U* Z9 J$ C
        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。
0 r) p) }2 y4 s$ k1 }: k7 X$ Y& ?/ t) [6 a5 U# T
(LQYD3L6@%}5B`RH(WO_P.png

7 t7 }+ q, H& L- u/ A- s
: |8 L- l! E7 H! F+ d
Linked Resources设置为相对路径

/ \9 g. a# d3 n( x. h& Q* X* E) k0 d; D9 a7 r$ _
% q: `3 P1 E- b/ i1 x% K: H' {
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。* _* g- a2 m* z# _4 u+ J) ?& D

& ]& r2 a6 c0 x1 p- A1 }" j
{]W[95T3]KZ~A}RDZY`%(QC.png
2 p6 P# G; d2 v. x$ @' j
. \3 b  L+ Y1 y, N
Id文件路径

; a4 z* v, P: B. \7 u9 T8 B5 o/ n& b. C, U7 o& |
- Y8 D( F, |) i
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。
2 ?6 B8 B- ^& V# n; A  I/ Y, s" b. `' p' V) W$ n
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。4 r" e+ f# g. L4 P: E
: j& \' X- U9 @% f
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。
0 V+ n7 O' H8 l) o& s6 i
; p$ x/ T* o9 @2 ~
[Z`XCM(304V`$GI_]Q5~3%V.png

/ f( z3 W! u/ T: f. ^; s6 \1 T7 Y
3 t& B4 ^, C9 S9 e* D7 h6 [# z# q1 V
编译后文件夹内容

6 c! e4 K. _" Z* p! y& }/ t; S0 `2 Y$ D8 D

# K6 k0 \# f, o4 ~# u- \        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
# |2 Z0 T& [# N/ `0 h* V  G4 U- G: P& M, H

% w, V4 x& Z4 w7 q- _! T2 @
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似分享

官网相关资源

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