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

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

[复制链接]
STMCU小助手 发布时间:2022-5-19 11:20
        对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。
, m7 K) u1 E  L7 f0 w- R' W' R* g' J, o5 v
          对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。- }: L8 b# y. F$ }" C
(7[HULSY5M5PEDSVH0SCNGJ.png

3 i) M  b+ n5 e) Q5 D3 K- {; K; u4 Z. q- t' K; S- ~
STM32F103C8T6亮灯程序
7 Y/ n: \% C& x, z1 m
7 O: s9 c: N- i  T0 D- ?* a
4 C% [3 h6 m$ F
        如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
4 z% A' {1 {/ N. N; v) _
" w5 x* A( y5 m/ l7 e3 M, A4 U9 ^
LQZK{H7EQAWA61RTUWK%V.png
8 R$ v- u1 A7 {* Z, P+ u4 G2 ^2 X
) I2 d, V  ^6 r" {; ?9 d* J3 U+ S
创建工程文件夹

3 s8 _# ^$ d7 v9 m& u9 @
* p* G! A' o# q6 x
0 v4 y) Q: A3 T/ P# U& P# K        参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
( W% c4 ?; [' q; U" l
0 m$ ?* V, x0 k. W6 N& t% u! v
8TEZDA$)K%9UMIWWPVN9ETF.png

2 Q" r! w0 @# T3 f+ x  H4 B
* u9 y+ ^4 N$ D
STM32CubeIDE默认生成的文件
% i+ s! H! _" u2 ^" \1 I. ?1 l/ _

5 g2 U3 V  L! P1 g& }  T: S' z1 c, m3 ]5 v, H# q. ]
这里简单介绍下这三个文件:
6 {  ~) F5 v+ L" e
. t6 J  g( a* q6 Z1 d3 p' D.cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。
9 i1 r8 m) }' r- A* A6 O* J
% C" _/ h7 [  n  h4 X% @.project:    该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。: M+ K+ d' C& \
$ E8 z; B% n. ^; @6 D  _; X
STM32F103C8TX_FLASH.ld  :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。
) H; y+ e' P9 t0 a' a: i
- b4 n6 A# x: m! Y$ N
I`V)S98ZS_$KWFM(~TWT_GR.png
: h- Q( f+ j. p3 D% g) d

, c' c+ H) z! D  |
拷贝文件到文件夹
# F; l% i3 u. I5 p. {- Q! m8 _
7 J& ^  V' L0 F6 S+ n
        然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。; R6 F- j$ S$ W7 @: U' h2 s

( ^/ c4 P! D% |/ {- @
T027`8H%TGTW(@$GRR}6PMT.png
: V3 S- K; t& R9 G; S

% R" l' s/ w. z$ F' u: K, [- f% b& z8 [
删除工程

- n  O4 f9 }5 L$ p4 f' |% |9 x; _" Z; Y

/ {2 [4 K3 v( n' `3 t' s# a: n; Q        进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。6 B# b1 U$ o% q# a6 `* w! @' R

& c. s, w# a# @' ]  X
S46$GH6(T@P7OI1T3Y45CHN.png

! o, q3 }2 k& K+ @* n' i
0 u% L2 E* v8 _0 q' ~8 ~# U" Q5 G1 I' M
导入工程

3 t& a* \7 x6 g* S        STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。, L7 T6 ^7 Z# o- R# ]; ^) ?
/ G$ k9 x4 }! V6 q5 m2 m
J4N[77]P9GFMSI0FA88[G51.png
6 {8 j% Z$ X% {9 ]) M- G: j

9 c; q$ c5 X7 Q- U
空工程

3 o% l, J5 z. n" V( u. q
% j+ @: ?% h0 s2 Z& _  Q3 y
0 E. z- O9 l: a; v7 f  \1 T- P         像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。4 G( g3 I0 ]. L

& N* {- b. g( ?
4PORY)@%5RH[@6XRM4%2`EX.png

: `& K6 I( O5 @$ Q8 [# i+ {! W' f  z/ Z3 }" a( V
打开工程属性

" j3 J7 `2 ^' u+ W0 b3 E9 f  L, V0 C7 a" _+ @. o
) Z! H$ N, ]! J; t6 X) N  D1 Y: D
        依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。, k# N* F% E7 `6 I

  J1 s+ v& [, N8 s, D
@2)JR(2@}FYZR8C$S_(I5.png
( o$ w0 a  Q. V" M; O
6 ^: Y5 d9 @) B# G4 y
引入文件
4 d' p" _& l& o5 ]9 K4 f, M1 Y. o
        链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。# T% D! a5 x( e7 J& W/ T6 T

+ l- ~8 c1 @: g4 A
0XSZEA_]~9E1831BOK)13TR.png

' h2 W8 w- Q. L# S+ C+ H
9 f9 C4 @9 W" F9 V) ?
添加文件到工程目录

/ R1 o  V0 ^$ t& q' ]- F3 _: c1 p  M/ _
# g$ V1 M! H& C$ K. A$ T: Y
        在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。
- A/ X6 a' C6 i! G: J! g: t- i8 \; j; x/ @
%4N[(O9GS)PF8)KT{8K(W}4.png

! Y( l1 J0 w+ N0 D
2 Q. z% p6 L  q* L1 `! T1 q  F; d( R
添加包含路径
  w. }  _  I: S, H2 F

! j+ h1 H. U2 F5 L0 }
/ ?$ H% W- K) i        添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。
4 h/ I) X4 W$ J2 y: q6 @# E7 Z# g/ j* Y. g1 B
@H`V2L@ZMIU~8`4QX(C$(A7.png
! g) G  K# X9 {" h' q- Z5 h

2 b4 V% E2 h, n0 Y" w* G5 w  W* g
头文件路径

- p4 [& B4 H( ?/ ]  W) t
0 w2 ?2 v. c' O5 Q, {* {$ d- Y+ Q. e' d9 k
        添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。
" h6 J" w5 O4 D9 S) A
2 f* k) s! H' a1 O2 N
E(X3}HN71FN2$%5~Y@U8PYE.png

9 q' `) G3 u' E" P8 ?! q2 q& x6 h7 v
预处理符号

1 c  ?$ ?3 |. A% M
/ m; p6 b3 c9 ]0 y* j8 m
$ j! Z7 I; r+ Y# }+ ]        此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。
$ Y) [% y( @- m6 o  Z% @& w% Q- J5 F- W! |# O$ k
        第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。
$ _0 N8 k; o4 x! d$ ?$ Q; o
; C1 t( G" m8 U. H4 h
QK6JV~FV841NN5IC5_WP3TX.png

$ g; _& L% K& f% F" a
% b, D$ |% P; C; x# d% J
删除不需要的文件
0 J% w; T$ y2 X" ^# t

' e3 P) U; _* p% l* ]# H0 E" G% ~) r, y. {* G/ y
        而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。
: _2 x: `- n9 J% s( p, Y6 c6 i0 Z9 [) Y4 c( D6 P% U4 B
1X[4G7}`U8A}GLRJ)U2`4S0.png
# e; y5 y1 N0 i" T% v# @8 @! M

% I( e: J+ ]+ f0 ?5 k9 @0 w
排除文件夹
) u4 v8 {- q$ ?/ @; a, E
# ?! h6 v4 g* B% |" G; e

: l$ i, x9 L2 W        然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
8 L  Q" H9 u  B3 k$ n) o8 D& k, B4 M& ]* z+ t, u' G0 P0 L
{TH`}RR2](L1@QC07D%X8PT.png

5 r+ w" ~+ _5 r9 n; o/ W4 ?8 z9 l6 ~1 g
排除文件夹选项

( {- K1 P0 q3 k9 u( l- I1 s6 u% q& U) }% Z8 }/ E
+ u2 x$ `  S$ B
        注意到这时候被排除的文件就会有特别的标志显示。
/ ]7 F3 n' k( U! h8 y/ @* S+ w/ J$ w' S! [; {
~6V)0DQ[NITU@XKKVE1``]C.png
3 l3 g, H; x7 ?0 C/ |+ v% {

+ T3 G& ~+ i) G' g
排除的文件夹

# ?5 o  K1 V. I. a# I  X( H5 |" \2 b$ |6 S
, A1 I" I. S& a* {, |: t5 B
        为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。* A* @0 I4 J& c. r: Q- r
/ G: y6 {9 Z2 c3 g, b! u" {- G
X1L955JB{4QB57PVS()39]L.png

' R+ o  R" X6 K/ A
9 Q9 X; h: }: D$ F! [: d9 m4 S
Core文件夹对比
7 z0 `+ V: g6 R: D. x: L+ B3 f- |

: c2 Y% `* R! |4 I' a$ g$ f5 U5 [& x. _; A0 m% \+ T
        Drivers下第一级目录,没使用到的全部删除。' }& a& A; X$ n8 R/ v5 k

" Z6 f* K/ I8 F3 A8 S
D_RA2IDV@QBUWP5BK4E2S[F.png
; r) H. D& \) p& v/ D

: V# w$ d+ p* Q% _9 q6 f
Drivers文件夹对比

& S$ j  j' z- p2 W" C  m
" R+ g& o/ w6 a4 K6 H9 x
8 m  W- T' B) K! @* J        CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。" P3 {* V7 n0 R% q
6 J/ \* a9 T) J5 ~
E[5RZZ0MBEZ2M(1])VZ_7_A.png
# D3 w# A8 M8 }- F% Z* X) {- c; g

" F. P* U+ \4 \7 s5 S) R# _
CMSIS文件夹对比
5 f  @* J% Y2 ?, R; z' a9 `# E
5 \" U2 B$ e/ ?  \3 @3 n

6 D0 V6 ^* g" j& J! o5 {& m4 e        STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。
- V$ {% D, K' c
' H' t# e9 {8 E' I+ L' L6 [3 v
}~YY~Z6Z[R_F65RU071Q13U.png
! r- J/ G5 F% O( S1 U9 y  U* o" O! X- ?

- H9 `, ]$ j9 b
HAL Driver文件夹
! M3 F$ j3 z9 g: L$ t/ V

9 N- o( e/ J+ ~* P; T* V6 C- m" E3 R# c* t6 O$ f- I
        经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。7 n* R9 x/ d+ T( F. u( k# z( {

; K% v* n; W5 m- i: r, ~
BWTOV(`)SVF2DW0~U35_}W4.png
" P4 y: N3 e% ?/ x) k
: I# P- n) q8 N# X4 M  y
STM32CubeIDE编译通过

$ ~0 {# [  n4 z) m# A" m$ a& H
! ]8 o4 K* D# d
; D& o! ]; M, b  q% \/ v        此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。9 o- v; i  f( f% G7 a& K! U
" m' i+ J$ c" s* h) l1 c
Q~I4GG({CFUKFJX2BP`5~2P.png
; }; z2 c! Y4 @: J* ]

0 S3 }$ n5 s+ o5 w% _: U
Keil编译
, h/ G% w$ h2 D! E: L
: C5 Q1 B3 ]1 j# R; x7 c) w

5 Y8 Z0 A, h- m3 u" @8 _        如果需要调整优化等级,则可以再下图所示位置调整。* w/ @, k/ p( _+ i5 W
8 [+ h: d9 e& A
WSF@(%LYTF21TEC}ZRV7POD.png
6 c4 q0 v7 H* ~

' e0 W$ n; y+ U3 t* K8 V' v/ w
调整优化等级

+ b4 X1 |7 J/ i& o0 \/ B
; r: G8 e0 ~( [2 G# [+ i3 r( [8 V" t+ k$ a$ q; j' d) n0 V* i
        除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。: o# L! I* |9 T/ C

9 R  h5 Y, T& y2 l! ?' y: D
(LQYD3L6@%}5B`RH(WO_P.png
' K& s* H4 F$ D5 |* X, h
7 s9 N$ E. F/ R% N
Linked Resources设置为相对路径
& L1 ~* c: u+ v3 G0 [
( E3 X6 F9 L# s
2 \; W0 j& w& _8 ^( s1 j, Y
        前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
& A0 Y2 ^# o8 E& K! A& F$ t6 R1 o* z# J9 ?' k  S
{]W[95T3]KZ~A}RDZY`%(QC.png
' p. R( T! _+ ~7 n4 H1 J6 {2 f0 d
: L1 _5 _, O" L/ e* u7 c
Id文件路径
' z" c9 R) _, K8 B
1 d4 H7 o+ r7 E, E
- G" u- P+ j2 I. b
        查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。$ X; K% D0 V! _( m
; }' I' k0 n( Z4 y* p, R9 E9 L! A
        额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。
" k# S* d2 f( c& H/ i( {0 T% t% ]6 Y& v5 _( d
        针对一个相同名称的工程问题,工程取名时最好也有些讲究。3 ^" x+ p' @- q) J7 n
( b) r2 }9 s; Y, z! w9 R( K9 E: L
[Z`XCM(304V`$GI_]Q5~3%V.png

( z. @3 w  E& W# N+ D0 s: Z( c6 U/ S1 j, d/ w$ K
编译后文件夹内容
6 r7 p6 s5 C* _4 _! }8 o

  n% X6 B3 j; S9 @% J- E- C9 U7 c$ R' N" b* f
        这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。
5 j- `! O$ R, E8 T8 T( r/ {
* \7 C1 Z4 W9 Y( q8 s
( |8 H4 H6 D, V1 O# e
收藏 评论0 发布时间:2022-5-19 11:20

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版