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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。, x8 f$ T$ u8 g: r/ Q( [
5 V7 E8 s6 a2 e- M/ u
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。
3 V2 I( b$ c5 ]) Y8 L: o
(7[HULSY5M5PEDSVH0SCNGJ.png
+ b- O; f: S) D
5 i9 s9 {4 Q. s
STM32F103C8T6亮灯程序

$ Y8 |. L. [* Q% d0 w1 F7 B4 n4 f9 ]' G

8 M* `2 r  g6 M  ~2 Q3 a6 R        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。' R" M6 T) C& ^# I% A4 A

: ^1 j% `1 V& W! Y+ _
LQZK{H7EQAWA61RTUWK%V.png
9 b9 w) X4 O8 F2 a5 G  a" k: \# G
+ N* q$ {/ `$ z; c  w- g- R
创建工程文件夹
* E8 {- b/ Y& J2 [
5 {* W) R( D! u5 t* R* D* r6 m
6 U* T2 b) ]) y- \
        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
  S' h% Q4 r, {1 n3 M0 G6 Q9 b! P8 H7 C) l: D  g0 d3 `# D: K
8TEZDA$)K%9UMIWWPVN9ETF.png
0 ]# O- v# n- W6 Z

% C! ~9 |" g& F; @# j+ u
STM32CubeIDE默认生成的文件

7 d6 Z4 X2 t, ]7 m6 U1 J8 R' K* @6 F  x" B# L5 ]# F6 J
  O% U8 W! ~& C7 H8 T
这里简单介绍下这三个文件:
. q5 f! r/ i- u! d2 |. ^; N9 }- U# h% N, l: c& Q
.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
* k5 w8 C, ?5 P- b' g5 {- m0 P$ T7 \5 y
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。
2 J" `" L. W8 i2 f7 Y0 T
/ }" B9 y! K8 h3 GSTM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。  N2 ]/ g2 M+ m) K- K

( k7 o) |0 E9 P7 C
I`V)S98ZS_$KWFM(~TWT_GR.png
% ~. n) G- j( K

2 g  S* G) V* }2 v6 L4 i- c* X
拷贝文件到文件夹

- N* }; [; W  p# B8 j9 j& g* p+ O- r+ ~5 x
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。$ i8 M) ^) w; `/ F
$ q4 V, g( d$ k; V
T027`8H%TGTW(@$GRR}6PMT.png

! C5 T4 j9 c4 ]3 J; U& r& B2 _! r" C2 l* r( X& J( j6 y
删除工程

4 e8 l. ], \4 P, A
3 I: {" {' `$ g/ E, h$ T+ w4 d& L
        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。, V4 ^" f: ~" T9 X* ^

2 ?% ^2 p; \" ]4 s
S46$GH6(T@P7OI1T3Y45CHN.png

7 Q3 p) j- t6 c- Y/ J/ k" q: L9 P" x% V$ {! P. ^
导入工程

! B3 T0 n. _1 T3 X1 P) p" n        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
# v- W. H% I- Q* x5 ^/ x9 p
( d. W0 S# \+ C* b& M: o
J4N[77]P9GFMSI0FA88[G51.png

# \+ g( Y; l6 m
2 j7 o# |% w( ~% w( l
空工程

& D# W0 O7 g9 u0 E3 {7 F# ^1 @: |, y

! M$ [6 z- [; v- q  f9 R6 t         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
4 q. g+ m, ^! r9 ]
7 n/ l# B, z5 ~
4PORY)@%5RH[@6XRM4%2`EX.png
  ~- |) w. r& v6 W# Z4 Z% q- I: `
" m% n' L' }. {* F* r1 w  @
打开工程属性
5 @6 T7 F7 \5 S# }. Q7 }2 s. g
2 c: D' `* ?7 f( }/ |

9 v+ ~% p7 D# I3 `3 m5 j# q        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。  o: }3 F8 D( j2 d) z" \) B

' E4 B- f6 X: E9 B) G0 f! M
@2)JR(2@}FYZR8C$S_(I5.png
1 [) ~) l6 [& x8 z% h2 s
9 Y" m4 j5 K3 p) |/ P! C6 P
引入文件
) s- n9 n" |  I$ I+ y9 j5 d2 y
        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。6 h& b# g* w' i1 a; x5 F3 M8 H7 k
5 d" M5 K0 P) r' G; [/ b& y
0XSZEA_]~9E1831BOK)13TR.png
5 K$ @. ]1 B6 Z+ E& t: }$ S" \

2 b2 A9 d, t+ D% ^+ v
添加文件到工程目录

2 ?- b2 Z% k$ R* ?- Y- Q" c8 M9 Y: V! A
3 ?3 X7 ~- @6 C2 m* i1 S
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。5 L! Q# L$ C1 v. h

3 A/ V; U3 J3 }' ^5 x
%4N[(O9GS)PF8)KT{8K(W}4.png
5 c. B* W3 K1 k
2 L9 _/ d9 f) O) k6 k# r
添加包含路径
7 b8 r  e  k$ k: z& A/ v

; m3 U9 m' i! K- o* \% u
* j8 U6 Y1 [# _/ h. D1 w$ i        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 Y4 w; R; S8 F1 \% w
# K; \7 H* x9 w. F
@H`V2L@ZMIU~8`4QX(C$(A7.png
$ y2 D; L. I, e

# K6 Y! [$ Z! T3 `* r
头文件路径

# C6 y* @* }+ V, m: A" u  M
: T, r+ n& _$ A  `0 w  O
4 U5 O0 n+ M  c" h' Y7 r        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。# i2 Z1 v: \$ U- V3 h6 t. y; j
, Y9 v1 [) s, z& c
E(X3}HN71FN2$%5~Y@U8PYE.png
) ]! w9 I( \4 D/ z  ~$ J

3 f9 D. k% h/ K; H
预处理符号
% I9 z5 c0 ^" s3 x" H! w0 b# ]
6 P) S$ c+ H$ |- h5 b0 N$ L: V; y

; ^; y$ h3 i% i! W* E3 c( s        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。
) S+ \" e3 Q( o; Z
3 N0 Z$ e# R# O2 j0 l        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。4 I7 `7 e, k& C' c4 I- x# R. k
( z: i  b2 ^& V% a1 D) d$ l
QK6JV~FV841NN5IC5_WP3TX.png
  M# C% W% h4 D0 q
9 t) n* d* f4 X8 {- R5 |. [+ o
删除不需要的文件

6 w* W2 Z6 I8 u6 u  _. }6 \9 i, O7 U# |" G6 G

9 n9 b# W/ j* z* z        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。2 l  |5 Y. R  r7 C) X  G7 [
7 L. \- }! B! `/ z
1X[4G7}`U8A}GLRJ)U2`4S0.png

# c: s/ v% o4 q% F  K9 a/ V6 M! a- V$ E8 V  a
排除文件夹

" V# f4 G5 ~* j! m5 M2 J# j7 w: T. y/ N4 k, q+ i4 c  O' ?
6 j/ E( ]9 X9 P8 g. z0 R3 Q
        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。8 s# _# N8 ~* Q+ O6 j8 t

1 g5 a2 l% [0 B, }3 H% b, R6 l, b0 c4 Y
{TH`}RR2](L1@QC07D%X8PT.png

/ u" K- U- w, b  C7 c: u. u
& F2 s5 T6 f& n8 N5 C- z, E
排除文件夹选项

; r/ {+ j# k2 ~* r: T7 Q6 ]8 m0 z0 V  K

' h; r4 V5 N6 \. q        注意到这时候被排除的文件就会有特别的标志显示。
3 [. w) ?, G% k( I( p2 n0 K2 c# R# {/ ^. r: E
~6V)0DQ[NITU@XKKVE1``]C.png
4 J0 X* H- q; O7 a% `# Y

6 B3 h/ k; Q; j& n0 Q1 A, |4 O
排除的文件夹

! g* C( J2 n+ V/ I+ a
2 A; \, m) l" |! B/ J* t% T: N$ i; f; T/ f
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
9 k3 j' T( m; Y8 S$ d& H/ E
0 i$ j% \$ d# W9 s" B
X1L955JB{4QB57PVS()39]L.png
/ i) c7 g0 x' v/ ~
8 W! [/ A  |+ u
Core文件夹对比

# N! Z4 T- t) M+ O
8 Z; G. D2 R. z/ C( I! I- \5 M: ]) C* j
        Drivers下第一级目录,没使用到的全部删除。
& H9 \2 M4 k+ G# ~/ m+ p6 ^% e4 m- E/ a3 P
D_RA2IDV@QBUWP5BK4E2S[F.png
. S6 H$ {+ a7 j3 @! q& Z

. L  H9 Y8 T$ y/ |( F2 J  \
Drivers文件夹对比

, j  v; b/ E: v& C* ]5 ]
# u+ N2 O- ]/ e# j4 Y! ?) E" F0 r+ q7 F9 P) \+ o- C
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。3 P: l, d9 t! ~4 Y4 y/ Z6 a5 L

+ B! X7 _1 V6 V$ v8 t3 O4 d
E[5RZZ0MBEZ2M(1])VZ_7_A.png
3 C8 x# N& \* {' W

, H, R( b' J' p8 B6 k
CMSIS文件夹对比
+ b! _( G1 S; c2 [

; ~- K& R: ]$ E" \; H: g
2 @6 J( ~- [# u        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。; Z5 S( S; u9 c! D2 I# P& x0 d

8 f" x4 M$ i/ j& ?7 l7 T
}~YY~Z6Z[R_F65RU071Q13U.png

% {: Z1 V% c1 B4 l  Q2 }4 }) |+ h8 I8 W( ]  C' t5 f' g9 P
HAL Driver文件夹
+ Q8 O8 L: d0 h$ `
* l" c2 v, d, c0 h$ A, G

! n  o' \9 Q0 i        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。1 B8 h5 N( A/ \1 N! l

+ b: x' V6 k# R, T6 u* E1 m& g7 a
BWTOV(`)SVF2DW0~U35_}W4.png

" I; y, A' i2 g. m: X" R$ H% f- T( S6 B' B; k% b
STM32CubeIDE编译通过

, d" f4 W1 R' x7 s; J7 G
4 ~) g" O, b/ y1 K% A% C( S
3 ^) q) T7 {9 V" E/ s2 Q        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。! I) l! B9 m2 {+ E3 Q
7 F  f1 |* u* ?6 F5 L7 O' Q2 Q/ l
Q~I4GG({CFUKFJX2BP`5~2P.png

/ L6 }: Y8 d( o/ t" I6 g2 V6 r1 T- N) K: N0 \
Keil编译

, Z, ^' w1 b  R4 p9 d+ T9 T
6 ]  H5 q5 E2 G2 o. D9 I, }( q/ _+ X7 w* h: \  \
        如果需要调整优化等级,则可以再下图所示位置调整。
' a" u, c: L3 s
( ^6 [9 V  u& m) }/ L7 H
WSF@(%LYTF21TEC}ZRV7POD.png

9 _$ s1 \0 |: ?9 }3 Q* |4 ^/ K& ?: o+ k. H
调整优化等级

1 W( c  Q& X9 m. b
3 I" r/ J, [" r4 e/ G3 t& C! Q- t6 E: V. K
8 p7 }5 R* t3 L+ r0 `1 p        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。1 r1 C- \% u1 G6 l
( w: S6 G4 y* ?  s7 S
(LQYD3L6@%}5B`RH(WO_P.png

/ Q: T& x+ h6 T+ c: {' R  E6 Q! G) N: w3 R8 @8 M. C
Linked Resources设置为相对路径

6 p+ A1 J! y5 p; J9 R# ?$ u" ^/ c% [3 v: r' M, o

4 n3 A8 i- t/ r- A        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
! @3 q+ a$ P$ d" e( H. Y
& g3 N0 t$ m  s0 l/ M
{]W[95T3]KZ~A}RDZY`%(QC.png
& J+ L& l' `/ O$ b& x6 x3 o. ^$ `* C
- x2 {' j+ Y8 n( H
Id文件路径
; O5 o1 j2 l( m9 X& z

5 _; R4 t3 H5 a. v0 ~; v" n# k
9 n9 \  l# |2 `. g. ~& X; k$ N        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。1 M( u+ J0 y3 ~1 p4 d  s4 t
  ]% q2 z& n6 B9 |
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。
! l: W: U9 b$ G; Y, X4 Q  h
- Y; ?- R2 ?) G& f; g1 X        针对一个相同名称的工程问题,工程取名时最好也有些讲究。
( f2 D: N% w  N8 a' N: ~8 p8 t% P2 A* w
[Z`XCM(304V`$GI_]Q5~3%V.png

/ ^+ P- {* Y& b9 H% C8 T
# B3 V8 t6 i3 s! l: r7 q+ a
编译后文件夹内容

0 m1 T3 S+ Y  W0 M4 d8 P6 E& Q
2 V- f0 [4 A) Q$ \- _6 {6 {2 V; a& |: y1 I
        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 1 e0 _" P# U3 K' m  ]7 [
; W7 p, [# |& p: w  l' V: |
' S4 l. z0 ^$ T6 m5 \- R2 l; R3 X
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

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