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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。9 L( X% S6 O/ V8 w, E2 {0 i! C( ^

! ]7 g% ^3 E( o  F4 Q# O          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。
! i0 X3 d' n' Q5 A; }& V
(7[HULSY5M5PEDSVH0SCNGJ.png

% |0 [9 R/ R, I& p
) d2 B9 G9 h. o
STM32F103C8T6亮灯程序
9 E$ A8 q" B0 K0 X
! J4 T( h2 G0 G& m; y6 ?
; p; M$ t! R) |# r2 f
        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
+ e) V6 a1 n0 `+ K" T) K" o' @" i* ]( g; J
LQZK{H7EQAWA61RTUWK%V.png

5 f4 C1 j- d2 s. c( ~1 S! N4 J/ L( J* ^
创建工程文件夹

' v' o( I0 p5 O' r& I  w$ F9 I7 E# c. I

- K7 j( @+ Z' k2 v8 r- G        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
- N" ]# g) c* }( M, M  Z  d$ q* ]3 N% P+ \: v
8TEZDA$)K%9UMIWWPVN9ETF.png
, P& A1 W+ M0 W: U
( d& A1 @8 z4 r) n5 ?  a
STM32CubeIDE默认生成的文件
" X3 |. A4 Y) q, v" B- D9 m' s

. {+ r$ a6 f8 P. x3 N! a
5 |9 U1 Z$ K2 e) r, O7 h这里简单介绍下这三个文件:
" X4 E; p: f2 X% C; u" \+ Q7 A+ U% n$ E7 v7 O! d
.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
  r% C+ V& C# r% {5 ^4 ]: g4 F/ c/ W9 G) W4 x
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。7 f" g  C: H0 z: _4 o

+ v' _3 V9 \; H8 c/ r( r' jSTM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。
9 g0 t9 K; f. Z: X
3 H2 H# g" W; o/ _! @
I`V)S98ZS_$KWFM(~TWT_GR.png
8 z; o+ ?, }9 U& d' G

4 C. {+ ?& t3 F( ~
拷贝文件到文件夹
2 @6 C9 E: H  c; W
8 b, W8 d$ P1 n5 h, n
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。8 M" _0 |% D2 ]% v5 p) C: k
: `6 T8 |! W% M2 W
T027`8H%TGTW(@$GRR}6PMT.png
/ u( h7 W7 F+ Y9 e* T

, {6 a& ~1 f% i* V$ Q4 w6 K  I
删除工程

1 r2 Z+ C. U' r( ]; q! S" K  B$ U5 W5 b9 R+ W) B. k% H" l
1 L, |: E8 ?: |% E3 G3 [
        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。
: M# R4 m5 S+ S- N/ {: c
. N' s: I( e9 x  R' r" s* f0 D
S46$GH6(T@P7OI1T3Y45CHN.png

. {% w( }$ Z4 E0 x  ?5 }% ?6 E; T# C, P+ j- M
导入工程
! w# {5 j. W* u- H
        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
/ N* U+ O9 c  p. v) I' |! i2 `$ \" r# b$ \
J4N[77]P9GFMSI0FA88[G51.png

, i% D7 Z, C% f/ B& ~9 O2 J3 i$ p5 _+ @9 w+ c- T: b+ Q
空工程
! H7 f6 O* ?4 b- y

* T! ^" ^. H* e0 Z* ]
- u6 x0 w0 L9 N, C$ n         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。& j/ ]2 D. Y7 |8 ]
6 L8 K& {- s9 j0 O4 v9 j
4PORY)@%5RH[@6XRM4%2`EX.png

3 S5 d% j  V# x: q( N
( o+ w7 t  [9 L; K* c3 g5 P
打开工程属性

; V* R7 M3 E& M( `4 W) k
3 ~7 V/ J& a: B1 @
& l6 o# O6 S5 T; x3 J" ~9 x- y& Z        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。
+ I8 y5 `% ^+ Q+ \8 g4 n: n2 J; s0 V3 @& K5 ?- D# o/ O
@2)JR(2@}FYZR8C$S_(I5.png
: ^& V4 s% N1 P& I
3 p5 D( D7 c) Z( V. _4 W
引入文件

: q( M4 Y% h8 z* [1 r; v        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。
, [" a4 [9 ?7 M0 U8 ^# w) B4 a# {/ D; [- t; ^# y/ {
0XSZEA_]~9E1831BOK)13TR.png

* G9 Y; J% J" B( V* L0 n$ [0 C0 u  k: Z0 W5 c( v- _
添加文件到工程目录
2 Z; T- s5 x2 ~/ j! V
& b  G0 W9 t4 W0 h% o7 O

5 }9 S1 ?; V. k! y) B. p, i        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。
2 E$ z9 n3 c% p# N2 c+ C- N
/ h; P$ `( n6 u3 f* O
%4N[(O9GS)PF8)KT{8K(W}4.png
' ~; ^  F0 f; M3 ]; Z- O
2 K9 w* o9 @2 e' ^+ W& C
添加包含路径
- S8 K. v5 e" D

- Q6 `5 t0 g$ V* T: y( r& R/ ^% A4 p; y
        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。
  c6 I3 c! f5 [3 M
6 p& m4 P2 [9 q% B# `2 P
@H`V2L@ZMIU~8`4QX(C$(A7.png

- ~9 S4 v, |- |$ r6 e& X
4 q2 }' @" A3 J* ?( r: Q
头文件路径

) E7 T8 ~7 H4 [; c% l' q; A8 Z" t: G0 h- n, M; `/ h/ u

. O) e2 e' ^0 u; o  n  C2 k        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
; s; D2 H+ ]2 J  t' ]5 y1 P9 g
5 p) B0 K' w- c( S6 u
E(X3}HN71FN2$%5~Y@U8PYE.png

$ J( M( k2 P) |4 X; y. ]9 y! A5 w9 g+ H  E) f4 w0 ]0 ~6 J
预处理符号
0 |7 f0 {1 Q! @
1 c  t/ x7 C+ G! q

# g- x. ^% r8 `9 i0 ^        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。; }8 i7 A9 c7 B

/ d1 B5 \# H  [% L/ m) M/ v        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。! E" G$ O9 ^0 _  b

6 `  x* b# N/ C+ t
QK6JV~FV841NN5IC5_WP3TX.png

$ G7 q& l, J/ D: [( r) Q! g! b& m! i  \
删除不需要的文件

+ j4 |; y- B# h
) g; }% S! D8 I! ^
% |5 V" k. |7 |% Y4 S        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。
" F* V$ V8 C# Y/ H3 E# _4 t% n6 C# s6 a
1X[4G7}`U8A}GLRJ)U2`4S0.png

# ]; x: x, ]  p" T# o1 e- ^' O/ p+ C  o1 C) ~! `
排除文件夹
3 ~' |1 T+ H. Z7 t" Z- @# M
. y; \" L9 F8 X6 T: I7 \& T
* v" R) A# q* R3 m! u# y
        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
0 e7 ]% m3 Q% ^! z4 N0 F  V$ p6 q& C
{TH`}RR2](L1@QC07D%X8PT.png

8 Q. J/ ]: T+ n& K- p: d6 H, {4 l1 m* I! \
排除文件夹选项
  f. c) O- ^! ]+ w
) g. e5 k: F5 J

; |7 D1 F& ?' u3 b- W4 c        注意到这时候被排除的文件就会有特别的标志显示。
2 i4 _, V1 O8 n  N( ~; |/ E/ w* p$ @
8 c4 C  }$ \4 l3 L# j2 D' X: c
~6V)0DQ[NITU@XKKVE1``]C.png

0 h- C3 G' A; S& W
, x1 T0 c; G2 H( T% {+ S% {  Y' C
排除的文件夹

8 z$ T9 F9 k+ d( X' f
% ~# z& W) i0 j+ w3 s6 X' E, n& p: t: \2 Y5 v, b3 b4 [
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。, r1 {2 s) ^0 X: d

  f4 o/ j8 P( d: e" D
X1L955JB{4QB57PVS()39]L.png
/ p; |9 E- B! X: r- `

0 X& M# q: v& D9 f) ?+ Z
Core文件夹对比
$ t7 M5 @: r" N6 Q" \& D& ~2 I
6 T; Y) U. u5 h7 I
+ [2 B6 O+ k/ u  Q
        Drivers下第一级目录,没使用到的全部删除。* Z, w1 q3 X! c: y- i
6 v  m& x1 [. e. w* I$ c
D_RA2IDV@QBUWP5BK4E2S[F.png
4 m3 \, @: k& q# z0 v/ j
# s3 |3 M4 K5 F3 `
Drivers文件夹对比
) o. A/ g- w: L5 H% ^& o

3 n6 _, N& d( |8 C( L, T7 o7 s! W7 C9 M3 Z
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
8 _  z- X; W; M/ u, Z8 c0 l% K# R8 Y
E[5RZZ0MBEZ2M(1])VZ_7_A.png

4 G% c/ H$ @+ G9 c0 R5 D: g  m
: U8 H: d0 b5 l4 N7 S$ C
CMSIS文件夹对比

; w$ g- w; h$ t* m1 \
$ Z* z/ M( Y+ s; J1 J$ o" T; C/ e
        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。0 W* P( B! B6 N& D9 Q1 L$ e7 \1 A

$ Z: K/ X. j- C- x" L' ~6 k7 M
}~YY~Z6Z[R_F65RU071Q13U.png
: D- u) n4 P+ t" R3 z
1 E. m8 Z6 ^8 Z4 R; {6 z9 R
HAL Driver文件夹
! P& \0 E: Q% G% z
7 }" b* {& Q1 p! @
& w' s. g8 M# Y5 J
        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。' C; l- B/ h5 x$ l* N

" r5 r" R* h( G1 a3 R8 j' U
BWTOV(`)SVF2DW0~U35_}W4.png
; Q. U; i) x( s8 R
9 j8 l) W( I  {" r, M) ]9 U
STM32CubeIDE编译通过

" ?& F6 g) }  p0 ]6 C: }3 T: m) B8 _: `/ F, f
/ Y2 p" B/ J3 n
        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
% V! q2 J* y. F) T& Z6 _- D  x0 {$ u& f  a- V1 M8 S* Z$ s
Q~I4GG({CFUKFJX2BP`5~2P.png

# ^$ e* z: {, s( j" j
- `; N( T$ b1 G/ R2 Y' {( Q  w1 ?
Keil编译

( G3 F/ A% [# C* E/ J  g! O- Y7 K+ i8 O6 x! q! ]' q3 q& ]: R
' ?1 ~: I0 V  Y1 j( b
        如果需要调整优化等级,则可以再下图所示位置调整。
& G4 k8 s5 K# R: ^/ R+ M- V
- C7 @8 L$ n' O. m
WSF@(%LYTF21TEC}ZRV7POD.png

( b2 C  u' m1 Z1 C& y% `5 @+ s, ]( v4 G9 c0 ?
调整优化等级

' E% Z. `3 g4 r' k/ s* \* |7 }4 y4 Q8 t2 [- x: A4 v

. h% {& }# i' D! L8 P8 P        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。. G- |0 z. l3 M; _
0 A8 Q2 H% r$ I4 n: y) R
(LQYD3L6@%}5B`RH(WO_P.png

8 e: y" a4 n/ A" P4 T! h  E$ E2 U+ ?- H; k
Linked Resources设置为相对路径
( ?* K1 ]4 P# I  S3 o9 r. X7 B

$ U6 p9 Q* J" i6 m
/ T6 P( v( @" n8 b2 A% M        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
8 V7 ^) e  k) P3 _+ T3 w
2 {' [6 F0 l; n, j$ b
{]W[95T3]KZ~A}RDZY`%(QC.png
  ^( Y! d: w% j" D

$ v7 d, {2 P" b7 L$ V( _& {
Id文件路径
3 Z7 L# ]8 m, H* b) q8 A* h
) R3 P. c2 y9 A; o& v8 c: R
6 W/ R/ p3 Q9 o& I# w& X: Z$ ]
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。
4 a) b* f% M9 d  r$ E
+ y0 u  ~. O. x7 B6 [' @: p3 n        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。/ p* r% m* a0 a" U) _
  ~; @  e- Q( |9 s7 ?! h
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。& z) N" p4 k. o( }

* P- v( {. J/ U" f
[Z`XCM(304V`$GI_]Q5~3%V.png
+ I- b0 b: t3 G, h
$ q9 ?" a2 q6 ^7 e: D* }
编译后文件夹内容

7 h$ g5 q, X$ G% f2 M- K% i6 o. L+ [. A$ W8 z

# W1 l$ w0 o& y  r        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
, d6 O) G" i" @: v0 H
& z0 |# X1 q4 E5 j$ m- p2 H$ W
9 O3 h, O, w# n/ d6 j6 ^
赞 收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

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