STMCU小助手
发布时间:2022-8-28 22:35
|
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。8 |0 b1 i8 S6 p4 _5 n
STM32F103C8T6亮灯程序 ) a: m* g$ ~3 Z7 }" \. R# U如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。
创建工程文件夹 & {. d' G7 g' H& A. P, ZF% ^' [: Q* m( a5 ^8 q5 R9 B3 Z- B 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。& Q i: v( i/ T, Q" n3 ?, D- }
STM32CubeIDE默认生成的文件 2 e5 F. _( M" M8 R' _6 ^. u3 u/ N0 `0 d9 P5 u t; x/ H 这里简单介绍下这三个文件: ! t7 e+ O; Y7 Y, d .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。7 Y. C: [, p# V8 M3 g, F. I 0 k" S" H& \' t$ p .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。4 Z' r# K: Q; T1 L 2 x: I3 ^4 b) b. \ STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。0 l( l5 d2 ^" D4 @ ; l) J+ x: O5 m, k" U( j0 L+ \
拷贝文件到文件夹 " l/ S, X; m L3 T 8 I2 J' S# ]. ? 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。
+ I j. Y8 m9 _( Z+ H3 S( R2 p, h 删除工程 ; ~% x3 q0 Y( T: Y 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。 , @" \% v2 n# K8 R. D
/ n. p7 `! n$ `- z5 ?# G# m* e 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
+ ^3 D! c4 [( _7 x 空工程 2 D+ }$ V" c$ W* T3 y$ p/ |' W7 g! i; A0 } 9 n( [) F# i) w" } 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。 . v2 F p! R5 V$ G. K' R8 c! _
打开工程属性 6 Y0 u5 Q9 U( [( ]4 J% V & T0 O2 ?) a7 \ 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。! y; F8 T4 G8 F$ t0 Z% `& Y
3 s8 Q* v3 r$ F4 W* k0 f# R 引入文件 链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。
2 J7 B8 |# Q# t4 v 添加文件到工程目录 % @( Y5 _( d. }3 Q R在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。 " k- P5 h8 Q6 P. w
% G8 K8 L$ ]0 }' B# I 添加包含路径 ; Y9 l1 w9 G; [添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。 + x# a, w. }& R& t0 h. V* T3 \
头文件路径 ' m! e. q3 Z1 C$ A9 O# N 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。. v9 x" D9 q/ z, v! }4 d+ [ 1 ^0 Y; W' A" y) E* h
预处理符号 4 g, G8 ?- i D& C8 I1 } 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。" z. b# I) i3 s: I - D! j6 c7 [9 W9 x6 U K 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。 7 I$ r; D+ J& J! l( R# `
; o$ D* A+ I9 G5 O- [+ Z: h3 B 删除不需要的文件 4 i2 r: y7 E# `, \5 qB" U( _: B' o( p. p/ Q/ j 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。3 ^! K, g. a s5 w& f
* g8 U* A8 O# ^+ ~ 排除文件夹 ' L% p8 H* h u w* n: K$ p: }+ Z0 w0 E7 J8 {" S 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
, W- _/ ^8 r& E1 A. W( J 排除文件夹选项 . _/ Q- Z6 N8 K+ K# @注意到这时候被排除的文件就会有特别的标志显示。7 R+ h5 z c, m 2 Q7 g. \' ]& @( ^- Y6 _
: x, M& _% D4 ?* | 排除的文件夹 ' V( Z- G2 x- Y V. C: c/ y]( r8 p) o p) F C1 B 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。& N& I9 M) O9 J& R 4 Q9 X5 N6 d8 s6 [% |% _2 I
Core文件夹对比 / N3 j) n& k% T3 G! MDrivers下第一级目录,没使用到的全部删除。
/ r. ]- S0 g- m5 T! `0 U Drivers文件夹对比 5 i( n6 J. j5 D' _6 B5 W* I2 m* Z' Q: O # o0 R! }# J0 F% c CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
CMSIS文件夹对比 % N/ ~ V: ^" T3 zSTM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。 ; b! w! G& f0 I: T& Q/ `; |( P
HAL Driver文件夹 9 B; Z p' K$ x5 e: T* O3 R. b+ y1 u 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。 8 J( M0 n, z' @5 ^* B2 X. p3 ~' z
- `3 ^( a0 M, H! X- T% x( S; V STM32CubeIDE编译通过 + O$ n |) A1 i. p7 [3 ?此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
* `/ B4 [, E5 x' V Keil编译 1 J& b5 Y. J7 l$ C4 {- @8 g) ^8 w7 ^' M4 _7 W1 Y/ C0 L : B# R2 A4 g# a0 h; R7 B1 a 如果需要调整优化等级,则可以再下图所示位置调整。5 r# N6 t7 ^" w( s: L
* e) [! ?( f( K8 j 调整优化等级 5 G6 D. t+ v6 [ 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。 d* F: T1 @: z9 A! r( r1 x6 G; a
Linked Resources设置为相对路径 ; n9 f3 Z4 ]+ Z- v) I4 Z: I3 Q) y. d8 a 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
1 Y' \. _& ?, G; g& B5 V; J Id文件路径 ; F. _ P" B% A! V4 j- O 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。3 U- Y7 Z: b6 l, o ' I% W$ S S& J1 _% t7 H- ]* I% X! Y 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。 " F) I3 C: T2 u. K) d+ _ 针对一个相同名称的工程问题,工程取名时最好也有些讲究。
编译后文件夹内容 % N7 |) ~" i# N$ Y- |& n) Q/ A3 j z" f4 X8 k& Z3 | 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 9 x" J& h$ j# L$ D2 E& T: v& ^ 作者:bili_42806779649 l- M" `6 p& J |% a # g" Z9 ?. \; l. M P9 H+ W |
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
《MCUBoot课程》学习笔记+从信任链原理到量产实践
STM32CubeIDE 2.2.0新版本发布
CubeMX生成CubeIDE工程代码乱码
STM32CubeIDE实时时钟(RTC)经验分享
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
【STM32U3 评测】人体行为识别
微信公众号
手机版