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

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

[复制链接]
STMCU小助手 发布时间:2022-8-28 22:35
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。
8 @5 V1 @# L8 R4 K% s0 B
4 v8 {9 O8 ~+ I          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。8 |0 b1 i8 S6 p4 _5 n
W~]HIOY42K_X2F}S)22K13C.png

: z. d1 |# X% d. M
  y! ~# _6 c: R9 i2 k4 Q9 O6 R
STM32F103C8T6亮灯程序
) a: m* g$ ~3 Z7 }" \. R# U

9 k3 ^8 X5 T4 f; s
# w6 S0 z9 s5 v) ?* s3 {. Z        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
* I8 r  M8 @: u" F* R0 v) j5 {% a
7 Y: v7 m3 T5 ~2 a  Y
3WASSYA77KBU6RZOUG@]A48.png

. l/ g$ r9 e9 }5 u/ g) b5 I7 J
1 }- D* I2 R" U" R" ]0 `3 l) B& K
创建工程文件夹
& {. d' G7 g' H& A. P, Z
  F% ^' [: Q* m( a5 ^8 q5 R9 B3 Z- B

+ U3 c- ]# R8 G0 q$ A        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。& Q  i: v( i/ T, Q" n3 ?, D- }

) o- K( x/ c  l0 \; V3 d
7LZQ$[FLK{3A{1[D(SP]N]A.png

, u& M. k8 y7 ?0 y
( T* }7 G9 i/ X. I% s8 f( ?2 F
STM32CubeIDE默认生成的文件
2 e5 F. _( M" M8 R' _6 ^. u3 u

/ |0 i. G! V4 D/ T/ N% z/ N0 `0 d9 P5 u  t; x/ H
这里简单介绍下这三个文件:
) I9 X8 \: Z2 F  A( [, i! t7 e+ O; Y7 Y, d
.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。7 Y. C: [, p# V8 M3 g, F. I
0 k" S" H& \' t$ p
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。4 Z' r# K: Q; T1 L
2 x: I3 ^4 b) b. \
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。0 l( l5 d2 ^" D4 @
; l) J+ x: O5 m, k" U( j0 L+ \
DS67T((WR_Q$(4[`8Y32K.png
* H5 b% H+ A! q: i5 a: A9 P3 `" e

7 G/ y; p7 g, P
拷贝文件到文件夹

: x6 m! ~1 {7 [0 z3 B" l/ S, X; m  L3 T
8 I2 J' S# ]. ?
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。
  L( g( @) w$ M6 q! N9 C$ g
% O) l+ m* ~! I' x
Q3Q%UCI[$E{3UO2$L`TW__G.png
7 V. ?# W( n3 g2 W/ l# T
+ I  j. Y8 m9 _( Z+ H3 S( R2 p, h
删除工程

+ q, i# s, m4 d" u
. P3 u: _# v/ q; t; ~% x3 q0 Y( T: Y
        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。
% r( O1 R2 E6 y, @" \% v2 n# K8 R. D
0{IFA_C33W7@@D%L]5ML0MM.png
6 y% q7 |6 F, S$ A& z8 m  k' _
/ n. p7 `! n$ `- z5 ?# G# m* e
导入工程

7 h! A, F6 l/ ?, h, l! ?        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
- ^( `5 q5 K8 `
9 n7 q4 k6 w1 V# P- \/ X8 u
A5$`KLMW)S[U)`Y{U@CY3T7.png

2 x8 P$ ?* A! O0 n) Z+ ^3 D! c4 [( _7 x
空工程
2 D+ }$ V" c$ W* T3 y$ p/ |
' W7 g! i; A0 }
9 n( [) F# i) w" }
         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
7 g. w# {0 L1 L- O7 V. v2 F  p! R5 V$ G. K' R8 c! _
_K9E5V1{N1{L$)FOW25Q~.png
3 s9 Y9 O- J9 Z3 {1 J  F& }% ]

" ~0 l. n9 S2 q' P* H
打开工程属性

+ Q1 {+ R' ]+ \  K) h6 Y0 u5 Q9 U( [( ]4 J% V
& T0 O2 ?) a7 \
        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。! y; F8 T4 G8 F$ t0 Z% `& Y

* j# g3 K  f/ h! L$ d
_6RT0]OW~_(3NS]}OQLE7QL.png

) u% ~1 g, O  W: q4 D3 s8 Q* v3 r$ F4 W* k0 f# R
引入文件

9 t1 E& f. x2 T6 M, A" l9 l        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。
2 v2 d& `: P! P- l2 C; k0 J
) }5 g$ G; C- V# U) Q7 F$ z
RYRLTIW[75MEAH6UG6L.png
# o) i% k' a/ H4 p8 T& A6 F) m% ^
2 J7 B8 |# Q# t4 v
添加文件到工程目录
% @( Y5 _( d. }3 Q  R

7 [; d: i5 h8 v$ ?
1 z" X: G; q" z, w        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。
( z8 a  ~! L3 c7 n" v+ M" k- P5 h8 Q6 P. w
T770OJ`GN7T1A@_W8MS10U9.png

6 Q* s8 o0 [) T$ Q  O* O% g% G8 K8 L$ ]0 }' B# I
添加包含路径
; Y9 l1 w9 G; [

/ K/ u3 w$ f$ m# a
# @! Y& G* b4 Y/ y% ^" q        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。
% H' _' r3 {6 l' P5 B. f: R) c+ x# a, w. }& R& t0 h. V* T3 \
BC4~5CMK190KR@1Z4NH[BAA.png
2 B) {$ a7 m+ t+ b7 D- w3 W

; P! R2 Y' C" G
头文件路径

/ W3 R% S9 U) F! x8 o
, J' r, e2 E& P# q' m! e. q3 Z1 C$ A9 O# N
        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。. v9 x" D9 q/ z, v! }4 d+ [
1 ^0 Y; W' A" y) E* h
CM8PQDG(~KSMRB5%[RGJF.png

2 ^1 K* C# n( S7 H' f
* k0 x6 P! _5 O# F0 K2 `
预处理符号

9 D1 I/ f+ E* G" d" @5 I
8 @- O+ I7 @3 c4 g, G8 ?- i  D& C8 I1 }
        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。" z. b# I) i3 s: I
- D! j6 c7 [9 W9 x6 U  K
        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。
7 A4 i& x2 Q0 [- g; `7 O7 I$ r; D+ J& J! l( R# `
~E}(WHT~SY9YZ76~6B0FEYX.png

9 d- W) l+ l3 L2 L0 w; o$ D* A+ I9 G5 O- [+ Z: h3 B
删除不需要的文件
4 i2 r: y7 E# `, \5 q
  B" U( _: B' o( p. p/ Q/ j

9 |: `. C. i  C+ S0 y, U; ~        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。3 ^! K, g. a  s5 w& f

/ a0 C) k3 X' s3 a- X  W  _
CH%)1P7Z{]}@53ID$W{ITXO.png
; `+ {0 G% J5 b$ u7 j
* g8 U* A8 O# ^+ ~
排除文件夹
' L% p8 H* h  u  w* n: K

4 n) E1 T3 M9 V, z* X$ p: }+ Z0 w0 E7 J8 {" S
        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
* W1 h# P3 P# @  u/ f
2 [% |1 {- i. d1 k$ k! }& R
[5DE$R5L0S8}UKB3ST}8GES.png
0 J; l9 r* a. @& F! r$ W+ @
, W- _/ ^8 r& E1 A. W( J
排除文件夹选项
. _/ Q- Z6 N8 K+ K# @

: c( O3 s! y/ E
* w5 N9 w0 ]- h7 n        注意到这时候被排除的文件就会有特别的标志显示。7 R+ h5 z  c, m
2 Q7 g. \' ]& @( ^- Y6 _
6X%VAYE)JZ$BFVJ]8TFZ))5.png

* t5 d7 ^; Z. x- P: x, M& _% D4 ?* |
排除的文件夹
' V( Z- G2 x- Y  V. C: c/ y
  ]( r8 p) o  p) F  C1 B

2 `) S4 ^6 Y4 J7 ?1 K        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。& N& I9 M) O9 J& R
4 Q9 X5 N6 d8 s6 [% |% _2 I
6PY}1]A__5{@{[[LM~QCD[A.png
5 N2 l6 Y" c- {$ N% v

- o% u* ^7 q7 ^% V6 Z
Core文件夹对比
/ N3 j) n& k% T3 G! M

; x9 Y+ A" c* v9 D
+ T4 X2 p1 J0 }* D2 x3 y        Drivers下第一级目录,没使用到的全部删除。
. c; \; j' c2 c. X' C
1 X6 T) N( B# r  I, @' A# V
AHA811@1J~XZX[Z6ZZKMGMD.png
7 W; U2 S0 u: G) l5 E
/ r. ]- S0 g- m5 T! `0 U
Drivers文件夹对比
5 i( n6 J. j5 D
' _6 B5 W* I2 m* Z' Q: O
# o0 R! }# J0 F% c
        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
* ]3 k* w8 {; ~$ v9 D8 ?
* K* A( [! `2 `( \# e
BADIRDPV72D{E2LGBJUG0)E.png
; p0 X5 j2 i- E0 r

8 E& _- Q& ]' c# _. Y: O- J
CMSIS文件夹对比
% N/ ~  V: ^" T3 z

; {* g$ E$ O5 B( h" E' }, f
( k1 [" S  a) |; q        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。
* E* t/ I+ A7 U- ~0 ^; b! w! G& f0 I: T& Q/ `; |( P
9F%~JU$T1I%6(EHLZN)U}NI.png
; h8 u5 ?! s. D: c. d& y

  q; E9 D0 w4 u" B' J& d8 z
HAL Driver文件夹

( k* j& D1 H: N9 B; Z  p' K$ x5 e: T* O3 R. b+ y1 u

( e5 S/ Z, s& Z9 a% x' b# W6 J* {        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。
& ?) G/ Z+ {8 Q) [: ^; M8 J( M0 n, z' @5 ^* B2 X. p3 ~' z
8CAK_X7IFV$}@IY~P9Q48U8.png

$ l6 |- I5 C9 f3 U+ K6 U  J2 [2 J8 C- `3 ^( a0 M, H! X- T% x( S; V
STM32CubeIDE编译通过
+ O$ n  |) A1 i. p7 [3 ?

# z& a" V2 p! \- Y* B( q& z9 w% A  q
1 i* F& O2 |( o3 p        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
) W9 h# k: B1 O& U9 W) n
" r% h& V" P) @9 t8 R
5}EK{Z~[`IE3XSE(2}LW27H.png

- P9 c, Y2 g# }* A9 ]& }% i* `/ B4 [, E5 x' V
Keil编译
1 J& b5 Y. J7 l$ C4 {
- @8 g) ^8 w7 ^' M4 _7 W1 Y/ C0 L
: B# R2 A4 g# a0 h; R7 B1 a
        如果需要调整优化等级,则可以再下图所示位置调整。5 r# N6 t7 ^" w( s: L

6 r  M- ?1 X+ g) O1 f7 y
57{)78`IUIE3X[T}$_{%Q2V.png
/ n0 S' x+ `' e* c
* e) [! ?( f( K8 j
调整优化等级

1 e7 |4 Q& O* N' U
5 X/ K  A6 X/ N/ a) o# Z3 _5 G6 D. t+ v6 [
        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。  d* F: T1 @: z9 A! r( r1 x6 G; a

* s: U& l& V# \+ z
A`N)L93O7)A}[U(6BQ_W173.png
/ `  q; }' Z# v4 S7 v7 J

, n& Z) j4 }4 ^& R; y3 o" @7 \
Linked Resources设置为相对路径
; n9 f3 Z4 ]+ Z- v

4 v, M1 s3 n6 F; a% y) I4 Z: I3 Q) y. d8 a
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
* @2 K1 t0 l& K% W; g- M# o
/ v/ D7 z" w( O7 _" |
QR%O1_TQ0PRAMM`NLIO$Z}V.png
7 Y, ?% b; \* p- Z" t. y7 N
1 Y' \. _& ?, G; g& B5 V; J
Id文件路径

) G' p0 Y9 I) t7 a; v; y; X; F. _  P" B% A! V4 j- O

- v9 K; I0 y5 K) i        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。3 U- Y7 Z: b6 l, o
' I% W$ S  S& J1 _% t7 H- ]* I% X! Y
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。
) Q: i, v6 b* N" o, U1 v" F) I3 C: T2 u. K) d+ _
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。
0 `" P  u' z' g& j' C8 }
0 {9 R/ E' f/ i5 ^) i9 f7 v
V]JP257Y{[Z5[Y]24((YAGF.png
8 y$ i) c  l7 |0 Z; N

- Z2 k4 i+ x+ k: E
编译后文件夹内容
% N7 |) ~" i# N$ Y- |& n) Q

% N, U# _) _2 _7 `( Y1 Z/ A3 j  z" f4 X8 k& Z3 |
        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
$ \9 _) F$ ^) }) O3 [9 x" J& h$ j# L$ D2 E& T: v& ^
作者:bili_42806779649   l- M" `6 p& J  |% a

: z4 J$ Z- a$ t& D" F# g" Z9 ?. \; l. M  P9 H+ W
收藏 评论0 发布时间:2022-8-28 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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