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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。. i" y/ ^1 Q; ~, t- Y5 a$ R
6 m% ]( F! J* ]: }
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。# b& \0 c0 f2 f5 o
(7[HULSY5M5PEDSVH0SCNGJ.png

; c* {/ [: \5 x, q8 U6 `9 T) I" B: J9 g( H9 \
STM32F103C8T6亮灯程序

% h# W2 g* J$ L2 Q3 Z$ K  Q; O' E" u$ u% p2 }% ?) D4 q
3 M! t* @& U6 b7 Z; Q, B2 _
        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
- _" \8 b& H" H$ F; P. {: ~6 t. X5 [3 f  Q6 e/ E" R
LQZK{H7EQAWA61RTUWK%V.png
4 a6 M" m- F0 @

# x# Z; Y$ h  }: k2 t& x% |) h& S
创建工程文件夹
4 H; F8 [4 q- U( {. `1 |
  n- l# e, e0 {& ^, U

! Y! F4 V- g$ v# D$ \3 Z        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。* D7 _6 t5 t! r; {& I+ G
- J& P/ N3 Q  o* `3 ?
8TEZDA$)K%9UMIWWPVN9ETF.png

& V2 K+ p  c: G# }, F, K1 a4 F  @$ D3 M( X% E& O3 o+ ~$ q* U
STM32CubeIDE默认生成的文件

- S. p8 o3 O! q; w2 \" P- d# ]8 J! m1 u6 w  M; v0 [
) J& s/ w  O/ E; F
这里简单介绍下这三个文件:* n6 M5 x3 J6 R

3 \6 l0 j, |* L" h% D; s3 S.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
3 J4 D/ o1 N6 i: @2 b& r2 m' t$ _5 \0 @0 A
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。  ?( U1 u5 [9 ?3 Y9 H! y
. F7 K2 z4 A4 ^, ]
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。
/ A/ ^4 O! y! q5 w! m
8 [9 `8 R# I# T8 J" W' h; E
I`V)S98ZS_$KWFM(~TWT_GR.png

6 e+ l, E  R* n' [. q/ Q
$ x) o; U- q$ J7 R7 s2 C( }
拷贝文件到文件夹
, V9 Z: B: M. T

0 M, K' c. @. e; w        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。7 F" P" V- f; ~0 G
6 k) K' A; p1 s! n# e' T' `
T027`8H%TGTW(@$GRR}6PMT.png

% a$ m0 D% p2 m( X8 ~% Q
/ ~. ^9 a' O' r
删除工程

  Z, X, _( d1 T! U% ^: q& l/ ^- j7 ^3 |6 D" k7 ^& c& J+ \" n/ J3 ]

, o) e5 y# Z7 S9 I        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。; B1 N- J5 W  {) V

7 a: g* {, V# S
S46$GH6(T@P7OI1T3Y45CHN.png

8 s0 U/ P; G5 J% I# u" ^# v% {7 o) w$ l) p& ^* q! V; ?
导入工程

  ^1 n* x4 m  m( n/ W4 O        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。0 a5 S1 [8 M/ f: [4 J1 O
! V. L3 `1 O! r; i" O
J4N[77]P9GFMSI0FA88[G51.png

# O; ~5 I* ~' l' m+ a7 X( D
6 y& Y4 T) `5 C/ r
空工程

* P2 k& `4 H: d$ J  X% n  T' p9 I7 V+ H: W
  u; o  r( o% b5 D' w! y$ f
         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
+ ?. G# l/ r$ s+ M$ H3 `
/ U0 ?1 v& F* B' ^0 @8 R
4PORY)@%5RH[@6XRM4%2`EX.png

! \4 i; k. N! ]# n# @0 W( a- e, {3 g# h: u+ a' {# m
打开工程属性

! @# u) j' E: C2 u$ Y; r( w
, _4 F; X7 o. `8 D
+ K9 s+ l3 m8 B2 S9 \  c* a+ m/ c' f        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。
( h0 B; l% X( L. C  h' }& G; A1 T, M9 B% g8 {" z
@2)JR(2@}FYZR8C$S_(I5.png
/ Q& M3 h8 W+ q  o% o6 @. `- q
/ d6 R3 ?3 \- ]
引入文件

5 j1 g# p/ m2 h        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。
; j5 g( \) C4 U* ~
) U/ u2 C+ t7 G
0XSZEA_]~9E1831BOK)13TR.png

$ f' n- d, t# A6 G# B! E! {' Q
0 x$ N) A) R4 _+ F+ G* h) S
添加文件到工程目录
! S% ]9 x3 h  r3 D, n

' B* h$ s8 x  X! h' J; L( l& {, _6 |
" M9 _- t" K3 R" L4 X$ ]# b6 ?        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。
4 M6 G( x& ^* H
: d) E+ m2 M6 v1 {* }; D! M7 F; @
%4N[(O9GS)PF8)KT{8K(W}4.png

9 s) l* ?; h* ?# f+ m( K% W0 v
: x6 u6 n/ ^2 n( c( K- \
添加包含路径

$ @3 ^5 ~: f9 u+ v* o) a$ V
7 V/ S! A; I9 U  d
2 P# U! G8 S! [! S6 g3 R) v        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。! ?, \" S6 z) f0 @& E+ s9 B
) g& o) A8 `2 a/ b# Y' \& l" F0 a
@H`V2L@ZMIU~8`4QX(C$(A7.png

; W# [/ i' n/ ?: S8 `
9 T5 [: W2 j$ y7 X" G
头文件路径

( W; [5 u) C, w0 _% ?
' V3 E% e; F( Z6 T1 Z# F5 c1 V7 y- d9 @8 N" p
        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
* y1 T7 m  F7 I2 ^' C
4 `7 M; d- ], m" L, m; |/ R
E(X3}HN71FN2$%5~Y@U8PYE.png

& ^5 W" Q% B& D2 D1 `5 ^
; o9 W2 l! v* r6 y
预处理符号
5 M6 a) j* X' X3 Q9 w0 Q" u: K

" y9 y0 x% ]  H0 c0 _0 J& i9 `, z
# f+ ?, b# [  `  g5 V        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。0 t! `  V+ a) l2 d7 F+ I, z' m
" k: o0 v/ I1 t" d4 q  B
        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。' G4 f  Z/ d8 o6 H# t- G8 l. {
: f( Z3 B2 M! f# D# p* `
QK6JV~FV841NN5IC5_WP3TX.png
( J( R, p. x9 G, \% h
: O' d# N9 F- z+ b
删除不需要的文件

3 i  N$ P) @; [; ]! Z
$ m$ M8 Q$ G) l' M: Z2 t+ g& }! ~# a
7 {4 A- w+ h9 v. S3 b9 x& G        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。
; g% Q/ {( N% `; C( H$ C' a4 _( H& J- j+ K% I) f  y2 t4 s/ E) W
1X[4G7}`U8A}GLRJ)U2`4S0.png
/ _0 Q' h6 p) A. f
# T) W7 I1 d+ Z/ ~! Q
排除文件夹

0 f9 F& E" I8 M4 v6 W- f7 K3 W: B/ L) u5 y! |; i: r2 q

2 `* ?' {# I# V2 `        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。1 k* h/ E" B( R1 Y) a  I
# T( l$ P( _/ {/ z
{TH`}RR2](L1@QC07D%X8PT.png
' z9 o3 R2 r0 P% ?4 V, @
" U; E; f: ~( a4 [1 h- Z
排除文件夹选项
& F3 f; ^6 e6 X

$ [3 |) \9 Z% C0 L: }( C' W' _1 j# I% {$ f4 U$ d. N
        注意到这时候被排除的文件就会有特别的标志显示。
( w1 C7 o0 X# b' U/ U( C( w
) y+ f) r! F0 Z& |9 K. i
~6V)0DQ[NITU@XKKVE1``]C.png

* a- m9 ?! P5 R. Z6 Z) j. |; h9 G: m7 U
排除的文件夹

7 ?8 v# r5 T" S2 I: i! F
3 c5 }, R4 Z) l" ]6 `+ U5 x7 Z8 G" U0 W! E6 X+ A9 ]; G* q
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
2 ]6 A7 F: B3 p6 _* U
( c3 g3 ]4 b1 M9 W9 E
X1L955JB{4QB57PVS()39]L.png

. M( Z& Z) F6 S4 |% O6 \4 y% [8 @
Core文件夹对比

( |; w0 {( U* }$ T9 }
* S8 X, `( n( ~, `) ?% n. s0 e  W1 r' M
        Drivers下第一级目录,没使用到的全部删除。
$ ]) o4 b9 w% K1 }, q
# c( W! \# x7 U, M, Z6 w# x* o
D_RA2IDV@QBUWP5BK4E2S[F.png
" L3 ~. D  A) l3 S
8 t5 X7 Y: d$ P: f
Drivers文件夹对比
2 N/ E, k  R+ p- `- D2 q2 M( e
% I* J; i3 `2 _

5 e2 j5 ]/ k6 l. @        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
) i& K1 l+ \. ~, a" ^0 c- e* W7 ]/ S1 W1 P6 R
E[5RZZ0MBEZ2M(1])VZ_7_A.png

0 s3 F* b6 P) O: d9 Q$ @9 }# H( Q. ^9 m$ t+ u6 {5 A2 h& i4 C
CMSIS文件夹对比

# I$ y% {( J: Q& L- y9 x. h8 }: @; c! ^+ _

$ b$ u# o: _1 N/ _, M7 Q; K! Z0 g        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。# \! c$ P* Y! T- h1 S* t  d
# X8 W/ O- O. E( b  Q6 g
}~YY~Z6Z[R_F65RU071Q13U.png

3 T4 _8 ]# {. f0 N  V- u0 v3 `& t8 ]  F8 K% H. T) }
HAL Driver文件夹

8 c4 W7 d- [/ N: \% {. P3 u4 M' P' {* C4 W( b5 x

5 \; \+ C; t" y0 N4 d        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。
  r( ]- ^4 g9 q' w  \: z% w- P8 M% n2 v( g- Y; m( B3 T! B
BWTOV(`)SVF2DW0~U35_}W4.png
( r# r7 n& U7 |) `% H% w

7 c" \1 J  [; v7 \* D! r9 e
STM32CubeIDE编译通过
$ T6 \( Z$ J0 M/ [

, ?# p* I0 |! v6 ~) J* w+ ]% }, L- M/ Q# k0 |
        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
$ U1 Z8 X7 S' D' [1 b, @* x
* w" l9 _* J9 g0 H+ ]" w: q
Q~I4GG({CFUKFJX2BP`5~2P.png
; }# b2 ]- R6 C: S( m, r: y

) R; }# ?7 C$ w; n2 s4 K2 Y
Keil编译

6 w0 a; R. s1 F+ r# @4 w: c4 ]9 }) \3 g

$ w; W+ F5 |3 |' `        如果需要调整优化等级,则可以再下图所示位置调整。+ q: g0 T6 m! K+ Y  j+ x4 |+ H

+ k5 o$ i% O, K
WSF@(%LYTF21TEC}ZRV7POD.png

. C  i) W) _4 o/ i. e) f4 N' [
( p, [  L5 `" n1 s3 n6 f
调整优化等级

, c3 ]6 G# u6 d0 \2 f" }. ?
, p& D) e+ O& d( @5 q7 b7 ?
3 D3 D  `3 B; E: V: z        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。
! k  P) O  i& r# H( ^7 L* A+ l
$ R- Z* L& H- N1 n6 u1 I
(LQYD3L6@%}5B`RH(WO_P.png

" E4 f4 Q5 Q- @& e% @, b
' Q' ^$ l- @; J
Linked Resources设置为相对路径

6 _6 N) u# u. T! E$ J5 v0 B" U9 z& @) a5 t
+ y. c( S: b/ U( j1 M/ U) W
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
$ H* o8 Y" U0 V# b& z* M* V" P. l2 b
{]W[95T3]KZ~A}RDZY`%(QC.png

0 n0 c6 U4 g" p* \( R, T) ]: [: v1 q) ?- [4 T$ d1 q/ D
Id文件路径

" A) u% ^- X* u8 _+ j5 B4 M8 H
" \% z# y& Q# b
# q5 {5 E% t$ S' Q& j( M- ~        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。) m9 y& ?$ X3 c3 m3 ?
. U- Y! G9 X0 l: f- z3 b1 q
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。% r- Q( T! c) q4 I/ s( i3 q
+ L/ }, f5 s0 b) F
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。! N2 P- Y/ X  \$ d3 `
4 ]! _; ?+ C( T4 u" N2 k6 ~
[Z`XCM(304V`$GI_]Q5~3%V.png

$ B  ?9 L$ {6 B, s# i5 G
: \+ L3 w/ ~' O9 W
编译后文件夹内容
. p( g! U( g5 |+ r

0 v6 m9 o. k( v4 u. c4 j' O9 b: ]4 L0 L% H. H) M5 ]; @! ?
        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 * z' f! K# X1 n  ]
. T2 |& ~9 K7 X8 b: i6 Z
: f7 L0 u! U: U7 f( Q3 i7 Q8 A
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版