对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。. i" y/ ^1 Q; ~, t- Y5 a$ R 6 m% ]( F! J* ]: } 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。# b& \0 c0 f2 f5 o 9 T) I" B: J9 g( H9 \ STM32F103C8T6亮灯程序 $ K Q; O' E" u$ u% p2 }% ?) D4 q 3 M! t* @& U6 b7 Z; Q, B2 _ 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 : ~6 t. X5 [3 f Q6 e/ E" R 创建工程文件夹 4 H; F8 [4 q- U( {. `1 |n- l# e, e0 {& ^, U 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。* D7 _6 t5 t! r; {& I+ G - J& P/ N3 Q o* `3 ? 4 F @$ D3 M( X% E& O3 o+ ~$ q* U STM32CubeIDE默认生成的文件 # ]8 J! m1 u6 w M; v0 [ ) J& s/ w O/ E; F 这里简单介绍下这三个文件:* n6 M5 x3 J6 R .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 2 b& r2 m' t$ _5 \0 @0 A .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。 ?( U1 u5 [9 ?3 Y9 H! y . F7 K2 z4 A4 ^, ] STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。 拷贝文件到文件夹 , V9 Z: B: M. T然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。7 F" P" V- f; ~0 G 6 k) K' A; p1 s! n# e' T' ` 删除工程 / ^- j7 ^3 |6 D" k7 ^& c& J+ \" n/ J3 ] 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。; B1 N- J5 W {) V % {7 o) w$ l) p& ^* q! V; ? 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。0 a5 S1 [8 M/ f: [4 J1 O ! V. L3 `1 O! r; i" O 空工程 T' p9 I7 V+ H: W u; o r( o% b5 D' w! y$ f 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。 0 W( a- e, {3 g# h: u+ a' {# m 打开工程属性 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。 ' }& G; A1 T, M9 B% g8 {" z / d6 R3 ?3 \- ] 引入文件 链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。 添加文件到工程目录 ! S% ]9 x3 h r3 D, n在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。 添加包含路径 添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。! ?, \" S6 z) f0 @& E+ s9 B ) g& o) A8 `2 a/ b# Y' \& l" F0 a 头文件路径 1 V7 y- d9 @8 N" p 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。 预处理符号 5 M6 a) j* X' X3 Q9 w0 Q" u: K此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。0 t! ` V+ a) l2 d7 F+ I, z' m " k: o0 v/ I1 t" d4 q B 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。' G4 f Z/ d8 o6 H# t- G8 l. { : f( Z3 B2 M! f# D# p* ` : O' d# N9 F- z+ b 删除不需要的文件 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。 + K% I) f y2 t4 s/ E) W # T) W7 I1 d+ Z/ ~! Q 排除文件夹 / L) u5 y! |; i: r2 q 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。1 k* h/ E" B( R1 Y) a I # T( l$ P( _/ {/ z " U; E; f: ~( a4 [1 h- Z 排除文件夹选项 & F3 f; ^6 e6 X' _1 j# I% {$ f4 U$ d. N 注意到这时候被排除的文件就会有特别的标志显示。 6 Z) j. |; h9 G: m7 U 排除的文件夹 + U5 x7 Z8 G" U0 W! E6 X+ A9 ]; G* q 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。 4 |% O6 \4 y% [8 @ Core文件夹对比 % n. s0 e W1 r' M Drivers下第一级目录,没使用到的全部删除。 8 t5 X7 Y: d$ P: f Drivers文件夹对比 2 N/ E, k R+ p- `- D2 q2 M( e% I* J; i3 `2 _ CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。 - e* W7 ]/ S1 W1 P6 R # H( Q. ^9 m$ t+ u6 {5 A2 h& i4 C CMSIS文件夹对比 . h8 }: @; c! ^+ _ STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。# \! c$ P* Y! T- h1 S* t d # X8 W/ O- O. E( b Q6 g - u0 v3 `& t8 ] F8 K% H. T) } HAL Driver文件夹 % {. P3 u4 M' P' {* C4 W( b5 x 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。 - P8 M% n2 v( g- Y; m( B3 T! B STM32CubeIDE编译通过 $ T6 \( Z$ J0 M/ [, L- M/ Q# k0 | 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。 Keil编译 : c4 ]9 }) \3 g 如果需要调整优化等级,则可以再下图所示位置调整。+ q: g0 T6 m! K+ Y j+ x4 |+ H 调整优化等级 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。 Linked Resources设置为相对路径 0 B" U9 z& @) a5 t + y. c( S: b/ U( j1 M/ U) W 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。 & z* M* V" P. l2 b : v1 q) ?- [4 T$ d1 q/ D Id文件路径 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。) m9 y& ?$ X3 c3 m3 ? . U- Y! G9 X0 l: f- z3 b1 q 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。% r- Q( T! c) q4 I/ s( i3 q + L/ }, f5 s0 b) F 针对一个相同名称的工程问题,工程取名时最好也有些讲究。! N2 P- Y/ X \$ d3 ` 4 ]! _; ?+ C( T4 u" N2 k6 ~ 编译后文件夹内容 . p( g! U( g5 |+ r4 L0 L% H. H) M5 ]; @! ? 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 * z' f! K# X1 n ] . T2 |& ~9 K7 X8 b: i6 Z : f7 L0 u! U: U7 f( Q3 i7 Q8 A |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【STM32H7S78-DK评测】XIP模板问题处理与电机控制
【经验分享】STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件