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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。
# k! P5 j/ K9 r+ |* e- ^: _9 Y1 e/ K8 N3 C$ F8 [. ~( a9 d( a" \" J
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。+ M0 e- o( s$ Z# e2 q
(7[HULSY5M5PEDSVH0SCNGJ.png

  a" B! ]9 ]; \' P" ?# {! K  G/ ]. O6 t0 N. w, W1 S& i! J5 R* K
STM32F103C8T6亮灯程序
% I$ Q. q0 z1 Y
, l) r; N1 m# q9 i3 w( u; f

0 x3 b$ C$ b( U: k, G% T- D& S        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
+ u+ U1 m9 E3 d( u& \
1 e  ]  n0 W- o& o
LQZK{H7EQAWA61RTUWK%V.png

# D: A8 r. ]; T3 O' x% R( w
1 x0 t1 Z* `  T; ?8 l. e3 Q
创建工程文件夹

8 Z. ?" p% }( p# P0 G6 W
+ k$ n. x" m& ]8 t8 s- F
; O, [7 v8 P* ]% ]        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
9 o" Z% K+ D0 L0 \
9 k/ U. x( `' b% b& N
8TEZDA$)K%9UMIWWPVN9ETF.png

4 F# i: s5 [$ X0 l% J7 N4 f& W& L# F: B7 ^( r+ o% E
STM32CubeIDE默认生成的文件
/ k) N& ~/ H* ]' Y& x- i
  B5 i; v6 c3 L9 l- x
8 Z- `! F( C: a% p% W7 ^
这里简单介绍下这三个文件:
. @" W* Q+ z$ E/ _4 s- }0 P
8 w3 b# B+ ~% q4 [$ ^.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。. m' e6 e" P/ ^$ N( D' ^

6 Q0 a3 P, ?) r3 E: i: }8 Z/ C.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。$ K" M% l$ ?5 t% s9 a( T- l  n
" u1 r" K2 b4 B( h: ?' S* k* {* S
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。
; t6 h* L: E0 Q5 e" S. M* ^! w! a: K9 \7 c1 R
I`V)S98ZS_$KWFM(~TWT_GR.png

# d0 X( Y# Y! N& Q: g! D
; I% K& w7 Y9 v, {: y) A& h- N" k
拷贝文件到文件夹

: V+ u2 C2 g- N+ Y) A
- N" j: m& d3 P- _        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。) ^0 E; n8 t" ~

# ~9 H/ d) p. \1 W" t3 a# l
T027`8H%TGTW(@$GRR}6PMT.png
; |2 y3 c( w" S7 m: v' A5 S

  z( ^" `( u, Y) A1 O
删除工程

( B; J. ~9 {+ M& a  C8 ]4 V' x6 N% B* c1 G5 J8 c1 P9 v! ?  j

, M, n/ q- Z# L        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。1 p6 X6 P% P* S9 n4 J  q( ?

0 f' r6 P7 D  {0 ]% w" Z
S46$GH6(T@P7OI1T3Y45CHN.png

8 Y0 l) W: a! B& J8 y  S/ _6 R+ E4 i# S1 B3 d
导入工程
6 e; ?% C/ w! B6 B
        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
2 Y& n, c4 c# \2 v: R$ V
% h/ B* @- ^  M7 Z
J4N[77]P9GFMSI0FA88[G51.png
( N$ |; P4 v1 X" O9 n

  f5 O2 s  i. m$ Y; X
空工程

$ Z& ~# o2 C! U3 c" g2 w( g, b: F: [6 H9 @: s7 E
: U0 `+ w% \1 f! Q2 m! S
         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。0 }7 r5 B9 K% C4 a. i8 }, E

' R1 X3 L0 m* |! R; _( H7 W
4PORY)@%5RH[@6XRM4%2`EX.png

4 `- q) V- p. m- a. }& q6 w, f  p" ]  |5 V9 [6 y
打开工程属性

; S7 O5 g: e5 s
2 }  N# b* Z7 T, h; o  ]
( P9 t" I. J" ?' v/ ^, q/ P8 B2 Y        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。
2 I$ J$ y; H. W5 {; x# U, N8 L) N7 D* M0 I
@2)JR(2@}FYZR8C$S_(I5.png

  S; V" I. E! O2 y5 I$ v1 ^# |; Y  c' @2 _
引入文件
( y. a6 v/ T7 M! ?( L% O$ H5 }( A8 J
        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。: s1 ]+ ~0 i5 e7 N! D

7 @4 U* @! x8 X+ n3 f% R/ V
0XSZEA_]~9E1831BOK)13TR.png
8 Q: h( m# u, `* a6 j3 F8 }) ^

& v2 H( R# L$ G$ U0 F  E
添加文件到工程目录

# L7 ~: W# `3 ~8 l+ G- P. |" b- L; L2 s1 ]) p6 T5 G* T
. J8 B; e: @7 J2 [
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。
4 j# J7 k' u1 q+ H( ^9 j4 m. [  d: z* V6 D$ ~0 P
%4N[(O9GS)PF8)KT{8K(W}4.png
/ ?$ K2 Z6 m# I* D$ c: @/ w

2 v* l& x4 c, R5 f. T2 @; P9 ?
添加包含路径
! p  T: V1 q9 O: h+ p5 n+ J

+ q4 H' a3 s, Y; F9 a6 e, \' _
. R4 m5 V( R/ b- ]/ k        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。
, m% P# @$ d3 F  X# x/ h0 U6 h( Z" |$ D; F4 c2 B( X  N
@H`V2L@ZMIU~8`4QX(C$(A7.png
+ S4 O& v* A- F
2 @! S# y0 ]' v4 F' B
头文件路径
  O2 P. X' _* n, U6 e5 Z

( C  S) ]) x8 U) C6 G: v( u2 G
, ]: N- L- t: K8 y4 V; h* N        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
3 K# P% |7 D3 A' K" N1 `. ~8 t0 L
E(X3}HN71FN2$%5~Y@U8PYE.png
% r# O' S6 C' j- K! |5 J8 x$ J' ^9 n
$ i4 u7 O0 v* R( k8 G
预处理符号

. }7 U0 ]( o$ Y; o9 _, k' `; }
& W" f' b+ b$ l9 P' q* J3 j, U6 M7 T  W. r$ l
        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。* H. U3 S" [2 d4 @

! z7 j# k2 V# h. ^( v4 d, L2 ?        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。
! W" ~1 L' r: x  C
: D" b- x) c. O2 B3 [. ^7 W
QK6JV~FV841NN5IC5_WP3TX.png
5 o5 Y' B- C/ h1 T8 Y# D6 [
" f0 y/ x' \0 y9 o4 r) C) r
删除不需要的文件
) {- x) t; n8 I8 I( I8 e

5 O% ?# C8 z- |1 Q9 y& Z: N" a. {& v3 y, A7 F8 r5 m0 S8 h9 O
        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。* w- N6 K# z0 `: }

1 H- \# X% c$ W. x
1X[4G7}`U8A}GLRJ)U2`4S0.png

, h  L) w5 W( e0 Y* [$ j' D' x* k& D
排除文件夹
. d7 S( h  z2 q. o& Y9 t8 ^# j

  o; k' H1 H5 J
6 Q# K0 U5 D  I( P* i/ e6 P7 |+ ?! I  c        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。/ Q! P5 h* n* `0 W+ ]
  t/ c; s$ {9 n" D4 k) L7 O
{TH`}RR2](L1@QC07D%X8PT.png

7 ^$ v, K0 U1 y1 R8 R% ?& `3 _; |, h- u+ s" W* q8 @
排除文件夹选项

" z( [3 ~$ |0 x* b, ~
7 s2 [7 V$ R& o) P7 y( b9 j! i) I  U3 b5 ^' g; m
        注意到这时候被排除的文件就会有特别的标志显示。) V8 Z. M, \( _9 J0 j. P" b& Y
2 B. M2 [$ J  H0 W7 J  n
~6V)0DQ[NITU@XKKVE1``]C.png

+ {0 F9 C: e; Z& ^
2 C+ u/ H. J: C& l3 p! {
排除的文件夹

$ m9 e% s- l- X: ~
! \2 |( H# H2 h# |8 ?
: i; v+ \8 O3 p* i, h. U/ k) s/ h        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
9 p( t0 x( r4 ~
* z/ V  ~. T( {
X1L955JB{4QB57PVS()39]L.png

* K; F* |- W) u" F& u3 ]0 j
2 l8 ?! W& f! |: X
Core文件夹对比
( F1 _* A" g. R  h, x: Y* ^! u  e9 |$ A
5 I: I: }8 i8 H5 J5 K, v* }% Y

/ v, U: E4 f3 U% h" Y8 W        Drivers下第一级目录,没使用到的全部删除。- W5 H* _( {+ D( @0 f. @8 C% ]

  [8 [3 v) X  {+ c% Q
D_RA2IDV@QBUWP5BK4E2S[F.png

7 k0 e6 [) q0 q# H* H* u
$ i! f/ f) M" ?" M; G
Drivers文件夹对比

5 {6 D$ W' H$ o" V" z& [8 T
) ]$ w$ l; F# A* Z% ^- |; |7 K+ A) }! [9 X$ e! W! u7 O) e# B) p
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。0 q* @9 |) D: Z, {; v. @$ ~

3 `$ n1 e* u7 }! v
E[5RZZ0MBEZ2M(1])VZ_7_A.png

/ [* _* d0 r0 j( w) i' F! c3 k1 X" t; O6 f  f/ b
CMSIS文件夹对比
( S% ]: D* n& H1 d
+ q+ W, v- A* I! Q- v$ A; A6 c
/ P( a4 ?6 g; i9 K& o- z
        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。* B6 }& v  O- U* Z$ `- h

! q5 j: y3 [4 l6 \5 [  t" ]
}~YY~Z6Z[R_F65RU071Q13U.png

' _: F% _$ t' E6 \$ @7 v' U8 ]; r, @! S+ L8 c  ^: T8 E% k- t; D. |
HAL Driver文件夹
6 l; r: g# m: K0 a" s2 X7 |% `4 |( ~

0 e. |. a& H0 y4 j1 p% Y# p" N, s7 W6 h: I) F
        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。+ |0 H% o* S( c3 E
- f. @5 {6 N# Z6 q3 k/ d
BWTOV(`)SVF2DW0~U35_}W4.png
, z) K  J" x* p+ {' a

2 a7 A% E( b: \5 g# T6 a
STM32CubeIDE编译通过

3 q3 [- @6 @5 U6 `$ v6 H& B) J- e6 J4 W: s/ B0 D' B6 _
8 w3 I$ T" S3 D
        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。) \9 g. m, S9 j# N9 g! b* T% t
. `% E7 w/ W( ?/ n: A
Q~I4GG({CFUKFJX2BP`5~2P.png
% F+ O- b0 ~1 a3 h: J

9 W$ P! r: Y/ s8 S9 g! T
Keil编译
# t2 T( X, K; l
. x9 U- G  u4 k+ z

: H* C, J3 P' P( z  n2 Y        如果需要调整优化等级,则可以再下图所示位置调整。
$ P, _" n; d2 b( u& @4 w$ L1 l8 t* A7 c( v6 ?" m" ]* o' Q) H2 Q
WSF@(%LYTF21TEC}ZRV7POD.png

- y3 y! c3 `. t
' G' _' \8 c4 i6 l& g) v
调整优化等级
3 ~4 K, I  [  T- |

( s7 z  E* h7 N, [, s) X
# P8 X- X. ~/ w2 h* C/ r, F9 ?        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。; f4 K4 i! o: {' _: x
) C  R6 L7 f' F$ f' V0 j
(LQYD3L6@%}5B`RH(WO_P.png
* s7 q9 b# `* }, o% G% O

# X! h( E  z: u& c9 g
Linked Resources设置为相对路径

: G9 Z0 d/ M6 z* x7 I) d2 y
! H4 ]2 g1 L+ }' y' [, V$ ~2 s7 G4 z0 d# }
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
/ z. a  U6 m/ O+ d1 S1 H
! i( S8 b4 r3 Z8 H; E7 h0 \3 x
{]W[95T3]KZ~A}RDZY`%(QC.png
6 M5 f  e: K$ C

( g# i* n0 n, q" P0 W- ^
Id文件路径
0 M# l9 n9 e3 p! w: E  i

% v( O* I1 q! i9 Z; Z- W, @2 a. ~/ f. ~5 }7 e
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。9 A. {2 a9 T0 j& U

4 z+ o8 u( z+ m/ }. o! B* _$ t  u        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。# t( ]. P6 o% k2 x( s; p
. G0 {$ ?  N7 z) K* D
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。( z+ t& H$ w# i4 L9 t4 w' Y
0 `' o+ @1 V, N5 K5 \4 g# i* ^
[Z`XCM(304V`$GI_]Q5~3%V.png

+ V* d7 h6 Z' p/ |  ^1 O! h8 t5 \8 f& X0 ~( \; t
编译后文件夹内容

9 i: W/ @' P0 u; _/ C) }) h! U
0 d6 E; i2 n: P; S
% S3 b# z; A6 [9 R; j" e8 V' y        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
. R' h8 T" H0 M, t; ^7 N
) c6 j$ U& P% z7 j  z9 |4 W$ A' }- _& j# l& z  z5 D
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似分享

官网相关资源

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