
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。; E6 X4 O) l9 d * @. G/ x# | C8 C4 v 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。 ![]() STM32F103C8T6亮灯程序 + Y2 e& N5 a: X: S 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 Z; `4 T, D( V! ], m/ S ![]() 0 k- o& g$ g/ i 创建工程文件夹 " d: y& t6 [" A参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 0 v+ b& I* d+ @- k* c. r ![]() STM32CubeIDE默认生成的文件 8 D& W: I% ?# I, X6 n, D# ]. R- p7 Q' i* _/ c 这里简单介绍下这三个文件:: `/ H+ S/ O4 s( {+ j .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。3 ^* @* U' j/ V' }8 Q: S: i7 [ ) g* H, G7 g) f9 k( Y+ z7 Q' n* Q- V .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。+ D5 l, C9 W/ u* d- X 1 P2 s2 \# d$ M" Z* K STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。( y2 e. o+ \& i ![]() 拷贝文件到文件夹 9 ?. y# g0 d$ x+ c$ z1 @! |, Z& R: t3 d5 O) u) P6 Q& d 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。 & u9 M8 F" E7 M5 a1 J( v ![]() 删除工程 . [1 [) s* k1 q& ~6 J: W/ v6 {( T( w) d- o9 ~8 p 7 N% B6 P6 d5 T; C 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。 ![]() 导入工程 / L3 W( J' G- BSTM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。/ h' ]! P, d; u- T9 ?( H& \ ![]() ( v8 m$ C# K# h5 h 空工程 v0 c; u l- a0 Y+ ?1 Q% K: r& U) Q+ q 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。 . V% ?/ p2 _. N2 U1 \5 I& |. Q ![]() : U1 Z% o1 h8 g" j 打开工程属性 9 B4 J [5 B4 O+ z 4 F9 {; Q; a/ i- H Q! `% e 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。 ![]() 引入文件 链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。 M) }- I% j7 Z, B1 L% ? m ![]() , A; T5 P3 h! Q 添加文件到工程目录 # R" }/ {0 L# w, C4 t2 ?) F# g0 @( Q9 Z% ~0 ~' U( `. ^ O! v ! q j4 R! Q% s$ l/ \! L9 H 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。. l! Y. k8 U6 l! ~ ![]() , M* u3 q; I6 ~. a% y# ^7 { 添加包含路径 8 q5 k- x% c" w2 c* s 6 C: z+ e# w; P7 y( O6 ^3 i 添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。' Y* T8 ~: H" X* E- `/ f1 n6 j9 K ![]() R. d" M5 ~) t0 H9 U 头文件路径 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。 ![]() & F+ {# t! [% D* y$ i1 k 预处理符号 * r8 u& m3 r. E! C i1 N* \1 U' \ 1 ^1 o B$ y/ Z" O" S, T 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。+ {2 j( H8 k" d' o# u % q6 m% B5 f8 e) G 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。 ![]() 删除不需要的文件 % f/ b$ j; l2 j+ ]3 ]/ ?3 p3 T3 Q: `8 O( }4 y& b5 h/ S 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。- c0 ~5 ]: \* K - w) Q& s- Q$ O% m4 C ![]() 6 N1 ^- K4 ?" {" v 排除文件夹 2 W& p+ ?2 p, O }7 n) H : ?& G0 r3 P- g$ c5 t 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。; k1 ]$ Z9 l2 V2 Y4 t7 E * t) x$ |6 z" L) M* D* C ![]() 排除文件夹选项 6 c% n2 u, Z. B; z( V' V1 Y! Q$ U5 I/ K' }# f 注意到这时候被排除的文件就会有特别的标志显示。9 E+ e; R+ O7 l3 c; f5 ]. K3 u " b. d' k4 ~8 Z: { ![]() # N6 y9 H d) H4 o! _7 O# t 排除的文件夹 / Y2 d3 d4 ^! o- S5 e$ _- M6 i. k1 q4 ]3 d4 X" C- W# s # h+ c+ a0 N7 _7 }2 J 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。 ![]() 3 ?0 i, }! [9 @) b! P0 d9 d Core文件夹对比 - Y$ |0 }, T$ _ , E2 o+ D! I% U7 r: t- d/ P Drivers下第一级目录,没使用到的全部删除。 ![]() Drivers文件夹对比 & Z4 I2 i% e& Q( s" W! a ' V- H# ^- f: n1 O' B% V CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。 2 e2 S! @" ~8 B; a% ?- {1 n5 U4 C ![]() : t9 D& b8 F% `. k7 p8 j! b CMSIS文件夹对比 / z; a, w& s9 U* i2 X& M$ h) ?7 C# J- o" W7 b7 p a' S 6 s9 n7 [5 m) k* b STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。7 F7 i- a# n% E1 s( @ ![]() HAL Driver文件夹 ( Z+ O/ }" r) |. X- {4 l$ O: T, x6 o( E- J" F8 x$ y; ] 0 G7 @1 Q6 P* P0 J 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。; _) S9 j* S7 A. N, e+ y4 a6 s 2 J6 t5 s# N5 H3 Q+ a$ e ![]() STM32CubeIDE编译通过 7 b) n0 U9 L8 q0 X A$ o& D# D此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。9 c9 `( k$ e" y 6 n0 x# k( X7 @: a# }4 n0 X ![]() ( ?; i% p+ d7 r# G7 o& n9 D4 X) j Keil编译 & |2 G" B( U G9 }$ h& N. g; ] H% m0 ^( z+ \. J + W5 J! i; u6 l/ t 如果需要调整优化等级,则可以再下图所示位置调整。# x4 y- Y3 v7 g9 c0 G! f* \$ G ![]() 调整优化等级 6 V" N5 b* M6 @$ k8 L% V( C4 m5 U* Z9 J$ C 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。 7 X$ Y& ?/ t) [6 a5 U# T ![]() Linked Resources设置为相对路径 & Q* X* E) k0 d; D9 a7 r$ _ % q: `3 P1 E- b/ i1 x% K: H' { 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。* _* g- a2 m* z# _4 u+ J) ?& D ![]() . \3 b L+ Y1 y, N Id文件路径 8 B5 o/ n& b. C, U7 o& | - Y8 D( F, |) i 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。 , s" b. `' p' V) W$ n 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。4 r" e+ f# g. L4 P: E : j& \' X- U9 @% f 针对一个相同名称的工程问题,工程取名时最好也有些讲究。 ![]() 编译后文件夹内容 * p! y& }/ t; S0 `2 Y$ D8 D 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 G4 U- G: P& M, H |
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?