STMCU小助手
发布时间:2022-5-19 11:20
|
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。, x8 f$ T$ u8 g: r/ Q( [ 5 V7 E8 s6 a2 e- M/ u 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。
5 i9 s9 {4 Q. s STM32F103C8T6亮灯程序 0 w1 F7 B4 n4 f9 ]' G 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。' R" M6 T) C& ^# I% A4 A
+ N* q$ {/ `$ z; c w- g- R 创建工程文件夹 * E8 {- b/ Y& J2 [5 {* W) R( D! u5 t* R* D* r6 m 6 U* T2 b) ]) y- \ 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。 8 H7 C) l: D g0 d3 `# D: K
STM32CubeIDE默认生成的文件 ' K* @6 F x" B# L5 ]# F6 J O% U8 W! ~& C7 H8 T 这里简单介绍下这三个文件: . ^; N9 }- U# h% N, l: c& Q .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 ' g5 {- m0 P$ T7 \5 y .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。 STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。 N2 ]/ g2 M+ m) K- K
拷贝文件到文件夹 & g* p+ O- r+ ~5 x 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。$ i8 M) ^) w; `/ F $ q4 V, g( d$ k; V
! r" C2 l* r( X& J( j6 y 删除工程 , h$ T+ w4 d& L 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。, V4 ^" f: ~" T9 X* ^
/ k" q: L9 P" x% V$ {! P. ^ 导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。
空工程 7 F# ^1 @: |, y 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。
" m% n' L' }. {* F* r1 w @ 打开工程属性 5 @6 T7 F7 \5 S# }. Q7 }2 s. g2 c: D' `* ?7 f( }/ | 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。 o: }3 F8 D( j2 d) z" \) B
9 Y" m4 j5 K3 p) |/ P! C6 P 引入文件 ) s- n9 n" | I$ I+ y9 j5 d2 y链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。6 h& b# g* w' i1 a; x5 F3 M8 H7 k 5 d" M5 K0 P) r' G; [/ b& y
添加文件到工程目录 - Q" c8 M9 Y: V! A 3 ?3 X7 ~- @6 C2 m* i1 S 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。5 L! Q# L$ C1 v. h
2 L9 _/ d9 f) O) k6 k# r 添加包含路径 7 b8 r e k$ k: z& A/ v添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。5 Y4 w; R; S8 F1 \% w # K; \7 H* x9 w. F
头文件路径 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。# i2 Z1 v: \$ U- V3 h6 t. y; j , Y9 v1 [) s, z& c
预处理符号 % I9 z5 c0 ^" s3 x" H! w0 b# ]6 P) S$ c+ H$ |- h5 b0 N$ L: V; y 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。4 I7 `7 e, k& C' c4 I- x# R. k ( z: i b2 ^& V% a1 D) d$ l
9 t) n* d* f4 X8 {- R5 |. [+ o 删除不需要的文件 9 i, O7 U# |" G6 G 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。2 l |5 Y. R r7 C) X G7 [ 7 L. \- }! B! `/ z
9 a/ V6 M! a- V$ E8 V a 排除文件夹 / N4 k, q+ i4 c O' ? 6 j/ E( ]9 X9 P8 g. z0 R3 Q 然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。8 s# _# N8 ~* Q+ O6 j8 t
排除文件夹选项 7 Q6 ]8 m0 z0 V K 注意到这时候被排除的文件就会有特别的标志显示。 2 n0 K2 c# R# {/ ^. r: E
排除的文件夹 * t% T: N$ i; f; T/ f 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。
8 W! [/ A |+ u Core文件夹对比 ! I- \5 M: ]) C* j Drivers下第一级目录,没使用到的全部删除。 / m+ p6 ^% e4 m- E/ a3 P
Drivers文件夹对比 + q7 F9 P) \+ o- C CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。3 P: l, d9 t! ~4 Y4 y/ Z6 a5 L
CMSIS文件夹对比 + b! _( G1 S; c2 [STM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。; Z5 S( S; u9 c! D2 I# P& x0 d
8 I8 W( ] C' t5 f' g9 P HAL Driver文件夹 + Q8 O8 L: d0 h$ `* l" c2 v, d, c0 h$ A, G 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。1 B8 h5 N( A/ \1 N! l
$ H% f- T( S6 B' B; k% b STM32CubeIDE编译通过 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。! I) l! B9 m2 {+ E3 Q 7 F f1 |* u* ?6 F5 L7 O' Q2 Q/ l
/ t" I6 g2 V6 r1 T- N) K: N0 \ Keil编译 9 I, }( q/ _+ X7 w* h: \ \ 如果需要调整优化等级,则可以再下图所示位置调整。
* |4 ^/ K& ?: o+ k. H 调整优化等级 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。1 r1 C- \% u1 G6 l ( w: S6 G4 y* ? s7 S
! G) N: w3 R8 @8 M. C Linked Resources设置为相对路径 $ u" ^/ c% [3 v: r' M, o 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。
- x2 {' j+ Y8 n( H Id文件路径 ; O5 o1 j2 l( m9 X& z查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。1 M( u+ J0 y3 ~1 p4 d s4 t ]% q2 z& n6 B9 | 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。 针对一个相同名称的工程问题,工程取名时最好也有些讲究。 8 p8 t% P2 A* w
编译后文件夹内容 6 {6 {2 V; a& |: y1 I 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 1 e0 _" P# U3 K' m ]7 [ ; W7 p, [# |& p: w l' V: | ' S4 l. z0 ^$ T6 m5 \- R2 l; R3 X |
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
【经验分享】STM32CubeIDE汉化
微信公众号
手机版