STM32开发之 VSCode+gcc环境编译
# _( c- J) E4 r" j( r& U+ O2 j& }' y4 S$ C
一、程序安装
' ?. h: p+ ]5 F, }1、VSCode:https://code.visualstudio.com/Download
) i* o$ G$ ~9 P5 x- G3 G好用到爆的文本编辑器,配合强大的插件,使你的开发效率大大提高。
: s! r% g0 @2 b. N+ z+ i: r2、Java:https://www.java.com/zh-CN/download/& I$ M. B p4 z
STM32CubeMX的安装需要 JAVA运行环境(jre)。
' G& i$ v$ l' T" \; F3、STM32CubeMX:https://my.st.com/content/my_st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
" W) l/ y: ~" E% |' C支持最新的 HAL库及 LL库,工程代码配置与生成工具,支持生成 IAR、Keil、STM32CubeIDE、Makefile等工程,这里使用其生成的 Makefile工程。
1 k/ M) Z" F, h. ]; S, \+ O* N; T' r( W4、MinGW-w64:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/; S. M3 N* W' i J6 V( o
一个强大并实用的 C/C++ 编译器。安装完成后需要添加系统环境变量,可以利用 cmd命令:gcc -v测试。
! p2 E$ v5 G# y# |. N5、arm-none-eabi-gcc:https://launchpad.net/gcc-arm-embedded/+download
2 y% e, c9 K9 M9 Y' Y2 MGUN的 arm的通用交叉编译链工具,基本上常用的 arm处理器均支持。同样的,安装完成后需要添加系统环境变量,可以利用 cmd命令:arm-none-eabi-gcc -v测试。+ j) @7 o; u6 N6 G
6 T+ q3 V; g0 b3 E8 O' I) @. t( g, D' N
二、CubeMX工程生成. U, Q9 t# c4 r, s0 m
目前 STM32现在主推的库是 HAL库,当然还有个 LL库用于操作底层寄存器;对于 HAL库,官方专门推出了图形化软件 CubeMX来简化 HAL库下 STM32的初始化代码;我们只需要配置好相应的外设功能以及时钟树,点击生成代码,CubeMX便会生成相应工程文件,并且还支持多种 IDE工具,实乃居家旅行出门必备啊。咳,偏题!8 ?: e' s( y2 x+ x
首先,选择你的目标芯片,启动工程配置,这里就简单的弄个 LED控制跟 DEBUG配置。
3 O3 c7 }' ~$ ]/ M串口配置就像下图那样,像我们平常一样,异步通讯,Baud rate:115200、8Bit、1Stop Bit9 s) ~' L8 t7 m0 B
4 g" T2 h' j1 \3 f
接着就配置 LED IO引脚,直接点击对应引脚进行配置,如下图所示:" R) O. @3 |; v* d3 J& y' L
, Y' A/ m4 B2 T4 v7 d8 b( T 这软件怎么用在这里就不多赘述了,还有就是稍微注意一下:* ]8 P5 b4 X" T ^. {+ S
如果要使用 STLink等在线调试器,那么需要在下图的指示处选择你所需要调试方式:* Q! u6 Y# ~/ x- F
. P3 P) g4 p6 K
对于时钟树,像我们一般是有使用 HSE高速外部晶振,那么你就需要在 RCC那里打开相应的配置:
5 M) M# g5 |. ]. z2 ^
" h+ X% @. ?/ G. l& A1 Q 接着在时钟配置那里配置相应的外设时钟:
# r9 c: n% u5 `* ]
6 f$ ]. p* T8 K
最后,由于我们是想要在 VSCode上开发,就直接选择生成 Makefile就可以了。需要特别说明的是,这一步并不是必须的,完全可以不用 CubeMX,自己写 Makefile也是可以的。然后输出生成工程文件。
9 X" `& _ I8 g/ {' f! y/ ^; O* M
% P4 V! A6 S6 Q1 X+ B% n, m
三、VSCode环境部署
+ N. r @+ w* F' w2 t5 q* z6 ~
! \. a. O" W/ [# D1 p8 E4 t( D! h
7 W& w- F! L8 T! s8 h! _' I q1、插件安装
% P! z4 a" q V l) e$ w
/ d! h( F) y* S1 ^" b2 H4 Q5 O
2、配置 VS Code
0 m" ?/ P2 Y$ K8 ]" t首先,把从 STM32CubeMX创建出来的工程导入到 VS Code里面,得到:
2 w; S, I8 L; P h) @1 N
; p- f9 r+ h2 ^+ i
默认情况下,工程中是不含 .vscode 的文件夹的,通过操作以下三种方式时会自动创建:" w( n6 G- j9 d) T5 V1 o3 U( X( Q
打开命令窗口进行编辑配置(Ctrl+Shitf+P > Edit Configurations(JSON))
6 \) i# R& V% Z7 }- d
$ G8 i; g4 ^% ^0 }
或点击窗口栏的 终端 -> 配置任务 -> 使用模板创建 task.json -> Other
; I$ K1 L! g ]/ { {+ w* a9 L, p* Y
% ]: N4 ]3 v' l* P9 N5 H9 ^; k
或修改工作区里的 settings.json文件(窗口File--Preferences--Settings--Features--Terminal 的 Terminal > Integrated > Automation Shell: Windows栏中进行编辑)
0 L" G: `! s3 k. b X
8 |5 I, T5 g5 K- u& F# a& m' @* k 这三个创建出来的效果如下:
: \& d6 f5 K! _
, X+ h9 x0 U$ w, ^9 n
先说前面两个文件:
2 q2 M8 u* Z( q% \c_cpp_properties.json' |& H( u; }- k* v% g" K. s* e2 M
主要有添加 include路径,编译器路径,宏定义等;设置好后,索引、编译就跟 keil一样方便。然后,它的配置修改如下:
" s/ H* y4 n1 Y1 r4 F/ n9 e9 u- {
$ `3 z& f$ i% _) P( I - "configurations": [0 d& M( L( _$ ~$ y' e+ ~. o. y
- {
+ F- W, @/ h. `$ d2 K5 j$ ^ - "name": "STM32",// 创建一个名为"STM32"的配置
) {/ y1 Y8 r& `) r. i - "includePath": [// 声明这个工作区的 C/C++工程包含了哪些头文件目录
! `, W" e: B. x - "${workspaceFolder}/**",
' \( s( _' V* s6 x - "${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32L1xx/Include",: v. t2 l! c* f- [) d+ }: C
- "${workspaceFolder}/Drivers/CMSIS/Include",
+ t: P+ U0 H% P# F: \ - "${workspaceFolder}/Drivers/STM32L1xx_HAL_Driver/Inc",
# x& N# W3 D+ C5 N - "${workspaceFolder}/Drivers/STM32L1xx_HAL_Driver/Inc/Legacy",* j4 _4 Q4 }# Y
- "${workspaceFolder}/Core/Inc"
# j7 A8 F3 m4 i) O- y5 x - ],
' n6 N, f8 M. F6 f6 U% z% J! Q( H - "defines": [// 全局的预处理宏定义
1 G, V; A( B. F# j - "STM32L151xB",
d8 C- ^- l/ c- j" @ a& v/ F' } - "USE_HAL_DRIVER": A3 X# O% S* _; @
- ],
4 k- \' h& ]& {4 R" R M/ D- `' {6 ] - "compilerPath": "gcc.exe",// 如果添加了环境变量,可以像这样表示;否则就得加绝对路径,如:C:\\Program Files\\mingw64\\bin\\gcc.exe
3 B7 R. }% j# {8 s8 c6 c; ~; r+ ^ - "cStandard": "c11",// 使用的 C标准
; c& n5 {) M: y - "cppStandard": "c++17",// 使用的 C++标准" M0 @$ b& {* Y. }# t, U; f
- "intelliSenseMode": "gcc-x64"// 语言风格5 [/ @2 F! |# o2 v
- }
: f+ S! O, A( W( | - ],
9 J8 Y, Q- I: Q9 X - "version": 4
) u$ w( X" R1 v: j! e5 l - }
复制代码 2 ]/ K/ o7 _% p! z N( {
$ |6 y# v- l1 w" F7 S N8 H2 O注意:这个 json不允许有注释,所以,如果是像复制到你的文件里,记得把注释删了。, W* x# h7 V5 M/ C
tasks.json: I; a- u- e( r) F( [
这个文件下 tasks 数组里的每一个对象都代表着一个任务。$ p! ]3 i9 s& d& D3 W3 f8 Z
- <font size="3">{- E: Q+ M2 P( C* u; H, y/ k
- // See https://go.microsoft.com/fwlink/?LinkId=733558- A9 O/ Z. T; N+ P
- // for the documentation about the tasks.json format
1 }. f# [3 D9 u" O' N# j o - "version": "2.0.0",, I9 e1 J: K, I8 ?* P! t
- "tasks": [
, ~2 g5 s1 L" ? o; \9 n - {
4 q. H- y8 B( Z& R4 v' J5 a9 J7 V8 i - "label": "Build",// 标签名
s6 q [! L0 m9 g - "type": "shell",// 终端(shell)型的任务
& @3 c1 H; ]# ^: j/ m# ~ - "command": "make",// *执行的命令
# U) G" |" u# W2 X# ^! C4 ^( F. N - "args": [// 命令的参数
" s6 S6 ?& f* b; T5 M" ~ - "-j6"// 表示六线程同时编译
3 O) N( @ P8 k1 R - ],; {, |$ N- r7 G1 u) Q& M
- "problemMatcher": ["$gcc"],// 表示如果出现了编译报错,问题面板会显示 gcc类型的错误
- ^) R$ o7 Q1 K. C - "group": {
. \' r( o' N. X; r/ z! w% S - "kind": "build",$ W% v. h2 D) y4 l6 S% Y$ M
- "isDefault": true
9 b0 [! Y7 ?+ H1 |( P0 q0 \ - }
% R# u8 R9 c$ V - }
4 B( P9 O2 t) R" o2 l- k9 y - ], M& s' k% o& ~ B4 A' D- v
- }</font>
复制代码 ( x# l& }5 G# j/ q4 n
5 ? |( ~0 V4 s, \6 z$ C3 |
注意:上面的 "command"选项中填的是 "make";实际上,在我们下载的 MinGW-w64编译器中,执行的是 mingw32-make.exe;但是,这里可以看到 mingw32-make.exe 文件名太长,并且不好记,因此我们可以将其复制并重命名为 make.exe 这样就与 Linux下的 make命令保持一致了;如果没有像前面说的那样复制出 make.exe,那么,在 "command"选项中填则是 "mingw32-make",同样的在执行编译操作时,键入的命令则是 mingw32-make。- A: h& G7 k8 C2 Z) k* W2 }
settings.json
, _5 d6 Y$ A$ _+ c这个留着后面结合实例来说。
. ^, o u- ^: l; ]# E E6 g2 E" g$ p, g5 w; P' U
/ ]( t- K- E+ C2 k/ ?6 o
四、工程编译% N# O$ X: c. s- {8 f
当你配置完成上面的操作后,最最最好就是先保存所有文件,然后关闭 VS Code,再重新打开工程。
% E- f2 c9 B' W, P编译有两种: T; D# Z# L6 P& y0 U
1、点击窗口栏的 终端 -> 运行生成任务(快捷键 Ctrl+Shitf+B)! M2 t/ F, s7 c. o' K' H
, M& [5 C: X. w, \$ S3 b+ G% w7 V. K 2、点击窗口栏的 终端 -> 新终端,选择 cmd
, B- O2 \1 c2 q6 n0 I$ P
5 H' I0 n% k% \6 r7 _) ]" u
没有的话,那就点击一下它,然后点 “选择默认 Shell”,再点击旁边的垃圾桶,再重新打开一下。* _6 e. Z; ?5 b! [% S( @
键入 make,最后按回车键。当编译完成后就会像下图这样显示编译文件大小:; n' H3 P6 g b2 w' z$ `; k+ y
3 I! t" e: c- o9 K1 U
五、编译清除
2 ]3 @0 {& \2 z& @编译文件清除,只需要在终端命令台里键入 make clean就可以了,但是,但是,如果使用的是 cmd的shell,你会发现:: l1 Q! L) {( p1 V' |' U: J# A
并没有清除掉编译出来的文件。这是为什么呢?可以在这里得到答案:https://github.com/STAT545-UBC/Discussion/issues/55
2 |) A" \4 y! \5 H$ e9 F" V4 [" M- ^根据里面的描述可以总结为:, T" U V7 x/ i% M
解决方法1:使用 Windows版本的 rm是 del,因此可以简单地用 rm替换成 del。但是要注意,这样做意味着您将无法使用 Git Bash shell,因为它不支持 del命令程序;
$ D3 W3 g; J! r- d& n$ L& E1 f4 V7 c解决方案2:假设你已安装 Git Bash(没有那就安装 Git呗,都 0202了,不会还有人不用 Git吧,实在实在不想用 Git,那么就找个支持 rm的终端命令台,例如:msys2),那么你可以把终端命令台切换到 Bash上面
2 ]$ ^8 }: [* o5 X, m- I第一个就简单了,在 makefile里把 rm替换成 del,如下图所示:
# j9 V) g: ~* J5 ]
, ^- f: J& \$ a9 }# u 第二个,就像上面那样重新点击 “选择默认 Shell”,然后选择 Git bash
8 t) L* Q) { J, M/ L& y2 G
" l/ k* }5 a* C. K k+ a5 t1 S- N , O6 s! ]8 n( e$ I; p# k9 y2 D- U+ `% W
3 ^6 t( f( e: s D: X
然后,用这种操作去修改终端 Sell,不同项目对于选择不同的终端,有时候需要经常切换,不方便;那么就有了工作区 settings.json文件配置的作用了。# r) p" y( P$ p- N
在 settings.json文件中,我们只需要配置如下操作:
/ K% r3 `& }$ `* ^* w( s, E- {+ ]+ U3 G' r* W* _2 z9 ]" t6 N
- /* 终端在Windows上使用的shell的路径 */
' B1 F3 U+ |; d0 L. i - "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",// 如果添加了环境变量可以去掉路径9 l! }% ^! D( V" C3 c
- "terminal.external.windowsExec": "C:\\Program Files\\Git\\bin\\bash.exe"// 与上面同理
' s" f! n* C+ S7 d5 H3 a - }
复制代码
5 n& n j6 R8 a
1 ~. H5 N& G& D: ]- f- t7 J. Q0 `如此一来,那么就只在该项目工作区内产生作用效果。
2 R u* n- O4 D$ Z5 |# ^. m你看,颜色都不一样的:* Y- z! S% ~7 ?8 S, g+ c/ L
. z% Z j. p. ~8 S7 R7 ?% S/ S
; K* |4 u7 ~+ ^) n! a6 P+ d
|