EIDE with VS Code

本文主要是将 在KEIL上能够成功编译的 STM32F103VE 芯片项目转移到 VS Code 的 EIDE 插件中,主要是针对 Keil MDK-ARM 中的 Option 进行参数复制,即 EIDE 的配置。

需要以下两个工具:

  • Keil MDK-ARM
  • Keil.STM32F1xx_DFP.2.4.0.pack

其实还是依托于 Keil MDK-ARM ,只是换了 VS Code 的皮。

EIDE INSTALL

首先需要在 VS Code 中安装 Embedded IDE(如下),官方手册:EIDE在线文档

image-20220414214014581

EIDE CONFIGURATION

对 EIDE 的配置主要包括 扩展设置芯片支持包安装构建参数设置项目属性设置

image-20220414211312253

扩展设置

可以在 VS Code 的插件中选中 Embedded IDE ,在齿轮状设置图标菜单里选择 扩展设置,在里面配置好编译工具链的路径还有一些可设置选项。

image-20220414203531929

STM32 可以用 ARM CC 和 ARM GCC 进行编译,具体需要看芯片要求,Keil 的话用的是 ARM CC 5版本或者 ARM CC 6 版本。

可以到 Keil MDK-ARM 的安装路径下进行查看,例如 在 D:\Keil_v5\ARM\ARMCC\bin 中,选择右键 用 Powershell 打开,然后输入 ./armcc.exe 即可查看版本号。

image-20220414183859215

主要配置六个参数即可,需要根据本地的 Keil 安装路径来进行设置(不要盲目复制粘贴)。

image-20220414203709473

image-20220414203744037

芯片支持包安装

Keil 的芯片支持包主要看 Option -> Target 下的 STM32F103xx.svd

image-20220414194711199

通过本地搜索可以看到这个文件需要通过安装 .pack 扩展包得到。

image-20220414190916865

MDK5 Software Packs (keil.com) 中搜索对应芯片的扩展包,如 Keil.STM32F1xx_DFP.2.4.0.pack

image-20220414193428926

点击 芯片支持包 右侧的 加号,即可选择通过 在线安装(From Repo) 或者 离线安装(From Disk)。

image-20220414212238565
image-20220414212220319

安装完扩展包之后 再点击下图中的加号,输入芯片型号进行进一步选择。

image-20220414191124478

即可查看芯片的大致信息:

image-20220414190706840

构建参数设置

构建参数的依据是 Keil 中的这几个参数选项卡:

image-20220414212732414

方法:

  1. 提取 Keil 中的构建参数 (如下 C/C++ 参数设置)
  2. 提取 EIDE 中的构建参数
  3. 对比差异,以 Keil 为准对 EIDE 进行增删

C/C++ 参数设置

下方是 Keil 中对 C/C++ 的构建参数管理页面:

image-20220414200627162

以下是从 Keil MD5 的 Option 中扒下来的编译参数,即最后一行的 Compiler Control String

1
2
3
4
5
6
-c --cpu Cortex-M3 -D__MICROLIB -g -O3 --apcs=interwork --split_sections -I include -I ../ -I ../../../Libraries/CMSIS/CM3/CoreSupport -I ../../../Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x -I ../../../Libraries/STM32F10x_StdPeriph_Driver/inc -I ../../../Utilities/STM32_EVAL -I ../../../Utilities/STM32_EVAL/STM3210B_EVAL -I ../../../Utilities/STM32_EVAL/Common -I ../../STM32F10x_StdPeriph_Template -I ../MDK-ARM
-IF:/Workspace/xiwang_production_test_embedded/Project/STM32F10x_StdPeriph_Template/MDK-ARM/RTE/_STM3210B-EVAL
-ID:/Keil_v5/ARM/PACK/ARM/CMSIS/5.0.0/CMSIS/Include
-ID:/Keil_v5/ARM/PACK/Keil/STM32F1xx_DFP/2.4.0/Device/Include
-D__UVISION_VERSION="522" -D_RTE_ -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD -DUSE_STM3210B_EVAL
-o .\build\STM3210B-EVAL\*.o --omf_browse .\build\STM3210B-EVAL\*.crf --depend .\build\STM3210B-EVAL\*.d

以下是从 EIDE 中扒下来的编译命令:

1
2
3
4
5
6
7
8
9
10
11
......

C command line (armcc):

-c --apcs=interwork --cpu Cortex-M3 --li --c99 -D__MICROLIB -O0 --split_sections --diag_suppress=1 --diag_suppress=1295 -g -I.\.. -I.\..\..\..\Libraries\CMSIS\CM3\CoreSupport -I.\..\..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -I.\..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\..\..\..\Utilities\STM32_EVAL -I.\..\..\..\Utilities\STM32_EVAL\STM32100E_EVAL -I.\..\..\..\Utilities\STM32_EVAL\Common -I.\.cmsis\dsp_lib -I.\.cmsis\include -I.\RTE\_STM32100E-EVAL -I.\.eide\deps -I.\include -I.\.eide\deps -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD_VL -DUSE_STM32100E_EVAL -DGD32F10X_HD

CPP command line (armcc):

-c --cpp --apcs=interwork --cpu Cortex-M3 --li -D__MICROLIB -O0 --split_sections --diag_suppress=1 --diag_suppress=1295 -g -I.\.. -I.\..\..\..\Libraries\CMSIS\CM3\CoreSupport -I.\..\..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -I.\..\..\..\Libraries\STM32F10x_StdPeriph_Driver\inc -I.\..\..\..\Utilities\STM32_EVAL -I.\..\..\..\Utilities\STM32_EVAL\STM32100E_EVAL -I.\..\..\..\Utilities\STM32_EVAL\Common -I.\.cmsis\dsp_lib -I.\.cmsis\include -I.\RTE\_STM32100E-EVAL -I.\.eide\deps -I.\include -I.\.eide\deps -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD_VL -DUSE_STM32100E_EVAL -DGD32F10X_HD

......

EIDE 中查看编译命令的方法:项目名称右键点击 查看生成的编译器命令行 即可。

image-20220414194229852

互相比对二者之间的编译参数差异,发现以下差异:

  1. Keil 中的代码优化等级为 3 即参数 -O3 ,而 EIDE 中为 0 即参数 -O0
  2. EIDE 比 Kei多了几个参数 --diag_suppress=1 --diag_suppress=1295 ,需要删除。

ASM 和 Linker 参数设置

对比过 Keil 的参数之后,保持如下设置:

image-20220414213239217
image-20220414213257541

项目属性设置

包含路径设置

这个就不多说了。

需要注意的是,RTE路径下的 STM32xxx-EVAL 一定要是正确的,可以多,不要少。

image-20220414213503962

预处理定义

从 EIDE 导入 Keil 项目时,可能回设置很多不需要或者错误的 预处理定义(宏定义),需要跟 Keil 保持一致。

image-20220414213732758

image-20220414195358900

DEBUG RECORDS

EXPECTED A }

提示 少了 } ,该文件是官方文件,应该不会错。经过检查,发现是宏定义过多导致的错误,修改过 预处理定义 中的宏定义设置就解决了。

image-20220414190748098

如下,STM32F10X_HDSTM32F10X_HD_VL 冲突了。

image-20220414194044509

最后,编译结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
[ INFO ] start building at 2022-04-14 20:22:39

[ TOOL ] ARM Compiler 5.06 update 4 (build 422)

[ INFO ] file statistics (rebuild mode)

+---------+-----------+-----------+-----------+--------+
| C Files | Cpp Files | Asm Files | Lib Files | Totals |
+---------+-----------+-----------+-----------+--------+
| 46 | 0 | 1 | 0 | 47 |
+---------+-----------+-----------+-----------+--------+

[ INFO ] start compilation (jobs: 4) ...

>> [ 2%] CC '../../../Libraries/CMSIS/CM3/CoreSupport/core_cm3.c'
>> [ 4%] CC 'main.c'
>> [ 6%] CC '../../../Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c'
>> [ 8%] CC '../../../Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c'
......
>> [ 89%] CC 'source/stm32f10x_it.c'
>> [ 91%] CC '../../../Utilities/STM32_EVAL/STM32100E_EVAL/stm32100e_eval_lcd.c'
>> [ 93%] CC 'source/system_stm32f10x.c'
>> [ 95%] CC '../../../Utilities/STM32_EVAL/stm32_eval.c'
>> [ 97%] CC 'source/write.c'
>> [100%] AS '../../../Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/arm/startup_stm32f10x_hd_vl.s'

[ INFO ] start linking ...

Program Size: Code=9028 RO-data=340 RW-data=156 ZI-data=1412

Total RO Size (Code + RO Data) 9368 ( 9.15kB)
Total RW Size (RW Data + ZI Data) 1568 ( 1.53kB)
Total ROM Size (Code + RO Data + RW Data) 9524 ( 9.30kB)

RAM : [ ] 2.4% 1.5KB/64.0KB
FLASH: [ ] 1.8% 9.3KB/512.0KB

[ INFO ] start outputting file ...

>> output hex file [done]

file path: "build/STM32100E-EVAL/FT_Test.hex"

>> output s19 file [done]

file path: "build/STM32100E-EVAL/FT_Test.s19"

>> output bin file [done]

file path: "build/STM32100E-EVAL/FT_Test.bin"

[ DONE ] build successfully !, elapsed time 0:0:9

[ INFO ] run tasks after build ...

>> axf to elf [done]