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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。
* s# u# X1 H$ w7 r  i2 S+ ?& h3 G+ q( W9 q3 ?  }8 b  D
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。% G3 u) G  [! r
(7[HULSY5M5PEDSVH0SCNGJ.png

) M' F0 s" O  f$ s: f0 `, d. N" ~1 `% {7 ~; n& {& `/ d% p; n
STM32F103C8T6亮灯程序
. M! V* u. J" v% p

& I) }7 h9 ]7 P& z/ Y8 o7 }& P1 k6 g; s: e. P6 d4 }- Q, e8 W4 f/ n
        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
  r7 y5 o: I9 s- q; O. A
) A# `9 E6 S" N5 F0 p2 S$ ?
LQZK{H7EQAWA61RTUWK%V.png
6 S( {5 ]+ N2 [7 X

5 p* h* x  Z& ~: c0 Z. A, c
创建工程文件夹

% n. v" {! o/ i5 t/ j( Y+ _% @' D4 O) m; l5 L/ {) G3 h6 f$ _
1 l, o- d& s. Z
        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
0 n) |' i3 \& E/ i2 T& m2 s3 _9 p5 N; Y% G9 E; e; \4 p7 e
8TEZDA$)K%9UMIWWPVN9ETF.png

" N' m, m" c5 a/ }: r
* H# Q7 z! B/ a3 D0 R
STM32CubeIDE默认生成的文件

9 G/ L# i. n" j0 Q3 E7 S: ^
7 D# f$ Y( ~' q# F9 P  H0 s
6 w- o, ^6 Q. i0 r5 t5 A8 k这里简单介绍下这三个文件:
, `/ e9 S9 j- a- E. B' j. S) `: |+ X2 O) d0 U
.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
( C1 D4 }: z$ R7 D3 e4 w% J8 t, j/ w
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。" K1 Q4 e5 _$ n7 X, D- L) t

  r  I6 M, a; E4 X: |STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。4 e7 Z: u# D2 e9 ~- U) j2 T2 s

+ H5 y8 ]; ?/ Z/ g$ m1 s
I`V)S98ZS_$KWFM(~TWT_GR.png
$ t  o5 r2 _: L- C

. e5 Q- y$ A( j  c" x
拷贝文件到文件夹

9 u! |7 d, X' E1 l+ o+ H
3 j# y4 M( {* @# [1 h6 m) N9 I        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。$ c& c. ]$ |! P3 e
: ^6 _; v# Y; T  ?* M0 Q& P
T027`8H%TGTW(@$GRR}6PMT.png

6 H, ^% a3 ]8 Y
4 W0 K) _0 i) N) h# Z/ w) v- M
删除工程

2 @, ~1 r- e4 Z- d3 r( n9 \9 K' b  u" r) p8 `

, E4 ]1 F# q' d' K# |        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。- t7 z* f& x5 ]$ L
% H1 i- ~0 U5 b; J
S46$GH6(T@P7OI1T3Y45CHN.png
* z% o# B* Q( |. F' C
& l, y, e  z1 S- P
导入工程

; h# V3 m( f6 U& \+ D        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。3 O6 w5 O3 [/ `" u' h! n0 W
1 `/ ^8 p) B! r
J4N[77]P9GFMSI0FA88[G51.png
: x& K9 P; n) Z

5 E: u# ]; D/ j0 y& l: Q. ?
空工程

( {+ F8 q" g/ A) U
0 L) z# n# }, S8 E+ W# V
; M" c* T( M& M% ?  _1 W         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。% }$ j6 Z: W1 b

, f% b# Y1 ^9 ~. P# _% v* }
4PORY)@%5RH[@6XRM4%2`EX.png
% N# F/ ]5 D5 Z, T$ e6 f+ u3 h

4 U7 K! b, D* h1 Q1 x9 c
打开工程属性
5 v" O$ Y, t# l- T' e" ^, J8 ~) a

; I( X) Y7 u1 R, L
: l, ]3 m( R/ T8 ?: E$ L* w9 u        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。
* C+ Y5 e% F8 A# p* u/ |0 _7 R1 I1 y% v( u5 {+ k2 _' i  D
@2)JR(2@}FYZR8C$S_(I5.png
" y; ?4 B! E6 H: K; L
/ m" z; ^% _7 \/ U! M" j7 }
引入文件
2 I/ x6 P. _, I$ Q
        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。
0 B: g# |- Q1 j: J4 P1 J4 t
2 q2 k3 V7 _4 Y1 |* f
0XSZEA_]~9E1831BOK)13TR.png

( e. ^  g) n: D& K! T( {& f
  O# Z1 p- \# |( h1 H7 ?0 D
添加文件到工程目录
6 B! S9 m" J4 r

4 X. @/ t& y. o! Z% g% x$ @( ?6 q. k" g6 N
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。  s7 g3 F5 H& `2 R7 {. \
  q5 x; J+ _" X( O! E* R
%4N[(O9GS)PF8)KT{8K(W}4.png

6 Y3 F! a. x! e% k) H# U* G0 L& t2 W' }: P$ A7 p. P2 }' F
添加包含路径

( _* |" v% M0 p! ?0 {* s* B! P$ d6 w# \7 i2 x

( {5 \* R, c  k) h  X, f' [        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 D8 Q5 p- }7 ~1 ?6 L: k
5 H% W9 E; A6 F0 i
@H`V2L@ZMIU~8`4QX(C$(A7.png
8 y) f) {3 y5 J  i
% P3 X7 X3 I6 U$ W: n
头文件路径
% p  @7 I7 b* C8 G6 B
; N+ ]* L1 |  \- y( c: x6 |, K' |
+ k, E' g3 C4 b8 I7 M" }3 I- L
        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
& ^7 h7 k6 k! C
: y. i: k2 V5 f% |6 r
E(X3}HN71FN2$%5~Y@U8PYE.png
* l, v# J$ m/ w

2 v( Y5 ~; P3 \! f1 W
预处理符号

* W; B4 b2 y2 R; S" |, a5 ^& R0 w) I* m/ l* V8 o, `! K5 @

" z' }, [* b: w$ g3 n& ]; Z/ t        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。: \6 Z" d1 p3 M, X) C  R% d0 I/ k

( k1 Y6 _. i/ a4 g: z  [  m% R        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。) v3 \+ b2 l/ d0 H- k3 O8 t
" Q9 @: @9 ]  j/ ]( c! P$ X1 `
QK6JV~FV841NN5IC5_WP3TX.png

: G" X+ l4 l9 a( q
8 h5 Z, r; S0 P+ \( [
删除不需要的文件

2 r2 r: }% v8 c' k! H- P. ]0 o( x% R( z  _4 X5 |0 t7 X( W8 t

3 v* H+ l5 j( S6 Q+ {        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。/ R4 G, M' Q9 D4 d

  y: _6 x. i) R8 B1 u! P
1X[4G7}`U8A}GLRJ)U2`4S0.png

" O6 \. C; `; V& C2 N$ z- t" j9 `
/ d6 u0 h$ e) A3 n$ l  r4 x
排除文件夹

! O4 C) F" k+ N9 y* _0 N
* R0 Q2 F1 G" l/ s. D5 C8 U6 L3 R4 R( g0 f7 A2 j
        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
* k* d1 W7 O/ E* q% P* x# Z, J* l2 \( M7 Y5 H* L, l' z0 w: d( _% m
{TH`}RR2](L1@QC07D%X8PT.png
7 `& S( X7 ]& B6 n$ n6 e0 `4 {
/ b9 u+ z; o: P" E- q9 s
排除文件夹选项
; u0 w8 I! m% Q5 M6 K) J3 g

: o  u* V4 e" U3 l
1 u& t1 t1 ?: Y, |        注意到这时候被排除的文件就会有特别的标志显示。8 b4 D( t% J5 E+ f9 A: X) X  C9 K
( ?( x/ ]4 `" _; S) _
~6V)0DQ[NITU@XKKVE1``]C.png

& c2 N) l/ N3 ^1 v/ y( S2 {, t5 g3 v& G% w$ L
排除的文件夹

+ _9 I! d: n0 y" z# H
( V- G5 J  q: d8 v2 A, j3 O
1 ?1 O6 |# F8 U$ ?/ ]! {        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
; Q5 l* w; D) P! @
/ V+ s- [9 Q9 A2 n2 y
X1L955JB{4QB57PVS()39]L.png

2 D; G" t+ q& U- j( A$ k1 v, F" x
4 t# j( i) b$ p
Core文件夹对比

- M  x% k9 Q" g
! {1 j2 b$ p; P6 m+ I2 h8 _8 u
" f- {) F, g  o  w' y        Drivers下第一级目录,没使用到的全部删除。+ K2 [9 Y$ a, d8 ]& o
: @2 a& g& }2 r( D- z9 F" P4 ]2 g# z
D_RA2IDV@QBUWP5BK4E2S[F.png

" t' {1 N1 o, C8 d4 x
( P! X' e2 i+ _& x# u
Drivers文件夹对比

5 s& [; U/ U5 k6 Q. |! s- _7 r  V0 u/ w
" U/ z+ j, F$ R# ~) W, ^
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。$ k* Z$ e2 |( Z- f$ X* i( }
7 z3 ]! m' {+ {0 t6 e! S0 u2 {
E[5RZZ0MBEZ2M(1])VZ_7_A.png

. @* u% a- B. @+ _; g& S, I1 T; Y& l
CMSIS文件夹对比

2 ?, T; q6 Z. v& W
. C$ j8 r& B9 H( y& l# i- v; s" B5 E0 c& Q8 p+ G8 R
        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。
0 q; K% Q/ v' z8 y( r% \
4 P0 Z6 A' M, ?8 k4 j3 Q/ c+ A
}~YY~Z6Z[R_F65RU071Q13U.png
2 B. U. S- w% U3 b5 f
3 V+ |" R) c& C6 t4 C% Y- J' w# Y  m
HAL Driver文件夹

) I6 n+ ]; i4 x) u" h( a$ O  \! X" F

3 D! M6 R" v9 \" M; u5 L        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。
. v& a3 Z7 X0 S2 l$ G
7 F  k" e2 c- O4 I  D
BWTOV(`)SVF2DW0~U35_}W4.png
* z& v% M' L( Y1 ^

# ~# H8 d# P0 _  i* {" p
STM32CubeIDE编译通过

8 e/ U, g8 R6 R5 ]
" Q2 w' O$ n  |+ g
5 b9 s7 }% X( D, G: e5 W. m& ?        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
2 x& A( Z" C/ v' B; |7 @
, \' U/ p- A2 z9 h/ g
Q~I4GG({CFUKFJX2BP`5~2P.png

  F- W& L/ @" ^$ M0 q5 i2 ?0 ]- q: @) Y- K
Keil编译
. r4 Y  A0 m7 d6 s- Q

6 f; Z5 y  a7 F! b4 o8 a9 X' F- e' q; ?9 p# B$ v) e
        如果需要调整优化等级,则可以再下图所示位置调整。
- Z( J) U* r, y0 E9 Z& E, z3 A; U1 [/ B: @3 V4 E) `
WSF@(%LYTF21TEC}ZRV7POD.png

, W' Q% |* r2 q: J% X" }  F; D+ X6 R9 ^" P$ T9 o7 Q( B; ~
调整优化等级
6 r/ E9 z3 W; k3 X! C& d( Z

& W3 B4 S! `6 _4 B7 B7 W* G; c1 U
6 a( o8 h8 _" ?% R        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。8 f5 R. A1 X7 ^$ ]: n* C6 L9 E

1 h8 J$ \7 z( R7 `# J9 b0 h+ F8 i
(LQYD3L6@%}5B`RH(WO_P.png
: P3 {6 d9 A' x/ s: `# F' W

" I8 s$ ^3 _/ ~% t
Linked Resources设置为相对路径

0 i9 X* b3 C" |2 B' p$ r3 S
  S, t$ @# H% f5 [: a; f) n
8 A& p4 D5 [1 F) e3 [$ F$ A        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。+ x3 M& K% b  v, L
3 u9 f1 i9 l& E  A4 P2 a
{]W[95T3]KZ~A}RDZY`%(QC.png
* V: _3 p. K2 K* @6 f1 ^" |) q
0 i3 F. R% O' P( [4 O# a8 O
Id文件路径

$ N+ c( j5 D7 k# Q; p) @" x
8 n1 D$ _# c; u, J0 s' J1 ~
; ~/ ^& }3 E7 q5 ~5 Q# f7 A5 S        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。+ z, d" V5 p1 i$ E

' i& W( \; j/ y: I5 |        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。
2 u  u9 W1 f, I( T" T  z, h5 w) o# f  R
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。+ [9 s$ C; w% T9 {% P

, `; f- j1 C, |/ N* N
[Z`XCM(304V`$GI_]Q5~3%V.png
9 g* v/ b* Q4 N9 ?& `

& M* l, M1 Q6 I6 f% U- @  J
编译后文件夹内容

; @6 D' ]" r, `4 Y% k- q6 n4 M! A
% L* h* S' T4 [# o7 R# K' A- ]) S
  X$ ]' @* v# r0 F2 u4 `' e        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
; k: ^( n1 d0 q( t% Y
; }4 J$ @5 s+ o% E, z9 a* h7 V& q5 ]
# x8 z& S0 g. \9 G# l' T0 y8 u
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似分享

官网相关资源

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