
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。 1 e/ K8 N3 C$ F8 [. ~( a9 d( a" \" J 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。+ M0 e- o( s$ Z# e2 q ![]() . O6 t0 N. w, W1 S& i! J5 R* K STM32F103C8T6亮灯程序 % I$ Q. q0 z1 Y, l) r; N1 m# q9 i3 w( u; f 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 ![]() 创建工程文件夹 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 ![]() # F: B7 ^( r+ o% E STM32CubeIDE默认生成的文件 / k) N& ~/ H* ]' Y& x- iB5 i; v6 c3 L9 l- x 8 Z- `! F( C: a% p% W7 ^ 这里简单介绍下这三个文件: .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。. m' e6 e" P/ ^$ N( D' ^ .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。$ K" M% l$ ?5 t% s9 a( T- l n " u1 r" K2 b4 B( h: ?' S* k* {* S STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。 " S. M* ^! w! a: K9 \7 c1 R ![]() 拷贝文件到文件夹 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。) ^0 E; n8 t" ~ ![]() 删除工程 ' x6 N% B* c1 G5 J8 c1 P9 v! ? j 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。1 p6 X6 P% P* S9 n4 J q( ? ![]() 6 R+ E4 i# S1 B3 d 导入工程 6 e; ?% C/ w! B6 BSTM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。 ![]() 空工程 2 w( g, b: F: [6 H9 @: s7 E : U0 `+ w% \1 f! Q2 m! S 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。0 }7 r5 B9 K% C4 a. i8 }, E ![]() & q6 w, f p" ] |5 V9 [6 y 打开工程属性 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。 5 {; x# U, N8 L) N7 D* M0 I ![]() 1 ^# |; Y c' @2 _ 引入文件 ( y. a6 v/ T7 M! ?( L% O$ H5 }( A8 J链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。: s1 ]+ ~0 i5 e7 N! D ![]() 添加文件到工程目录 . |" b- L; L2 s1 ]) p6 T5 G* T . J8 B; e: @7 J2 [ 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。 4 m. [ d: z* V6 D$ ~0 P ![]() 添加包含路径 ! p T: V1 q9 O: h+ p5 n+ J添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。 # x/ h0 U6 h( Z" |$ D; F4 c2 B( X N ![]() 2 @! S# y0 ]' v4 F' B 头文件路径 O2 P. X' _* n, U6 e5 Z添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。 ' K" N1 `. ~8 t0 L ![]() $ i4 u7 O0 v* R( k8 G 预处理符号 ' q* J3 j, U6 M7 T W. r$ l 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。* H. U3 S" [2 d4 @ 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。 ![]() " f0 y/ x' \0 y9 o4 r) C) r 删除不需要的文件 ) {- x) t; n8 I8 I( I8 e& Z: N" a. {& v3 y, A7 F8 r5 m0 S8 h9 O 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。* w- N6 K# z0 `: } ![]() * [$ j' D' x* k& D 排除文件夹 . d7 S( h z2 q. o& Y9 t8 ^# j然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。/ Q! P5 h* n* `0 W+ ] t/ c; s$ {9 n" D4 k) L7 O ![]() ; |, h- u+ s" W* q8 @ 排除文件夹选项 ! i) I U3 b5 ^' g; m 注意到这时候被排除的文件就会有特别的标志显示。) V8 Z. M, \( _9 J0 j. P" b& Y 2 B. M2 [$ J H0 W7 J n ![]() 排除的文件夹 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。 ![]() Core文件夹对比 ( F1 _* A" g. R h, x: Y* ^! u e9 |$ A5 I: I: }8 i8 H5 J5 K, v* }% Y Drivers下第一级目录,没使用到的全部删除。- W5 H* _( {+ D( @0 f. @8 C% ] ![]() Drivers文件夹对比 ! [9 X$ e! W! u7 O) e# B) p CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。0 q* @9 |) D: Z, {; v. @$ ~ ![]() ! c3 k1 X" t; O6 f f/ b CMSIS文件夹对比 ( S% ]: D* n& H1 d+ q+ W, v- A* I! Q- v$ A; A6 c / P( a4 ?6 g; i9 K& o- z STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。* B6 }& v O- U* Z$ `- h ![]() , @! S+ L8 c ^: T8 E% k- t; D. | HAL Driver文件夹 6 l; r: g# m: K0 a" s2 X7 |% `4 |( ~4 j1 p% Y# p" N, s7 W6 h: I) F 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。+ |0 H% o* S( c3 E - f. @5 {6 N# Z6 q3 k/ d ![]() STM32CubeIDE编译通过 6 H& B) J- e6 J4 W: s/ B0 D' B6 _ 8 w3 I$ T" S3 D 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。) \9 g. m, S9 j# N9 g! b* T% t . `% E7 w/ W( ?/ n: A ![]() Keil编译 # t2 T( X, K; l. x9 U- G u4 k+ z 如果需要调整优化等级,则可以再下图所示位置调整。 8 t* A7 c( v6 ?" m" ]* o' Q) H2 Q ![]() 调整优化等级 3 ~4 K, I [ T- |除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。; f4 K4 i! o: {' _: x ) C R6 L7 f' F$ f' V0 j ![]() Linked Resources设置为相对路径 , V$ ~2 s7 G4 z0 d# } 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。 ![]() Id文件路径 0 M# l9 n9 e3 p! w: E i- W, @2 a. ~/ f. ~5 }7 e 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。9 A. {2 a9 T0 j& U 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。# t( ]. P6 o% k2 x( s; p . G0 {$ ? N7 z) K* D 针对一个相同名称的工程问题,工程取名时最好也有些讲究。( z+ t& H$ w# i4 L9 t4 w' Y 0 `' o+ @1 V, N5 K5 \4 g# i* ^ ![]() ^1 O! h8 t5 \8 f& X0 ~( \; t 编译后文件夹内容 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 4 W$ A' }- _& j# l& z z5 D |
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命