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

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

[复制链接]
STMCU小助手 发布时间:2022-8-28 22:35
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。6 Y5 e7 S- n' D+ B
: _, G) X. U1 Q6 j
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。
+ U8 V: }& y6 ~# z9 m
W~]HIOY42K_X2F}S)22K13C.png

$ s" {0 d/ D, }  d# A$ M5 b6 `+ d5 ^3 G  L/ O$ ^" u
STM32F103C8T6亮灯程序

1 q, V# z2 T. H6 A/ H4 V5 C9 ^0 ?5 l: S3 Q* V: @, J! t& X

3 R& s. p! A8 [! [* O- n        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
: }8 ]0 \- @9 {, O
% i+ P, S- j! [0 ]. |# _* Z
3WASSYA77KBU6RZOUG@]A48.png
; a+ Y& x/ N8 U) e
4 U+ w' r0 t+ V% [
创建工程文件夹

$ y/ D4 ^; i) ^5 W$ E- i! ?4 h9 @+ |' @% S4 I, T% ^5 K2 V
$ V) A0 v+ Z- s" B" ^( n
        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
; L2 U$ t3 e" b; }6 d7 }, Q( z/ t5 y, z* O- W
7LZQ$[FLK{3A{1[D(SP]N]A.png
3 T- z, M7 [1 N7 R: K2 _! g, v/ ]# ]

2 X! B0 g! f3 g
STM32CubeIDE默认生成的文件
! ]- ]7 D, e" y' T' t6 M

6 o" D# |- q0 j: Z: a' D% F1 _, e3 ~- ]; ^
这里简单介绍下这三个文件:9 D& o/ G3 E: G( O
3 b4 {5 m" c/ ?  f
.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
6 m9 d& a: Y/ O& W* v/ m, }4 q( Y+ ]! c) Z% A7 E  T
.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。
  Y$ P4 i% c, W' F  w; H1 I8 W5 M$ a3 f( c) G# ?
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。6 P$ ]2 |% P' R# K, \

% U4 R& Q/ E" u/ }6 o7 L$ Y1 G1 {
DS67T((WR_Q$(4[`8Y32K.png

2 e# g: W) y" `' F7 y2 F( k; U9 ]: L/ {! x# h1 b$ V. O$ {/ H
拷贝文件到文件夹
; {2 @3 e* o6 F% {) d# B
+ a& T$ y6 e; j; K

. k$ A8 I. g) L  ^- B' C        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。
- n: j: V7 M. m0 f: f5 Z7 m6 h9 r  x) W7 w
Q3Q%UCI[$E{3UO2$L`TW__G.png
  @$ I8 R" f+ H1 l5 C8 ~4 r$ G

. l& \8 }4 Z; q1 n) ?
删除工程
( J* S! I, X5 W
& e, F. }! T+ a- A! P0 X1 A

. U9 h4 ]( V/ l  ?" g, n        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。: `! y1 c& H- O9 c1 t8 }! d

/ R. t- X6 i7 v0 O
0{IFA_C33W7@@D%L]5ML0MM.png
' a! l; B: ^* |; L' x$ J: x5 B. m1 o, _

6 E  ~( y' Q; S' l) \. T+ b
导入工程

# l5 L0 `  F3 T+ |        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
  Z0 D" \$ d7 A8 h5 [- w6 l/ F5 _# p$ P0 M3 e. k/ b/ p' n3 d6 {, B
A5$`KLMW)S[U)`Y{U@CY3T7.png
/ y* x/ m; J9 x' m( y+ \
- X2 Y) h! b+ A
空工程
! J6 w- V, y' ^, d

+ w; M7 Y2 b7 D, z. }2 T0 _5 {, K! Y1 j
         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
- A" M+ l2 `" Z! q/ E) S6 w; b3 i# D- c4 }5 @
_K9E5V1{N1{L$)FOW25Q~.png

; v. i/ D% g7 P( i! H' d% n( a! Q8 I- V8 \) g/ Z( n
打开工程属性
3 @! X* \5 K3 D: y+ @3 u- m
' t5 `4 ]) J9 Q: @

/ [- Z+ _9 l4 {        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。3 X: t) b4 k1 r& O
( }+ j+ k5 d7 C  s! Q3 e
_6RT0]OW~_(3NS]}OQLE7QL.png
# B% w5 l3 O$ D
9 o8 j5 \9 D& N$ H8 t
引入文件
& L! S) X, ?# R
        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。( f9 I" M" s' M5 @. q. f) @
9 b% C8 K# N6 y6 T
RYRLTIW[75MEAH6UG6L.png

- p( H- b; j! P; K0 m
8 l) d6 E* e" N' i
添加文件到工程目录
" P# ^& r) g3 c9 Y% U  U

4 F3 `$ X! v, s; V7 i8 ?
8 F3 c* T; V' C, Z% ~        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。" }; X' {6 q+ m1 V; M: k$ A

% U& N, T& s+ F9 d- g/ t' w
T770OJ`GN7T1A@_W8MS10U9.png

0 g0 t' a0 [% y' c3 h8 y- i2 T$ M3 R- x: F& l) O; {, U
添加包含路径

% w1 ?3 V( ~8 k' T! B/ M5 Z; F" l( h. Z1 L! n+ @

* D# W* r/ e+ S& H        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 ~5 Q: X" C* f+ W# @

, `9 x2 C6 Q5 t4 I0 U; x) _4 g
BC4~5CMK190KR@1Z4NH[BAA.png

7 E9 j0 d, V7 k3 Y5 N
& h+ t8 r, n  d2 T
头文件路径
1 s/ t6 [! `  W! S1 _# C# o
4 X& x7 B5 m" @. Q
% r2 {1 c7 D0 Y+ d3 X" o
        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。' Y& E8 I% A( N
& {1 I- G0 W2 ]
CM8PQDG(~KSMRB5%[RGJF.png
, O0 k4 f$ l9 S: z6 C

/ \$ @  F+ u& W$ R" j" z
预处理符号

' U+ D/ y1 I" u( W+ t% l) Q4 p8 P0 n; d! n: z# m3 D, u
3 h) n" d8 p1 ^; [
        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。
8 K; ?0 P1 H- Y. q+ `# ]* W# X! ^
        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。
- d" ~+ [, F: K1 r+ _
4 O6 D5 o6 [- A1 x
~E}(WHT~SY9YZ76~6B0FEYX.png
( D$ Z4 h( _! e' k/ w

$ T2 B- }; Q) W, t5 J( @
删除不需要的文件
- [# s5 q4 j6 r- X% [
5 d) }. L  |' i# v* O# v# {/ S
3 Z( d& {; z9 B
        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。
% a9 d& ?6 q; E7 ~0 X$ n, f1 z  {9 |5 P; p/ U1 g3 a8 |0 g) b! B
CH%)1P7Z{]}@53ID$W{ITXO.png

; F! j9 j$ Z% J8 c* p8 X9 o( }0 |
! w5 u- u1 \# d. I
排除文件夹
2 U* J, i0 g: [  \0 Y+ n! z9 ~* ~
. V, n& Z; A( B* m5 k) J  F3 |

" ^- q. k; d/ e% ?2 E        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
5 m  z# X4 _$ T0 j; a( L/ w4 Z1 g7 _2 [, p# k2 [2 i
[5DE$R5L0S8}UKB3ST}8GES.png

0 \& `2 P! V, F  \1 [# V! |8 O
排除文件夹选项
: U& A. y8 t4 F( u" |# d
6 n6 ?+ K% b6 v) X  Y4 ~* t

8 y5 N& k* y$ b' d$ D  l        注意到这时候被排除的文件就会有特别的标志显示。+ q' F0 g+ e% M3 f

# H$ w) j$ e/ }, k# g
6X%VAYE)JZ$BFVJ]8TFZ))5.png

, z% E: u& B. m9 l) X% D; ]4 L+ e. [0 ?8 V" I" S3 W" {/ Z
排除的文件夹

7 j0 \, I$ }4 h' k9 g) x
# d) t5 }5 Z3 Q5 M( c' g" M. }0 a7 N8 q( D* n0 @5 \: J1 z
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
; h7 E  Q' O$ `7 N3 H9 Z5 I/ C- ]. n2 N: V  X1 B
6PY}1]A__5{@{[[LM~QCD[A.png

2 Z' H8 m; A. B: U8 W5 }% @. O: t
2 t, ~% H) F" b6 f1 X7 _  I& D
Core文件夹对比

; a) Y0 z! ^* ]- F1 t. ^( j, D" B6 G3 R

: _& P2 R- F3 t+ P7 Q2 u        Drivers下第一级目录,没使用到的全部删除。1 j6 ]6 [* }; |, X7 c
- G' `. E5 m0 v" y
AHA811@1J~XZX[Z6ZZKMGMD.png

& f2 P! `, e* h7 p/ m" ^' Y+ w1 e7 m
3 k( d! a: Y0 R8 w3 k, k; }
Drivers文件夹对比

- P! {9 p/ ?- D, @( N
; J1 B9 C8 E+ k$ ~0 U
$ _! s+ h/ _+ X9 G        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
) k" t' t) Q4 n" c
$ w7 G1 o9 D+ L0 r
BADIRDPV72D{E2LGBJUG0)E.png
( y8 b. B) H' g6 c  a
$ L, y2 H3 [- f
CMSIS文件夹对比
' _* @( \6 e  q$ }

+ b; d3 }5 w  T! W& Q
9 a% L8 a- A& o# h. \$ q        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。) N( C9 L4 v8 u, N+ q9 M

' k# S, t8 P# Z5 @& T
9F%~JU$T1I%6(EHLZN)U}NI.png
2 E9 W0 Q- T6 C" x% C' H

0 i( H( O  I: m, O4 V' u  w
HAL Driver文件夹
2 C" ~  j& D3 x' \) a
5 b6 Z: K3 h8 L4 Z5 Z( q& _( O' e' l
2 z- u) V$ j) Q, M! D
        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。8 ~$ J4 H* }! }$ r9 S

& S  p2 R/ P6 y2 K& z8 Y( n1 {$ X- Z
8CAK_X7IFV$}@IY~P9Q48U8.png

8 x) v  a( R* J% P9 C
4 f9 B3 Q. X" [! p, M" t' M* G
STM32CubeIDE编译通过
  i7 z- }0 d- p+ E! P
$ {2 Z+ D& f1 ?, O# S
1 Z$ C3 Q( @6 \. \
        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。: ~2 y# S; [8 X4 G  X

5 Q1 z6 T) e/ N. @
5}EK{Z~[`IE3XSE(2}LW27H.png
7 Q. i. u* v/ C2 i) D1 x% D, a
7 u' f0 S' d, L* ^1 w' F5 V
Keil编译
' j9 W7 L8 {! D. B( n9 W+ S

5 `/ X& D3 q5 J0 b$ _( U) ^: |3 a3 W' t+ Q
        如果需要调整优化等级,则可以再下图所示位置调整。
% K. A# L+ i0 T5 x7 D: k3 ~) L5 Q
% E2 N+ l- u+ K% r: t- ~5 l
57{)78`IUIE3X[T}$_{%Q2V.png

9 N6 @" p' _3 n! Q( b, S+ l1 z: g7 n7 Y% @" b
调整优化等级

+ p; f/ H5 B+ D  b% b7 e; i; ^
& \  ]; }- f. F2 E7 E/ F) M1 M; g4 l! y
        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。3 s- l2 b# q$ g9 `! n
% z3 Q2 |0 e, T4 I, l/ _0 w
A`N)L93O7)A}[U(6BQ_W173.png

& [9 ?$ A' t1 ]' b3 Q  g7 b8 n" ^: ^8 S& y! Q
Linked Resources设置为相对路径

2 y3 }  e% v! d' i' X& d
( x4 T2 A0 [  w
: _, o7 P. M% h6 b        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。- c! c! R' o5 u/ y( M  T8 {  E5 S
/ b) F: R% H- J
QR%O1_TQ0PRAMM`NLIO$Z}V.png
) |, C: n5 \3 Z7 R3 C9 @5 Z

2 K0 B9 Z( U1 n' Y% N
Id文件路径
+ b4 Z3 T. B. ^  z
# G1 k3 {* g" l+ ?7 i# |# c$ b
0 }& X  H* c7 M. Q
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。: q$ F6 @& h2 r1 u, g8 x. f+ k
* x1 v) F( w& {* R* b2 u5 y
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。
1 P6 f* n( D' `/ x" f, d& Q- l+ S
7 x# k( e- v, F0 G; s: B& R        针对一个相同名称的工程问题,工程取名时最好也有些讲究。) `/ \$ y& _: [' i+ `1 O
" P, F* K/ E* W" ~- p
V]JP257Y{[Z5[Y]24((YAGF.png
' B! b; X" `2 _- f/ e# P  C

* V& S8 G3 Z. F4 u' Z. G
编译后文件夹内容

" u" z$ a- [9 B5 n6 u( {) {% m( N+ v+ P+ K  \" N& [9 A  |6 D

$ ?% F1 @8 y* t5 w9 g7 ~, q3 J0 T4 A# @        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
8 w' ?! U/ q, z9 w8 @! ^' |- s& ^2 x, B
作者:bili_42806779649 . x7 C' d; `: M) C9 a# \

3 b$ f/ f9 n+ H8 u
+ k: O. h# F9 l& ?8 \# R4 [4 g5 H5 Z
收藏 评论0 发布时间:2022-8-28 22:35

举报

0个回答

所属标签

相似分享

官网相关资源

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