
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。6 Y5 e7 S- n' D+ B : _, G) X. U1 Q6 j 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。 ![]() $ M5 b6 `+ d5 ^3 G L/ O$ ^" u STM32F103C8T6亮灯程序 0 ?5 l: S3 Q* V: @, J! t& X 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 ![]() 4 U+ w' r0 t+ V% [ 创建工程文件夹 + |' @% S4 I, T% ^5 K2 V $ V) A0 v+ Z- s" B" ^( n 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 6 d7 }, Q( z/ t5 y, z* O- W ![]() STM32CubeIDE默认生成的文件 ! ]- ]7 D, e" y' T' t6 M% F1 _, e3 ~- ]; ^ 这里简单介绍下这三个文件:9 D& o/ G3 E: G( O 3 b4 {5 m" c/ ? f .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 4 q( Y+ ]! c) Z% A7 E T .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。 8 W5 M$ a3 f( c) G# ? STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。6 P$ ]2 |% P' R# K, \ ![]() : L/ {! x# h1 b$ V. O$ {/ H 拷贝文件到文件夹 ; {2 @3 e* o6 F% {) d# B+ a& T$ y6 e; j; K 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。 7 m6 h9 r x) W7 w ![]() 删除工程 ( J* S! I, X5 W& e, F. }! T+ a- A! P0 X1 A 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。: `! y1 c& H- O9 c1 t8 }! d ![]() 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。 # p$ P0 M3 e. k/ b/ p' n3 d6 {, B ![]() - X2 Y) h! b+ A 空工程 ! J6 w- V, y' ^, d2 T0 _5 {, K! Y1 j 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。 ; b3 i# D- c4 }5 @ ![]() ' d% n( a! Q8 I- V8 \) g/ Z( n 打开工程属性 3 @! X* \5 K3 D: y+ @3 u- m' t5 `4 ]) J9 Q: @ 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。3 X: t) b4 k1 r& O ( }+ j+ k5 d7 C s! Q3 e ![]() 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 ![]() 添加文件到工程目录 " P# ^& r) g3 c9 Y% U U在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。" }; X' {6 q+ m1 V; M: k$ A ![]() $ M3 R- x: F& l) O; {, U 添加包含路径 5 Z; F" l( h. Z1 L! n+ @ 添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 ~5 Q: X" C* f+ W# @ ![]() 头文件路径 1 s/ t6 [! ` W! S1 _# C# o4 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 ] ![]() 预处理符号 8 P0 n; d! n: z# m3 D, u 3 h) n" d8 p1 ^; [ 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。 . q+ `# ]* W# X! ^ 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。 ![]() 删除不需要的文件 - [# s5 q4 j6 r- X% [5 d) }. L |' i# v* O# v# {/ S 3 Z( d& {; z9 B 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。 {9 |5 P; p/ U1 g3 a8 |0 g) b! B ![]() 排除文件夹 2 U* J, i0 g: [ \0 Y+ n! z9 ~* ~. V, n& Z; A( B* m5 k) J F3 | 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。 / w4 Z1 g7 _2 [, p# k2 [2 i ![]() \1 [# V! |8 O 排除文件夹选项 : U& A. y8 t4 F( u" |# d6 n6 ?+ K% b6 v) X Y4 ~* t 注意到这时候被排除的文件就会有特别的标志显示。+ q' F0 g+ e% M3 f ![]() ) X% D; ]4 L+ e. [0 ?8 V" I" S3 W" {/ Z 排除的文件夹 7 N8 q( D* n0 @5 \: J1 z 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。 9 Z5 I/ C- ]. n2 N: V X1 B ![]() Core文件夹对比 . ^( j, D" B6 G3 R Drivers下第一级目录,没使用到的全部删除。1 j6 ]6 [* }; |, X7 c - G' `. E5 m0 v" y ![]() Drivers文件夹对比 CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。 ![]() $ L, y2 H3 [- f CMSIS文件夹对比 ' _* @( \6 e q$ }STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。) N( C9 L4 v8 u, N+ q9 M ![]() HAL Driver文件夹 2 C" ~ j& D3 x' \) a5 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 ![]() 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 ![]() 7 u' f0 S' d, L* ^1 w' F5 V Keil编译 ' j9 W7 L8 {! D. B( n9 W+ S$ _( U) ^: |3 a3 W' t+ Q 如果需要调整优化等级,则可以再下图所示位置调整。 ![]() ( b, S+ l1 z: g7 n7 Y% @" b 调整优化等级 2 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 ![]() 3 Q g7 b8 n" ^: ^8 S& y! Q Linked Resources设置为相对路径 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。- c! c! R' o5 u/ y( M T8 { E5 S / b) F: R% H- J ![]() 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只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。 针对一个相同名称的工程问题,工程取名时最好也有些讲究。) `/ \$ y& _: [' i+ `1 O " P, F* K/ E* W" ~- p ![]() 编译后文件夹内容 + P+ K \" N& [9 A |6 D 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 8 @! ^' |- s& ^2 x, B 作者:bili_42806779649 . x7 C' d; `: M) C9 a# \ |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
新版STM32Cube for Visual Studio Code开发体验
【STM32N6570-DK评测】摄像头video encoder
实战经验 | STM32CubeIDE实用技巧之工程联调
【STM32H745I-DISCO】基于TouchGFX的工业控制器界面设计
【下载问题解决】关于ST官网下载软件问题解决
【STM32N6570-DK评测】开发环境及LED debug
实战经验 | 基于STM32CubeIDE下载TouchGFX GUI应用的出错分析
实战经验 | 如何修改STM32Cube固件包的存储位置
兔哥的杂谈【002】——如何性价比更高地去编译STM32