对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。 - R' W' R* g' J, o5 v 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。- }: L8 b# y. F$ }" C 5 D3 K- {; K; u4 Z. q- t' K; S- ~ STM32F103C8T6亮灯程序 7 Y/ n: \% C& x, z1 m7 O: s9 c: N- i T0 D- ?* a 4 C% [3 h6 m$ F 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。 ) I2 d, V ^6 r" {; ?9 d* J3 U+ S 创建工程文件夹 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 STM32CubeIDE默认生成的文件 % i+ s! H! _" u2 ^" \1 I. ?1 l/ _, m3 ]5 v, H# q. ] 这里简单介绍下这三个文件: .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。: M+ K+ d' C& \ $ E8 z; B% n. ^; @6 D _; X STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。 拷贝文件到文件夹 # F; l% i3 u. I5 p. {- Q! m8 _7 J& ^ V' L0 F6 S+ n 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。; R6 F- j$ S$ W7 @: U' h2 s 删除工程 $ p4 f' |% |9 x; _" Z; Y 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。6 B# b1 U$ o% q# a6 `* w! @' R 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。, L7 T6 ^7 Z# o- R# ]; ^) ? / G$ k9 x4 }! V6 q5 m2 m 空工程 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。4 G( g3 I0 ]. L ! W' f z/ Z3 }" a( V 打开工程属性 9 f L, V0 C7 a" _+ @. o ) Z! H$ N, ]! J; t6 X) N D1 Y: D 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。, k# N* F% E7 `6 I 6 ^: Y5 d9 @) B# G4 y 引入文件 4 d' p" _& l& o5 ]9 K4 f, M1 Y. o链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。# T% D! a5 x( e7 J& W/ T6 T 添加文件到工程目录 3 _: c1 p M/ _ # g$ V1 M! H& C$ K. A$ T: Y 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。 ! g: t- i8 \; j; x/ @ 添加包含路径 w. } _ I: S, H2 F添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。 # E7 Z# g/ j* Y. g1 B 头文件路径 $ d- Y+ Q. e' d9 k 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。 " P8 ?! q2 q& x6 h7 v 预处理符号 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。 & w% Q- J5 F- W! |# O$ k 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。 删除不需要的文件 0 J% w; T$ y2 X" ^# t" G% ~) r, y. {* G/ y 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。 6 i0 Z9 [) Y4 c( D6 P% U4 B 排除文件夹 ) u4 v8 {- q$ ?/ @; a, E# ?! h6 v4 g* B% |" G; e 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。 & k, B4 M& ]* z+ t, u' G0 P0 L 9 n; o/ W4 ?8 z9 l6 ~1 g 排除文件夹选项 1 s6 u% q& U) }% Z8 }/ E + u2 x$ ` S$ B 注意到这时候被排除的文件就会有特别的标志显示。 ! h8 y/ @* S+ w/ J$ w' S! [; { 排除的文件夹 X( H5 |" \2 b$ |6 S , A1 I" I. S& a* {, |: t5 B 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。* A* @0 I4 J& c. r: Q- r / G: y6 {9 Z2 c3 g, b! u" {- G Core文件夹对比 7 z0 `+ V: g6 R: D. x: L+ B3 f- |5 U5 [& x. _; A0 m% \+ T Drivers下第一级目录,没使用到的全部删除。' }& a& A; X$ n8 R/ v5 k Drivers文件夹对比 CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。" P3 {* V7 n0 R% q 6 J/ \* a9 T) J5 ~ CMSIS文件夹对比 5 f @* J% Y2 ?, R; z' a9 `# E5 \" U2 B$ e/ ? \3 @3 n STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。 HAL Driver文件夹 ! M3 F$ j3 z9 g: L$ t/ V3 R# c* t6 O$ f- I 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。7 n* R9 x/ d+ T( F. u( k# z( { : I# P- n) q8 N# X4 M y STM32CubeIDE编译通过 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。9 o- v; i f( f% G7 a& K! U " m' i+ J$ c" s* h) l1 c Keil编译 , h/ G% w$ h2 D! E: L: C5 Q1 B3 ]1 j# R; x7 c) w 如果需要调整优化等级,则可以再下图所示位置调整。* w/ @, k/ p( _+ i5 W 8 [+ h: d9 e& A 调整优化等级 " t+ k$ a$ q; j' d) n0 V* i 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。: o# L! I* |9 T/ C 7 s9 N$ E. F/ R% N Linked Resources设置为相对路径 & L1 ~* c: u+ v3 G0 [( E3 X6 F9 L# s 2 \; W0 j& w& _8 ^( s1 j, Y 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。 ! A& F$ t6 R1 o* z# J9 ?' k S : L1 _5 _, O" L/ e* u7 c Id文件路径 ' z" c9 R) _, K8 B1 d4 H7 o+ r7 E, E - G" u- P+ j2 I. b 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。$ X; K% D0 V! _( m ; }' I' k0 n( Z4 y* p, R9 E9 L! A 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。 ( {0 T% t% ]6 Y& v5 _( d 针对一个相同名称的工程问题,工程取名时最好也有些讲究。3 ^" x+ p' @- q) J7 n ( b) r2 }9 s; Y, z! w9 R( K9 E: L 0 s: Z( c6 U/ S1 j, d/ w$ K 编译后文件夹内容 6 r7 p6 s5 C* _4 _! }8 o- E- C9 U7 c$ R' N" b* f 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 |
【经验分享】HRTIMER 多种 Fault 事件联动机制
Windows+VS Code+EIDE+STM32+gcc编程环境搭建
基于STM32上NanoEdgeAIStudio经验分享
基于STM32的快速傅里叶变换经验分享
基于STM32的硬件和软件IIC区别经验分享
基于STM3利用GPIO翻转模拟串口进行重定向经验分享
基于STM32中GPIO四种模式经验分享
基于STM32利用傅里叶反变换进行数字滤波经验分享
基于STM32用机器学习实现心率异常检测经验分享
基于STM32上的机器学习实例经验分享