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

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

[复制链接]
STMCU小助手 发布时间:2022-8-28 22:35
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。
: V5 I# c, A& c( l# e3 e; ~6 u/ @1 o: H% n
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。* H0 H" b- ?: [4 k4 k9 c
W~]HIOY42K_X2F}S)22K13C.png

& p' C; H' L# X2 B* \$ N+ n% t1 [  W4 _- Q! H; I6 @
STM32F103C8T6亮灯程序
' z! w5 |$ l& J: k" d7 n
$ [4 Z2 b  I" x. s) `9 v/ ^6 b4 c
1 D# M7 H; w! p3 ], d1 V
        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。3 L* k3 E% {& ?

! W. h, K/ b- T% }
3WASSYA77KBU6RZOUG@]A48.png
; ^1 t. ~9 u7 l+ E0 x- X% a$ N0 y( X9 v
- z0 ]0 {9 j# J& `# s2 U7 |1 P
创建工程文件夹
- z7 r) W1 N5 J4 W6 P, O3 I

% u/ u* T, y5 \$ g6 B; T8 `8 R+ a9 v. a' A& w- V; l8 d
        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
2 o9 Y" Z3 Y) E/ O6 E1 c- v
% p9 q, |  i' l
7LZQ$[FLK{3A{1[D(SP]N]A.png
- [' r7 _4 }! K  i* q- L, g

6 u1 b# s, i2 B$ C# G$ P
STM32CubeIDE默认生成的文件

4 P9 o5 {! B5 @+ R3 S
. \0 T" |8 n/ \
& ~" J! P3 H3 `" P7 N* z4 }# h这里简单介绍下这三个文件:
1 e1 B" U3 I# J" p* C3 |4 [
/ j% q3 N! x1 v: b.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
. l: k- i( Q& [& ^& o0 d9 z( Z% `. p, h" L8 j: r3 h9 I% G
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。
) {5 a7 X9 q" C7 H& B0 k/ y7 v7 c+ q+ H  K. ]6 j
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。
( H8 h0 M& H, s* [$ T4 l, K: _  K$ `$ ]4 F: c5 Z7 X
DS67T((WR_Q$(4[`8Y32K.png

& K/ t$ M+ x1 P( @" {4 T4 {! C
! n% k# e4 S% H, Q. l: @
拷贝文件到文件夹
7 V0 b# [; ]' i

) n: f' D" `; I, _, k% e/ R( e( ]- ~. Y) p
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。6 o6 l# S8 M7 `
6 C2 ?! A+ w; t4 t4 S
Q3Q%UCI[$E{3UO2$L`TW__G.png

# K" p4 N5 q4 n
# a- ?8 m; Y* @  j. D6 _
删除工程

. C% T0 L. `: \2 u; Y8 }  a3 k1 [: X; p

9 |" m9 b, ?6 E2 w        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。$ z7 z5 H- X) W0 j

& R# ]6 c( z* c8 d
0{IFA_C33W7@@D%L]5ML0MM.png

) R3 q# t4 F" K" M- @
  t  P2 {3 Z6 R; G7 w1 c6 S
导入工程

! l8 \# Z) f1 @+ y" U        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。" W+ Q2 r" d" ?. ]

+ h3 g! [0 K/ q. K
A5$`KLMW)S[U)`Y{U@CY3T7.png
1 N! x! H/ j# L$ D3 F/ {
, ^. |+ B6 L2 X7 Y% z  X% j9 Q
空工程

  v0 K! x! f3 T
% S: G7 d$ Q) |/ ~
; w8 i' K  t2 \, M6 ^# B8 t         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。" S& Z. l1 Y6 R% d
" ]) \- W7 x/ {* o& U7 I, Q: ~
_K9E5V1{N1{L$)FOW25Q~.png
+ e# A/ \& R) C! o8 a
+ _% Y0 }& p# o' G! C' l5 g
打开工程属性

2 U! \( v2 I1 [. Y; y# k6 o6 b0 @4 y( ]4 D2 N

. `, F$ b  T$ \4 X) J' K5 u4 a6 D        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。$ E& e6 `' ]4 ?) L1 h- v2 K  }. }4 z
) T$ l/ |* F% S1 g% f) \. `
_6RT0]OW~_(3NS]}OQLE7QL.png
" x* d9 m! q% v
$ @% ?- p4 H9 {; U4 l
引入文件

/ D  Z* m3 m+ s        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。. T2 t( R. L' R7 ]: e5 [: |# M
( w: F+ x: M# p; o' f% p& B
RYRLTIW[75MEAH6UG6L.png

+ `1 t9 o0 d# d9 E9 f5 b" T( Y, _3 O9 H* W$ c1 X
添加文件到工程目录

8 k' @0 w( |! @- C4 g
- ]0 |: j! z$ R% b. U; A6 W0 z9 u; Z: c
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。4 X# x1 A  i+ O! p! \
3 S0 \5 D8 t" F* q
T770OJ`GN7T1A@_W8MS10U9.png
/ M' `( T! o8 M$ T2 R6 Q+ r' Z* b

7 _5 F' T6 X9 a6 N2 ]& z0 d
添加包含路径
) y6 H4 c% p* G# h; m4 s/ ]" L
6 @* n. y4 l8 i
: w9 p" |& L+ k, j% A: J
        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。
) G4 q% p: r& v# q* e  J- }2 L3 E; |. [
BC4~5CMK190KR@1Z4NH[BAA.png
5 p- E1 w, R3 r) r0 k5 U

5 s9 b9 k. \4 b
头文件路径
5 q1 D5 R6 U; r4 v7 Y- A+ p
! A7 o& c: i/ _5 ^; c

. T: F; X8 a- S6 |" H" T+ t        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。. U& \9 [: k' u* y- Y+ T
6 y( e# U! w5 i
CM8PQDG(~KSMRB5%[RGJF.png
" S1 a5 }  ^* i/ y
8 U# t! h0 h( I6 ~0 N
预处理符号

& }% A3 }5 A6 \+ s: P; U+ v5 L
: u: D' L: j9 Y: l
! V5 K6 L' j) U: s4 `        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。, H# F7 D( v; X& ^+ Y

, x) Y8 ]/ Z! u: V! }6 q/ S# x        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。8 X3 u7 E' a2 }
7 Y3 Z/ E% R' T- z3 S- J: ~; w( l
~E}(WHT~SY9YZ76~6B0FEYX.png

: x9 I7 |  {9 ~# M$ x; M4 \
" I& x2 W+ z" ]: M$ N
删除不需要的文件
  A, _" _5 w' D4 i* ?- ~
. P& y: }' H' X  O" f8 `6 L
3 X- N- L1 [1 w+ d, c
        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。' r0 w4 t4 L; t& v% b0 ^# m3 w
* V0 F2 f2 @. x
CH%)1P7Z{]}@53ID$W{ITXO.png
# V, \5 j6 o" h* L& F
( R( D) C  Z. g% [9 A" @$ C! z
排除文件夹
  @1 A4 L& h9 Y1 m7 K; V  X

( i# c" T7 s0 N$ y' j6 J$ Y- a5 k- ]
: |6 P+ A* t* V, O# {% F! c* f        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
+ p! J! h- q) Q( A
. T% l, e3 L0 b5 C: X5 F7 p  D
[5DE$R5L0S8}UKB3ST}8GES.png

' ]  S" J6 A' C8 B: W
, O8 g/ b1 j" C
排除文件夹选项

) v( z) O) H+ n+ L. I: n- n+ {8 B& J* Y- x# K

. ^' T4 f# V% s+ K# P" w3 e! S        注意到这时候被排除的文件就会有特别的标志显示。
/ a# ?( c# U2 J
3 b1 S9 i2 B, H6 J
6X%VAYE)JZ$BFVJ]8TFZ))5.png
# s, m8 v7 W" Z
) H! h0 s, y  q8 X6 Z0 w: C
排除的文件夹
& r' K2 }# j. n- R1 E
/ D& }9 {) h6 x3 m  O8 M7 C; X
* o4 \: F0 N: F& t) \
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。' y& |9 H. B; ]0 e
4 ^2 y4 }: @; p  E6 e
6PY}1]A__5{@{[[LM~QCD[A.png
) p" [  Z) ]; {& b

" @9 \2 {* v" L: [7 I5 n/ I9 T& H% D
Core文件夹对比

( f8 X1 \/ n; k; E$ R( k4 o8 K! K: ^' i

/ X3 R2 K, P5 ]! _; h/ Z        Drivers下第一级目录,没使用到的全部删除。. b: Y9 ~7 |1 n/ |
8 [+ U4 d* t4 j4 q0 k; y0 k; F
AHA811@1J~XZX[Z6ZZKMGMD.png
0 d1 N& \! @) O6 @& T; a

/ s- e6 I+ g" H' E' ?
Drivers文件夹对比
1 ?  }1 l; t1 c1 J- Z/ @2 j
0 F) M* P: m4 l. T7 A+ x- r/ ?

" ?. `! w  H0 q3 }        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
* `2 H) E) q) c. C8 i9 x* r+ x) l
- x7 R) |+ @5 Z3 R
BADIRDPV72D{E2LGBJUG0)E.png
5 P& I+ H$ m9 _0 U# F% t

2 I) Q5 z: E& N, T( X  J
CMSIS文件夹对比
* C( s7 r$ u* {8 o4 M6 E1 R

# s' |. q# {% W1 d: ^% h3 A" y! O
8 m0 i( V. c9 w* W2 K        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。
+ x: \5 G9 U: H% m- \3 i2 \% a+ z
7 Q% K* L  T8 P
9F%~JU$T1I%6(EHLZN)U}NI.png
- o, W! D0 g$ V" \. C1 [+ Q# ?
/ p1 y. \0 B, p
HAL Driver文件夹

5 u5 v! X1 [9 `3 _0 I' B6 W+ p3 Y+ ^4 ^. E8 t+ K1 Q

! e5 u3 D- g$ X5 A5 E2 \( X% \* N        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。
. ^5 ]1 ^1 I0 O* H$ {8 m! ^
9 g( [( \1 M$ ]3 G* S: Z+ a
8CAK_X7IFV$}@IY~P9Q48U8.png

% ^5 K3 @8 h9 o% J8 R" h9 g: s6 s$ i# X- D
STM32CubeIDE编译通过

, `$ O% M8 r0 }. j* Z0 q6 i" p- w& R8 N* Q
( C9 {% d. L: O, B' m/ k
        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
7 J6 v5 q( Q$ E' }: _$ \
2 R0 B3 u# w) [
5}EK{Z~[`IE3XSE(2}LW27H.png
# ]2 L  L. L' E0 `) C) k) o0 w
- k! S+ `/ ?. f8 \; q
Keil编译
8 r! y8 e: P) N; C
: O- K) G- o2 t/ ?5 j2 u& F" p
3 a3 D7 C% S/ Q' u+ q& [3 d
        如果需要调整优化等级,则可以再下图所示位置调整。
7 q! c: [% L6 G8 A7 f8 J8 R( c+ a7 D5 z( t) f# S
57{)78`IUIE3X[T}$_{%Q2V.png
1 Y* ], t6 A/ _& K5 @# _( }8 ]

, u2 s: y% {4 H6 R
调整优化等级

2 Z3 J) X6 L2 K! K' o
. _0 z& _# s! K2 R2 V+ h. V/ |# v6 \; k- _' B
        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。0 a4 O6 b% E3 u3 M) u4 E$ s

3 q5 }! N# Y; ~2 ^
A`N)L93O7)A}[U(6BQ_W173.png
# l3 N; u$ B0 A5 E5 f
$ v, X" R% s/ C0 T1 ~+ r/ f' Z- w
Linked Resources设置为相对路径
. U& f0 l6 M& F4 {3 y; s

. G: E6 k8 _! P' H# Y- ^1 [7 C. {& }  v/ @' ^5 a' r9 k
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。# o$ L- l; @) j& x& T
# v8 Q1 e; C3 T
QR%O1_TQ0PRAMM`NLIO$Z}V.png
* m! k' [3 [. g9 [

2 C: ], T2 F9 i& {
Id文件路径
' U0 x; F) h! N# c; m
8 P0 m- z0 H/ {3 c; B" B
  b1 o: q! b5 o- t. f8 D
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。
6 o2 A/ q! s/ i4 Q% o$ u
7 B. d2 }( |: N9 X" B% A- A7 j        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。- z9 z4 ]5 p# E/ s2 K  A& U
( l' k3 D  `  e0 h2 [
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。5 B, B7 x" Y9 \; P0 a
5 }  b' u+ w7 H" t
V]JP257Y{[Z5[Y]24((YAGF.png

1 m2 Z( _; V3 J( D1 x* ]
, Q4 s( B/ f+ @) Y) \' N% w; R
编译后文件夹内容

% w/ W8 U5 D4 M7 s3 v. d4 e3 b" C, p. u

7 }* r9 Y0 B8 {7 t9 l        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。   Y6 i4 m1 O+ v3 E6 m
) @; C$ M7 A( w3 j0 A+ a, y) F
作者:bili_42806779649 - U+ Z0 h; G7 u0 I0 G# u5 H: N( ~
& D" y/ U6 M# y+ ]) I( \# D
3 D& w1 m* x2 f3 H+ E1 ?
赞 收藏 评论0 发布时间:2022-8-28 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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