STMCU小助手
发布时间:2022-8-28 22:35
|
对于初学者来说,刚开始学习STM32时候都使用的是Keil,很多项目都是在Keil环境下编译和调试的,这一章将描述如何将Keil工程迁移到STM32CubeIDE中。 ( l# e3 e; ~6 u/ @1 o: H% n 对照Keil下的新建工程步骤,创建工程、引入工程文件、添加预处理指令、添加头文件包含路径等步骤,STM32CubeIDE中也大同小异。 为了便于说明,我用STM32CubeMX生成了一个Keil5环境下的STM32F103C8T6亮灯程序,然后将其迁移到STM32CubeIDE中。* H0 H" b- ?: [4 k4 k9 c
% t1 [ W4 _- Q! H; I6 @ STM32F103C8T6亮灯程序 ' z! w5 |$ l& J: k" d7 n$ [4 Z2 b I" x. s) `9 v/ ^6 b4 c 1 D# M7 H; w! p3 ], d1 V 如图所示,该文件夹内容是STM32CubeMX自动生成的,我们在该路径下面创建一个STM32CubeIDE_Test文件夹,用来存放STM32CubeIDE相关工程文件。3 L* k3 E% {& ?
- z0 ]0 {9 j# J& `# s2 U7 |1 P 创建工程文件夹 - z7 r) W1 N5 J4 W6 P, O3 I8 `8 R+ a9 v. a' A& w- V; l8 d 参照上一章,先使用STM32CubeIDE创建一个STM32F103C8T6的工程,STM32CubeIDE的Workspace中的这三个文件就是我们需要的,这三个文件记录了STM32F103C8T6芯片的一些相关信息,我们可以直接拿来用,很方便。将其拷贝到上面在STM32CubeMX中创建的文件夹内。
STM32CubeIDE默认生成的文件 这里简单介绍下这三个文件: .cproject : 该文件是CDT插件的工程描述,CDT是Eclipse 的 C/C++ 开发工具。 ( Z% `. p, h" L8 j: r3 h9 I% G .project: 该文件是Eclipse的工程描述,毕竟STM32CubeIDE就是基于Eclipse的。 7 v7 c+ q+ H K. ]6 j STM32F103C8TX_FLASH.ld :该文件定义了程序入口地址,定义Flash、RAM中代码和数据的存放位置,将来搞Bootloader的时候就可以在这文件里面修改代码存放的起始地址。 K$ `$ ]4 F: c5 Z7 X
拷贝文件到文件夹 7 V0 b# [; ]' i, k% e/ R( e( ]- ~. Y) p 然后删除STM32CubeIDE中刚刚创建的工程,因为STM32CubeIDE只能存在一个相同名称的工程。在工程名上右键然后Delete,软件会提示是否删除硬盘上的数据,这里我们先不删除。6 o6 l# S8 M7 ` 6 C2 ?! A+ w; t4 t4 S
删除工程 a3 k1 [: X; p 进入我们在STM32CubeMX下创建的文件夹,点击.project,稍微等待一下就可以看到STM32CubeIDE已经导入了该工程。$ z7 z5 H- X) W0 j
导入工程 STM32CubeIDE默认会加载和工程文件同一路径下的所有文件,这时候工程里面全是空的,我们只能看见刚刚三个文件中的STM32F103C8TX_FLASH.Id文件,我们需要做一些操作。" W+ Q2 r" d" ?. ]
, ^. |+ B6 L2 X7 Y% z X% j9 Q 空工程 像Keil一样,我们先将工程文件引入进来,如图所示,先选中工程,然后打开工程属性。" S& Z. l1 Y6 R% d " ]) \- W7 x/ {* o& U7 I, Q: ~
+ _% Y0 }& p# o' G! C' l5 g 打开工程属性 # k6 o6 b0 @4 y( ]4 D2 N 依次按下图所示步骤,将Core文件夹和Drivers文件夹链接到工程中,这两个文件夹存放了STM32的相关代码,而MDK-ARM主要存放了Keil5的相关工程文件,我们不链接。需要注意的是,链接路径里不能再次包含工程文件,如果这里我们直接链接这个目录的上层文件夹目录的话,将不能链接。$ E& e6 `' ]4 ?) L1 h- v2 K }. }4 z ) T$ l/ |* F% S1 g% f) \. `
$ @% ?- p4 H9 {; U4 l 引入文件 链接信息确认退出后就能在右侧看到引入的工程文件吗,而且外链的文件夹下面有个小箭头区分。. T2 t( R. L' R7 ]: e5 [: |# M ( w: F+ x: M# p; o' f% p& B
, _3 O9 H* W$ c1 X 添加文件到工程目录 . U; A6 W0 z9 u; Z: c 在Keil中,我们需要设置头文件包含路径,在STM32CubeIDE中也一样,注意这张图里已有的是上一个工程自带的,我们把全部删除后再添加。4 X# x1 A i+ O! p! \ 3 S0 \5 D8 t" F* q
添加包含路径 ) y6 H4 c% p* G# h; m4 s/ ]" L6 @* n. y4 l8 i : w9 p" |& L+ k, j% A: J 添加完成后如下图所示,主要为HAL库的头文件、ARM内核的头文件。 J- }2 L3 E; |. [
头文件路径 5 q1 D5 R6 U; r4 v7 Y- A+ p! A7 o& c: i/ _5 ^; c 添加预处理符号,在Keil5中也有该设置,声明一些全局的宏定义,主要是给HAL库使用,这里创建工程的时候已经包含了所需要的USE_HAL_DRIVER和STM32F103xB两个关键预处理,如果还有别的预处理,在此处新增即可。. U& \9 [: k' u* y- Y+ T 6 y( e# U! w5 i
8 U# t! h0 h( I6 ~0 N 预处理符号 此时可以尝试编译一下,毫不意外,会有很多报错,由于STM32CubeIDE的特性,会将文件夹下所有的文件引入进来,而有一些不是我们需要的,这些不需要的文件都进行了编译,当然会报很多错误,我们可以通过删除不需要的文件或者排除文件在工程外两种方式,去掉不需要的文件。, H# F7 D( v; X& ^+ Y 第一种是删除,例如下图这些文件,都是STM32CubeMX多余生成的,此处无用,直接右键删除。此处删除将会直接删除硬盘上的文件,谨记。8 X3 u7 E' a2 } 7 Y3 Z/ E% R' T- z3 S- J: ~; w( l
删除不需要的文件 A, _" _5 w' D4 i* ?- ~. P& y: }' H' X O" f8 `6 L 3 X- N- L1 [1 w+ d, c 而对于一些其他文件,例如下图中STM32CubeMX生成的不同编译器下的汇编启动文件,如果我们要实现Keil5和STM32CubeIDE都可以编译的话,则不能删除,我们可以将不需要的文件排除在工程外。如下图所示,对着文件夹或者文件右键。' r0 w4 t4 L; t& v% b0 ^# m3 w * V0 F2 f2 @. x
( R( D) C Z. g% [9 A" @$ C! z 排除文件夹 @1 A4 L& h9 Y1 m7 K; V X然后在弹出的窗口全选,也可以用该方法来切换不同配置下工程编译包含文件,此处的Debug和Release就是两个不同的配置。
排除文件夹选项 . I: n- n+ {8 B& J* Y- x# K 注意到这时候被排除的文件就会有特别的标志显示。
) H! h0 s, y q8 X6 Z0 w: C 排除的文件夹 & r' K2 }# j. n- R1 E/ D& }9 {) h6 x3 m O8 M7 C; X * o4 \: F0 N: F& t) \ 为了便于说明,对比删除和排除后目录差异。,Core文件夹下删除了system_stm32f1xx.c,该文件在Drivers文件夹下也有一份,两者只能存在一份,否则编译器会报错,也可以保留Core文件夹下的,看个人习惯。' y& |9 H. B; ]0 e 4 ^2 y4 }: @; p E6 e
Core文件夹对比 $ R( k4 o8 K! K: ^' i Drivers下第一级目录,没使用到的全部删除。. b: Y9 ~7 |1 n/ | 8 [+ U4 d* t4 j4 q0 k; y0 k; F
Drivers文件夹对比 1 ? }1 l; t1 c1 J- Z/ @2 j0 F) M* P: m4 l. T7 A+ x- r/ ? CMSIS文件夹下,删除了Core文件夹下的Template,删除了其他系列芯片的启动文件和.h文件。而Keil使用的汇编文件存放路径arm,IAR使用的汇编文件存放路径iar,则将其排除。
CMSIS文件夹对比 * C( s7 r$ u* {8 o4 M6 E1 RSTM32F1xx_HAL_Driver文件夹,Inc文件不用动,因为都是.h文件,Src文件夹下除了使用下图所示使用到的HAL文件,其他全部排除。
/ p1 y. \0 B, p HAL Driver文件夹 3 Y+ ^4 ^. E8 t+ K1 Q 经过以上步骤,此时再尝试编译,编译通过,生成了Debug文件夹,参照上一章内容,此时下载就可以运行。
" h9 g: s6 s$ i# X- D STM32CubeIDE编译通过 " p- w& R8 N* Q ( C9 {% d. L: O, B' m/ k 此时切回到Keil尝试编译,编译器报错找不到Core文件夹下的system_stm32f1xx.c文件,因为前面已经把他删除了,重新将Drivers文件下的system_stm32f1xx.c文件引入,此时Keil也能编译通过。
- k! S+ `/ ?. f8 \; q Keil编译 8 r! y8 e: P) N; C: O- K) G- o2 t/ ?5 j2 u& F" p 3 a3 D7 C% S/ Q' u+ q& [3 d 如果需要调整优化等级,则可以再下图所示位置调整。 ( c+ a7 D5 z( t) f# S
调整优化等级 2 R2 V+ h. V/ |# v6 \; k- _' B 除了以上内容以外,我们还需要将工程内所有路径设置成相对路径,这样才可以像Keil那样,随意将代码放到任何位置都能编译,按下图所示步骤,将路径从绝对路径转换为相对路径。0 a4 O6 b% E3 u3 M) u4 E$ s
$ v, X" R% s/ C0 T1 ~+ r/ f' Z- w Linked Resources设置为相对路径 . U& f0 l6 M& F4 {3 y; sv/ @' ^5 a' r9 k 前文提到的Id文件,此时已经是相对路径,如果不是的话也需要修改为相对路径。# o$ L- l; @) j& x& T # v8 Q1 e; C3 T
Id文件路径 ' U0 x; F) h! N# c; m8 P0 m- z0 H/ {3 c; B" B b1 o: q! b5 o- t. f8 D 查看工程文件夹内,除了最开始拷贝过来的这三个文件,其余都是编译过程中产生的文件,提交代码或者拷贝到别处时都可以删除。 额外需要注意的是,STM32CubeIDE只能存在一个相同名称的工程,所有拷贝到别处时还需要删除已有工程,只删除工程但是不删除硬盘数据,然后在别的路径下打开就可以自动导入。- z9 z4 ]5 p# E/ s2 K A& U ( l' k3 D ` e0 h2 [ 针对一个相同名称的工程问题,工程取名时最好也有些讲究。5 B, B7 x" Y9 \; P0 a 5 } b' u+ w7 H" t
编译后文件夹内容 4 e3 b" C, p. u 这样,通过外链文件夹、排除文件和设置相对路径,就可以不改变原有工程目录的情况下,将已有工程迁移到STM32CubeIDE中。 Y6 i4 m1 O+ v3 E6 m ) @; C$ M7 A( w3 j0 A+ a, y) F 作者:bili_42806779649 - U+ Z0 h; G7 u0 I0 G# u5 H: N( ~ & D" y/ U6 M# y+ ]) I( \# D 3 D& w1 m* x2 f3 H+ E1 ? |
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
【NUCLEO-C562RE】OLED 显示
保姆级教程:CMake 工程导入 STM32CubeIDE 步骤
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
微信公众号
手机版