
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。 + ?& h3 G+ q( W9 q3 ? }8 b D 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。% G3 u) G [! r ![]() . N" ~1 `% {7 ~; n& {& `/ d% p; n STM32F103C8T6亮灯程序 . M! V* u. J" v% p& P1 k6 g; s: e. P6 d4 }- Q, e8 W4 f/ n 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 ![]() 创建工程文件夹 % @' D4 O) m; l5 L/ {) G3 h6 f$ _ 1 l, o- d& s. Z 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 2 s3 _9 p5 N; Y% G9 E; e; \4 p7 e ![]() STM32CubeIDE默认生成的文件 这里简单介绍下这三个文件: ' j. S) `: |+ X2 O) d0 U .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 3 e4 w% J8 t, j/ w .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。" K1 Q4 e5 _$ n7 X, D- L) t STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。4 e7 Z: u# D2 e9 ~- U) j2 T2 s ![]() 拷贝文件到文件夹 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。$ c& c. ]$ |! P3 e : ^6 _; v# Y; T ?* M0 Q& P ![]() 删除工程 ( n9 \9 K' b u" r) p8 ` 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。- t7 z* f& x5 ]$ L % H1 i- ~0 U5 b; J ![]() & l, y, e z1 S- P 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。3 O6 w5 O3 [/ `" u' h! n0 W 1 `/ ^8 p) B! r ![]() 空工程 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。% }$ j6 Z: W1 b ![]() 打开工程属性 5 v" O$ Y, t# l- T' e" ^, J8 ~) a依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。 0 _7 R1 I1 y% v( u5 {+ k2 _' i D ![]() / m" z; ^% _7 \/ U! M" j7 } 引入文件 2 I/ x6 P. _, I$ Q链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。 ![]() 添加文件到工程目录 6 B! S9 m" J4 r% g% x$ @( ?6 q. k" g6 N 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。 s7 g3 F5 H& `2 R7 {. \ q5 x; J+ _" X( O! E* R ![]() 2 W' }: P$ A7 p. P2 }' F 添加包含路径 0 {* s* B! P$ d6 w# \7 i2 x 添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 D8 Q5 p- }7 ~1 ?6 L: k 5 H% W9 E; A6 F0 i ![]() % P3 X7 X3 I6 U$ W: n 头文件路径 % p @7 I7 b* C8 G6 B; N+ ]* L1 | \- y( c: x6 |, K' | + k, E' g3 C4 b8 I7 M" }3 I- L 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。 ![]() 预处理符号 * m/ l* V8 o, `! K5 @ 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。: \6 Z" d1 p3 M, X) C R% d0 I/ k 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。) v3 \+ b2 l/ d0 H- k3 O8 t " Q9 @: @9 ] j/ ]( c! P$ X1 ` ![]() 删除不需要的文件 0 o( x% R( z _4 X5 |0 t7 X( W8 t 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。/ R4 G, M' Q9 D4 d ![]() 排除文件夹 8 U6 L3 R4 R( g0 f7 A2 j 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。 7 Y5 H* L, l' z0 w: d( _% m ![]() / b9 u+ z; o: P" E- q9 s 排除文件夹选项 ; u0 w8 I! m% Q5 M6 K) J3 g注意到这时候被排除的文件就会有特别的标志显示。8 b4 D( t% J5 E+ f9 A: X) X C9 K ( ?( x/ ]4 `" _; S) _ ![]() , t5 g3 v& G% w$ L 排除的文件夹 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。 ![]() Core文件夹对比 Drivers下第一级目录,没使用到的全部删除。+ K2 [9 Y$ a, d8 ]& o : @2 a& g& }2 r( D- z9 F" P4 ]2 g# z ![]() Drivers文件夹对比 - _7 r V0 u/ w " U/ z+ j, F$ R# ~) W, ^ CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。$ k* Z$ e2 |( Z- f$ X* i( } 7 z3 ]! m' {+ {0 t6 e! S0 u2 { ![]() ; g& S, I1 T; Y& l CMSIS文件夹对比 & l# i- v; s" B5 E0 c& Q8 p+ G8 R STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。 ![]() 3 V+ |" R) c& C6 t4 C% Y- J' w# Y m HAL Driver文件夹 ) u" h( a$ O \! X" F 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。 ![]() STM32CubeIDE编译通过 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。 ![]() 0 ]- q: @) Y- K Keil编译 . r4 Y A0 m7 d6 s- Q' F- e' q; ?9 p# B$ v) e 如果需要调整优化等级,则可以再下图所示位置调整。 & E, z3 A; U1 [/ B: @3 V4 E) ` ![]() ; D+ X6 R9 ^" P$ T9 o7 Q( B; ~ 调整优化等级 6 r/ E9 z3 W; k3 X! C& d( Z除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。8 f5 R. A1 X7 ^$ ]: n* C6 L9 E ![]() Linked Resources设置为相对路径 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。+ x3 M& K% b v, L 3 u9 f1 i9 l& E A4 P2 a ![]() 0 i3 F. R% O' P( [4 O# a8 O Id文件路径 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。+ z, d" V5 p1 i$ E 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。 " T z, h5 w) o# f R 针对一个相同名称的工程问题,工程取名时最好也有些讲究。+ [9 s$ C; w% T9 {% P ![]() 编译后文件夹内容 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤